日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

zookeeper curator 服务注册

發布時間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zookeeper curator 服务注册 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://fobject.iteye.com/blog/2294728

Zookeeper & Curator 服務注冊?
curator是最簡單的Zookeeper客戶端?

Curator主要組件?
Recipes?? (擴展:包括分布式鎖、隊列、選舉等)?
Framework? (框架)?
Utilities? (工具)?
Client (客戶端)?
Errors? (錯誤處理)?
另外Curator提供了一些擴展庫,比如用于服務注冊的curator-x-discovery?

服務定義? ServiceInstance?
Curator 中使用可以使用ServiceInstance作為服務定義對象?
通常一個服務對象具有服務名、服務id、地址、端口和有效數據等屬性,?
下面就是ServiceInstance類的變量定義。?

Java代碼??
  • public?class?ServiceInstance<T>?{??
  • ????private?final?String?name;??
  • ????private?final?String?id;??
  • ????private?final?String?address;??
  • ????private?final?Integer?port;??
  • ????private?final?Integer?sslPort;??
  • ????private?final?T?payload;??
  • ????private?final?long?registrationTimeUTC;??
  • ????private?final?ServiceType?serviceType;??
  • ????private?final?UriSpec?uriSpec;??
  • ????...??
  • }??

  • 服務注冊過程就是將ServiceInstance實例寫到Zookeeper層次結構中,服務名name會生成一個ZkNode,id會生成這個name下孩子節點,在注冊的時候會指定根路徑,所以注冊之后的服務在zookeeper中如下圖所示?

    根路徑(注冊時指定)?
    |_____name1 //服務名1?
    |??????? |______id1->序列化ServiceInstance1?
    | |______id2->序列化ServiceInstance2?
    |?
    |_____name2 //服務名2?
    |??????? |______id1->序列化ServiceInstance1?
    | |______id2->序列化ServiceInstance2?
    |?
    可以先通過客戶端連接到本地zookeeper查看下具體的服務注冊情況,其注冊在/###/services/路徑下,會發現有很多服務,再進服務查看可以看到這個服務下有多少個實例,其節點為其id(如果服務未設置id,使用的是默認隨機生成的字符串)。?
    要注意到是服務在注冊時生成的name服務名節點是持久的節點,而服務名下面的實例id節點是臨時節點,正常服務結束,可以通過提供的相關api來刪除對應的節點,臨時節點能保證注冊服務的程序異常退出或失去連接后也能做到將服務節點摘除。?


    構造服務實例的方法很簡單,可以通過ServiceInstance的build方法進行建造。?
    在練習中定義了一個簡單的服務業務類XServInstance?

    Java代碼??
  • public?class?XServInstance?implements?Serializable{??
  • ????private??String?id;??
  • ????private??String?name;??
  • ????private??String?path;??
  • ????get&set()...??
  • }??

  • 建造ServiceInstance的代碼如下:?

    Java代碼??
  • ServiceInstance<XServInstance>?serviceInstance=?ServiceInstance.<XServInstance>builder()??
  • ????????????????.id(instance.getId())??
  • ????????????????.name(instance.getName())??
  • ????????????????.payload(instance).build();??

  • 服務注冊? ServiceDiscovery?
    Curator使用ServiceDiscovery進行服務注冊,可以把它認為是服務管理中心,通過它也能查找我們的服務。ServiceDiscovery同樣采用建造者方式,由ServiceDiscoveryBuilder進行構造,在構造完成之后需要調用start方法!SERV_PAHT指定我們服務需要注冊在zookeeper的哪個目錄?

    Java代碼??
  • JsonInstanceSerializer<XServInstance>?serializer=new?JsonInstanceSerializer<XServInstance>(XServInstance.class);??
  • serviceDiscovery=?ServiceDiscoveryBuilder.builder(XServInstance.class)??
  • ????????????????.basePath(SERV_PATH)??
  • ????????????????.client(client)??
  • ????????????????.serializer(serializer)??
  • ????????????????.build();??
  • serviceDiscovery.start();??

  • client是curator的zookeeper客戶端,通過下面方式構造:?

    Java代碼??
  • RetryPolicy?retryPolicy=new?RetryOneTime(1000);??
  • //CONNECT_STR?:?"127.0.0.1:2181"??
  • client=?CuratorFrameworkFactory.newClient(CONNECT_STR,retryPolicy);??
  • client.start()//必須調用??

  • 注冊服務的代碼就一行:?

    Java代碼??
  • serviceDiscovery.registerService(serviceInstance);??

  • 此時服務已注冊,在程序未退出時查看SERV_PATH下的內容即注冊服務serviceInstance的name,再下一層就是id了,如果同一個服務注冊了多個,則會有多個id(注冊id相同只會有一個)。退出程序之后,由其注冊的id也就沒了。?
    ServiceDiscovery除了注冊服務,同時也能查詢服務,其三個主要的查詢方法如下:?



      • +? Collection<String> queryForNames()? //查詢所有服務名?

    ?

      • +? Collection<ServiceInstance<T>>? queryForInstances(String name)? //查詢指定服務名下的所有服務實例?

    ?

      • +? ServiceInstance<T> queryForInstance(String name, String id)????? //根據服務名和id查詢服務實例?



    服務提供? ServiceProvider?
    這一步是Curator自帶的服務提供方式,也可以不采用自帶的服務提供者,而是通過ServiceDiscovery查詢(queryForInstances)到服務之后,通過自己的策略進行服務選擇(后期待續)。這里直接使用curator現成的服務提供者。?


    服務提供者的構造通過serviceDiscovery內部的建造者方法進行構造,同樣必須先start?
    需要注意的是providerStrategy提供策略,對服務提供者設置一個服務選擇策略,因為同一個服務名下有很多具體服務實例,具體選擇哪一個可以由該策略決定:?
    常用的有RoundRobinStrategy 輪詢,RandomStrategy 隨機選擇 ,StickyStrategy 粘性策略(總是選擇同一個,沒試過比較特殊,可能適用于某些服務調用者和提供者需要記錄什么調用記錄的情況下吧)?

    Java代碼??
  • ServiceProvider?servPro?=?serviceDiscovery.serviceProviderBuilder()??
  • ????????.serviceName(servName)??
  • ????????.providerStrategy(new?RoundRobinStrategy<XServInstance>())??
  • ????????.build();??
  • servPro.start();??

  • 獲取一個服務通過以下方式進行獲取?

    Java代碼??
  • ServiceInstance<XServInstance>?serviceInstance=servPro.getInstance();??

  • .?

    最后附上本練習簡單的服務注冊中心代碼和測試代碼?

    Java代碼??
  • public?class?XServCenter?{??
  • ????public??static?final??String?SERV_PATH="/myServices";??
  • ????ServiceDiscovery<XServInstance>?serviceDiscovery?;??
  • ????Map<String,ServiceProvider>?providerMap=new?HashMap<String,?ServiceProvider>();??
  • ??
  • ????public??void?init(CuratorFramework?client)?throws?Exception?{??
  • ????????JsonInstanceSerializer<XServInstance>?serializer=new?JsonInstanceSerializer<XServInstance>(XServInstance.class);??
  • ????????serviceDiscovery=?ServiceDiscoveryBuilder.builder(XServInstance.class)??
  • ????????????????.basePath(SERV_PATH)??
  • ????????????????.client(client)??
  • ????????????????.serializer(serializer)??
  • ????????????????.build();??
  • ????????serviceDiscovery.start();??
  • ????}??
  • ??
  • ????public??void?regist(XServInstance?instance)?throws?Exception?{??
  • ????????ServiceInstance<XServInstance>?serviceInstance=?ServiceInstance.<XServInstance>builder()??
  • ????????????????.id(instance.getId())??
  • ????????????????.name(instance.getName())??
  • ????????????????.payload(instance).build();??
  • ????????serviceDiscovery.registerService(serviceInstance);??
  • ??
  • ????}??
  • ??
  • ????public??void?list()?throws?Exception?{??
  • ????????Collection<String>?servNames=serviceDiscovery.queryForNames();??
  • ????????for(String?servName:servNames){??
  • ????????????Collection<ServiceInstance<XServInstance>>?instances=serviceDiscovery.queryForInstances("/"+servName);??
  • ????????????System.out.println(servName);??
  • ????????????for(ServiceInstance<XServInstance>?instance:instances){??
  • ????????????????System.out.println("-------?:?"+instance.getId());??
  • ????????????}??
  • ??
  • ????????}??
  • ????}??
  • ??
  • ????public??void?getServiceByName(String?servName)?throws?Exception?{??
  • ????????ServiceProvider?servPro?=providerMap.get(servName);??
  • ????????if?(servPro==null)?{??
  • ????????????servPro?=?serviceDiscovery.serviceProviderBuilder()??
  • ????????????????????.serviceName(servName)?//RandomStrategy?StickyStrategy??
  • ????????????????????.providerStrategy(new?RoundRobinStrategy<XServInstance>())????
  • ????????????????????.build();??
  • ????????????servPro.start();??
  • ????????????providerMap.put(servName,servPro);??
  • ????????}??
  • ????????ServiceInstance<XServInstance>?serviceInstance=servPro.getInstance();??
  • ????????System.out.println("getServiceByName??"+serviceInstance.getId());??
  • ????}??

  • Test?

    Java代碼??
  • public?class?ServTest?{??
  • ????public??static??final?String?CONNECT_STR="127.0.0.1:2181";??
  • ????public?static?CuratorFramework?client;??
  • ????public??static??void?main(String?args[])?throws?Exception?{??
  • ????????RetryPolicy?retryPolicy=new?RetryOneTime(1000);??
  • ????????client=?CuratorFrameworkFactory.newClient(CONNECT_STR,retryPolicy);??
  • ????????if(client==null)?return;??
  • ????????client.start();??
  • ????????XServCenter?xServCenter=new?XServCenter();??
  • ????????xServCenter.init(client);??
  • ????????Runtime.getRuntime().addShutdownHook(new?Thread(){??
  • ????????????public?void?run()?{??
  • ????????????????CloseableUtils.closeQuietly(client);??
  • ????????????}??
  • ????????});??
  • ????????for(int?i=0;i<10;i++)?{??
  • ????????????for(int?j=0;j<10;j++)?{??
  • ????????????????XServInstance?xServInstance?=?new?XServInstance();??
  • ????????????????xServInstance.setId("serv_id_"?+?i+"_"+j);??
  • ????????????????xServInstance.setName("serv_name_"?+?i);??
  • ????????????????xServCenter.regist(xServInstance);??
  • ????????????}??
  • ????????}??
  • ????????System.out.println("#####list######");??
  • ????????xServCenter.list();??
  • ??
  • ????????for(int?i=0;i<1000;i++)?{??
  • ????????????xServCenter.getServiceByName("serv_name_1");??
  • ????????????Thread.sleep(500);??
  • ????????}??
  • ??
  • ????????Thread.sleep(600000);??
  • ??
  • ??
  • ????}??
  • }??
  • 轉載于:https://www.cnblogs.com/davidwang456/articles/10600349.html

    總結

    以上是生活随笔為你收集整理的zookeeper curator 服务注册的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。