通過curator實(shí)現(xiàn)zookeeper的服務(wù)配置更新

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);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容