日韩性视频-久久久蜜桃-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 服务注册的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 免费在线观看黄色片 | 久久国产精品影视 | 成人av电影在线观看 | 日韩综合网 | 亚洲操操操 | 色综合综合网 | 大陆日韩欧美 | 黄色在线免费观看网站 | 好吊日精品视频 | 天天爱天天做 | 国产高潮av | 午夜在线视频免费 | 中文字幕一区二区三区四区视频 | 激情欧美一区二区免费视频 | 爆操巨乳美女 | 午夜影院福利 | www.午夜视频| 国产av成人一区二区三区高清 | 动漫3d精品一区二区三区乱码 | 69黄色片 | 森林影视官网在线观看 | 美女写真福利视频 | 成人男女视频 | 色妞网站 | 91看片免费版 | 日本一区中文字幕 | 操丝袜少妇 | 探花国产精品一区二区 | 欧美日韩免费高清一区色橹橹 | 九九热九九 | 一区二区三区四区精品视频 | 今天高清视频在线观看视频 | 成人国产精品免费观看视频 | 久久久精品999 | 欧美一二区视频 | 少妇性色av | 亚洲视频图片小说 | 国产视频精品视频 | 国产性色视频 | 国产香蕉97碰碰碰视频在线观看 | a色网站 | 91成人综合 | 亚洲国产精品综合久久久 | 性久久久久久久久久 | 男人天堂资源 | 亚洲欧美中文日韩在线v日本 | 精品妇女一区二区三区 | 黄色一级大片在线免费看国产一 | 在线观看免费高清在线观看 | 日韩av综合 | 成人免费在线视频网站 | 日日日干 | 无遮挡又爽又刺激的视频 | 青草青草久热 | 久久精品国产亚洲av麻豆蜜芽 | 另类专区欧美 | 四虎影视网 | 亚洲精品中文字幕在线 | 亚洲久久在线观看 | 国产做受麻豆动漫 | 久久久久久国 | 成人性视频sm. | 成人蜜桃视频 | 在线免费一区二区 | 免费看a网站| 男人深夜影院 | 国产黄色av片 | 色就色欧美 | 亚洲精品一区二区三区不卡 | 欧美激情三区 | 韩国三级中文字幕hd久久精品 | 国产九色91回来了 | 女人张开腿让男人桶爽 | 国产第3页 | 卡一卡二卡三 | 国内一区二区三区 | av色成人 | 国产专区第一页 | 日本一区二区三区在线看 | 国产一区二区三区在线播放无 | 天天干天天爱天天射 | 丰满少妇av | 狠狠操天天操夜夜操 | www.激情网| 日韩av女优在线观看 | 女大学生的家政保姆初体验 | 精品无码人妻一区二区免费蜜桃 | 国产性自拍| 国产精品-区区久久久狼 | 无码人妻精品丰满熟人区 | √8天堂资源地址中文在线 欧美精品在线一区二区 | 亚洲 精品 综合 精品 自拍 | 色屁屁www影院免费观看入口 | 色屁屁网站 | 亚洲美女在线视频 | 久伊人| 91天天射| 超碰成人av | 国产午夜福利在线播放 |