UNPKG

coordinator-node-client

Version:

分布式协调服务node客户端,用于获取微服务的可用地址,参照eureka-js-client.

152 lines (150 loc) 4.4 kB
var Coordinator = require('./lib/index'); var request = require('request'); var crypto = require("crypto");//用于密码md5 var _ = require("lodash"); var appId = "auth"; var vipAddress = "vipaddress"; // 初始化协调服务中心 var client = new Coordinator({ // coordinator 服务地址 coordinator: { /* domain优先,如果设置了domain就是用domain访问coordinator; 如果未设置domain或设置为"",则需要设置ip和端口,并使用ip和端口访问coordinator */ domain: "", // host / port host: "127.0.0.1", port: 8080 }, registerSelf: false,//是否注册本服务(nodejs)到服务注册中心 token: "123",//或通过client.setToken("123")设置token; agent: { open: true,//是否使用代理,不使用代理设置为false } }); //设置日志级别 client.logger.level('debug'); /** * 测试监听 */ var addListener = function (apps) { printPaths("新增的服务", apps); } var removeListener = function (apps) { printPaths("删除的服务", apps); } var changeListener = function (apps) { printPaths("变化的服务", apps); } var printPaths = function (type, apps) { console.log(type); _.forEach(apps, function (pathes, appName) { console.log("名称=" + appName); _.forEach(pathes, function (path, key) { console.log("路径=" + path); }); console.log("\n"); }); } client.onAdded(addListener); client.onRemoved(removeListener); client.onChanged(changeListener); //启动 client.start(function (error) { console.log(error || '启动成功!'); //启动失败时直接返回。 if (error) return; /** * 应用1 */ testServerByAppId(client, appId); /** * 应用3 */ testServerByVipAddress(client, vipAddress); /* 应用5,不需要自己处理url,Coordinator内部选择可用的url, login : rest请求方法 optionalCallback:rest请求回调方法 */ console.log("自动获取url,调用登录接口"); client.getRequest().rest(appId, login, optionalCallback); //10秒后停止服务 setTimeout(function () { client.unbindAddedListener(addListener); client.unbindChangedListener(changeListener); client.unbindRemovedListener(removeListener); }, 300000); setTimeout(function () { client.stop(function () { console.log("服务停止"); }); }, 600000); }); /* 根据appid获取url */ function testServerByAppId(client, appId) { console.log("根据appid获取url "); var url = client.getServerByAppId(appId); if (url) { console.log("根据获取的url,调用登录接口"); login(url, optionalCallback); } else { optionalCallback(new Error("没有可用的服务地址")); } } /* 根据vipAddress获取url */ function testServerByVipAddress(client, vipAddress) { var url = client.getServerByVipAddress(vipAddress); if (url) { login(url, optionalCallback); } else { optionalCallback(new Error("没有可用的服务地址")); } } /** * 辅助方法,用户生成md5码。 * @param passwd * @returns {*} */ function md5Hash(passwd) { var md5Hash = crypto.createHash("md5"); md5Hash.update(passwd); return md5Hash.digest("hex"); } /** * rest请求回调方法。 * @param err * @param httpResponse * @param body */ function optionalCallback(err, httpResponse, body) { if (!err && httpResponse.statusCode == 200) { console.log('successful! body:', JSON.stringify(body)); } else { console.error('failed! statusCode:' + ( httpResponse ? httpResponse.statusCode : "") + ',body:' + JSON.stringify(body) + ',err:' + err); } } /** * 模拟rest请求——登录。 * @param serviceUrl 服务器url * @param callback 回调方法 */ function login(serviceUrl, callback) { var pws = md5Hash("123"); request.post({ url: serviceUrl + "/login", json: true, form: { client_id: "###",// client_secret: "###",// user_name: "airengin", password: pws } }, callback); }