介绍
service-center
是一个nodejs客户端,其配合zookeeper来提供服务协调的功能。用户可以使用此客户端在zookeeper上方便的注册服务或者获取服务。服务注册注销和服务之间的相互调用变得非常便捷。
使用场景
经常会有这样的一些场景:
- 多个服务之间存在依赖,即服务需要调用服务。然而服务的获取往往通过配置文件得知其他服务的信息。如果被依赖服务出现问题,主动或者被迫下线,则需要手工修改配置文件或者发送系统信号的方式来通知依赖下线服务的服务。
- 同样,如果被依赖服务添加机器,调用此服务的服务也需要人工参与获得信息。
- 服务新版本上线往往无法做到完全平滑。
- 服务更新版本,重新在一些机器上布置或者以新端口方式提供服务(旧服务不下线可能是因为方便回滚或者作比较等),此时调用此服务的服务方也需要人工干预。
上述四种为常见情况,如果服务很多,相互之间的调用关系复杂,那么上述问题造成的麻烦会以指数级增长,一个失误就会引起线上的故障。怎么办?service-center
帮你搞定一切。
功能
- 将服务注册到zookeeper上:调用此服务的服务可以通过名字直接获取此服务信息,并且在获取后,如果此服务发生变化,会收到通知。
- 注销服务,服务下线:调用此服务的服务会收到相应通知。
- 获取服务:直接通过约定好的服务名字获取服务,并且此服务发生变化时会得到通知。
进阶
- 服务选择:获取服务时,除了指定服务名称,还可以指定需要获取的服务版本,提供范围控制。还可以设置获得当前服务的最新版本,无需知道服务的具体版本号。
- 心跳监测:nodejs客户端会对请求到的服务维持心跳监测。
- 版本控制:版本节点自动添加
接口
注册服务:registerService(serviceName,version,ctlInfo,serviceInfo,cb);
- serviceName:服务名称
- version:服务版本
- ctlInfo:控制信息,例如这次和zk的session的超时时间
- serviceInfo:服务信息对象
- cb:回调函数,注册完毕回调
example:
registerService('testService','1.0',
{
tm:1000,
},
{
method:'GET',
url:'1.1.1.1:80'
}
,function(err,obj){
if(err) throw new Error(err);
}
);
注销服务:unRegisterService(cb);
example:
obj.unRegisterService(function(err){
if(err) throw new Error(err);
});
获取所有服务:getServiceAll(serviceName,filter,ctlInfo,cb,w_cb);
- serviceName:服务名称
- filter:服务筛选条件
- ctlInfo:控制信息,包括session超时时间和心跳检测函数等,心跳检测函数需要用户传入,具体使用方式在下面例子中说明,如果不指定心跳检测函数,则使用默认检测方式,默认检测方式为向服务发送http请求监听响应来检查。
- cb:获取服务后的回调函数
- w_cb:获取服务发生变化后的回调函数(可以设置为false,表示不对变化做相应)
example:
var ServiceCenter = require('service-center');
ServiceCenter.getServiceAll('testServiceName',
{
version:{
min:'1.0',
max:'2.0'
},
room:'ROOM1'
},
{
tm:10000,
hbFunc:function(addr,cb){
}
}
,function(err,serviceInfos){
}
,function(err){
}
);
获取任一服务:getServiceAny(serviceName,filter,ctlInfo,cb,w_cb);
- serviceName:服务名称
- filter:服务筛选条件
- ctlInfo:和getServiceAll一样
- cb:获取服务后的回调函数
- w_cb:获取服务发生变化后的回调函数(可以设置为false,表示不对变化做相应)
example:
var ServiceCenter = require('service-center');
ServiceCenter.getServiceAny('testServiceName','0',
{
tm:10000,
hbFunc:function(addr,cb){}
}
,function(err,serviceInfo){
}
,function(err){
}
);
安装
$ npm install service-center
使用
var ServiceCenter = require('service-center');
ServiceCenter.init({
addr:'localhost:2181',
user:'',
pwd:'',
localPath:'',
root:''
checkInterval:''
});
其他的接口上述都已介绍。
测试
修改test/test_config目录中的zk地址,然后在根目录下运行make就可以进行单元测试
问题
service-center详细的使用方式可以参考test目录下单元测试,如有问题欢迎和我联系,见下面联系方式。
联系方式
yixuan.zzq@taobao.com / zzqvincent@gmail.com