coordinator-node-client
Version:
分布式协调服务node客户端,用于获取微服务的可用地址,参照eureka-js-client.
152 lines (150 loc) • 4.4 kB
JavaScript
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);
}