1.curator介紹
? ? curator是Netflix開源的一個zookeeper客戶端,比zookeeper自帶的客戶端使用起來容易得多
2.依賴
org.apache.curator:curator-framework:2.7.1
org.apache.curator:curator-recipes:2.7.1
org.apache.curator:curator-x-discovery:2.7.1
其中 curator-x-discovery是用于服務(wù)發(fā)現(xiàn)的專用包
?如果只是測試可以加上
org.apache.curator:curator-test:2.7.1
通過這個包可以模擬zookeeper 不需要真實(shí)的zookeeper服務(wù)也可以運(yùn)行
3.具體實(shí)現(xiàn)
? 創(chuàng)建客戶端
CuratorFramework client= CuratorFrameworkFactory.newClient("localhost:2181",newExponentialBackoffRetry(1000, 3));?
client.start();
4.創(chuàng)建服務(wù)發(fā)現(xiàn)
private static final String PATH="/discovery/example"; ? ? ? ? ? ? ? ? ? ? ? ? ? ServiceDiscovery serviceDiscovery = ServiceDiscoveryBuilder.builder(InstanceDetails.class).client(client).basePath(PATH).serializer(serializer).build();
serviceDiscovery.start();
其中PATH為服務(wù)配置所在目錄
5.服務(wù)變更通知
final ServiceCache
cache=serviceDiscovery.serviceCacheBuilder().name("s1").build();
cache.addListener(new ServiceCacheListener() {
@Override
public void stateChanged(CuratorFramework client, ConnectionState newState) {
//TODOAuto-generated method stub
}
@Override
public void cacheChanged() {
System.out.println("changed:"+cache.getInstances().size());
}
});
cache.start();
其中“s1”為服務(wù)名稱,服務(wù)配置就在這個目錄下面 。當(dāng)“s1”服務(wù)配置發(fā)送變化時(shí)cacheChanged方法將會被調(diào)用
6.生成可用服務(wù)實(shí)例
UriSpec uriSpec=new UriSpec("{scheme}://foo.com:{port}");
ServiceInstance?thisInstance = ServiceInstance.builder()
.name(serviceName)
.payload(newInstanceDetails(description))
.port((int)(65535 * Math.random()))// in a real application, you'd use a common port
.uriSpec(uriSpec)
.build();
7.添加服務(wù)實(shí)例
JsonInstanceSerializer?serializer=new JsonInstanceSerializer(InstanceDetails.class);
ServiceDiscovery?serviceDiscovery= ServiceDiscoveryBuilder.builder(InstanceDetails.class)
.client(client)
.basePath(path)
.serializer(serializer)
.thisInstance(thisInstance)
.build();
serviceDiscovery.start();
InstanceDetails 是自定義配置信息 添加服務(wù)實(shí)例代碼實(shí)際使用中在服務(wù)提供方代碼中,這樣當(dāng)服務(wù)掛掉,zookeeper中的相應(yīng)配置節(jié)點(diǎn)也會消失 并通知服務(wù)的調(diào)用方
8.查詢服務(wù)配置
try
{
CollectionserviceNames=serviceDiscovery.queryForNames();
System.out.println(serviceNames.size() +" type(s)");
for( StringserviceName:serviceNames)
{
Collection>instances=serviceDiscovery.queryForInstances(serviceName);
System.out.println(serviceName);
for( ServiceInstanceinstance:instances)
{
outputInstance(instance);
}
}
}
finally
{
CloseableUtils.closeQuietly(serviceDiscovery);
}