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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

通过Zookeeper动态感知服务器上下线[案例]

發布時間:2025/4/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过Zookeeper动态感知服务器上下线[案例] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://blog.csdn.net/USTC_Zn/article/details/54974982

主體思路:

服務器端:服務器上線、在zookeeper創建 臨時的序列化結點

客戶端:已啟動getchildren 并注冊監聽 ,獲取到當前在線服務器列表。

效果:

客戶端能動態感知服務器上下線情況、并獲取新的服務器列表

?

服務器端源碼:

?

[java] view plaincopy
  • package?com.zn.zk1;??
  • ??
  • import?org.apache.zookeeper.CreateMode;??
  • import?org.apache.zookeeper.WatchedEvent;??
  • import?org.apache.zookeeper.Watcher;??
  • import?org.apache.zookeeper.ZooDefs.Ids;??
  • import?org.apache.zookeeper.ZooKeeper;??
  • ??
  • public?class?DistributedServer?{??
  • ????private?static?final?String?connectString?=?"zk01:2181,zk02:2181,zk03:2181";??
  • ????private?static?final?int?sessionTimeout?=?2000;??
  • ????private?static?final?String?parentNode?=?"/servers";??
  • ??
  • ????private?ZooKeeper?zk?=?null;??
  • ??????
  • ??????
  • ????/**?
  • ?????*?模擬服務器上線?
  • ?????*?@param?args?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?static?void?main(String[]?args)?throws?Exception?{??
  • ??
  • ????????//?獲取zk連接??
  • ????????DistributedServer?server?=?new?DistributedServer();??
  • ????????server.getConnect();??
  • ??
  • ????????//?利用zk連接注冊服務器信息??
  • ????????server.registerServer(args[0]);??
  • ??
  • ????????//?啟動業務功能??
  • ????????server.handleBussiness(args[0]);??
  • ??
  • ????}??
  • ????/**?
  • ?????*?創建到zk的客戶端連接?
  • ?????*??
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?void?getConnect()?throws?Exception?{??
  • ??
  • ????????zk?=?new?ZooKeeper(connectString,?sessionTimeout,?new?Watcher()?{??
  • ??????????????
  • ????????????public?void?process(WatchedEvent?event)?{??
  • ????????????????//?收到事件通知后的回調函數(應該是我們自己的事件處理邏輯)??
  • ????????????????System.out.println(event.getType()?+?"---"?+?event.getPath());??
  • ????????????????try?{??
  • ????????????????????zk.getChildren("/",?true);??
  • ????????????????}?catch?(Exception?e)?{??
  • ????????????????}??
  • ????????????}??
  • ????????});??
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*?向zk集群注冊服務器信息?
  • ?????*??
  • ?????*?@param?hostname?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?void?registerServer(String?hostname)?throws?Exception?{??
  • ??????????
  • ????????//運行時請手動創建父節點/servers??
  • ????????//臨時的臨時的序列化結點??
  • ????????String?create?=?zk.create(parentNode?+?"/server",?hostname.getBytes(),?Ids.OPEN_ACL_UNSAFE,?CreateMode.EPHEMERAL_SEQUENTIAL);??
  • ????????System.out.println(hostname?+?"is?online.."?+?create);??
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*?業務功能?
  • ?????*??
  • ?????*?@throws?InterruptedException?
  • ?????*/??
  • ????public?void?handleBussiness(String?hostname)?throws?InterruptedException?{??
  • ????????System.out.println(hostname?+?"start?working.....");??
  • ????????Thread.sleep(Long.MAX_VALUE);????
  • ????}??
  • ??
  • ??
  • ??
  • }??


  • -----------------------華麗的分界線---------------------

    客戶端源碼:

    ?

    [java] view plaincopy
  • package?com.zn.zk1;??
  • ??
  • import?java.util.ArrayList;??
  • import?java.util.List;??
  • ??
  • import?org.apache.zookeeper.KeeperException;??
  • import?org.apache.zookeeper.WatchedEvent;??
  • import?org.apache.zookeeper.Watcher;??
  • import?org.apache.zookeeper.ZooKeeper;??
  • ??
  • public?class?DistributedClient?{??
  • ??
  • ????private?static?final?String?connectString?=?"zk01:2181,zk02:2181,zk03:2181";??
  • ????private?static?final?int?sessionTimeout?=?2000;??
  • ????private?static?final?String?parentNode?=?"/servers";??
  • ??????
  • ????/**?注意:加<span?style="color:#ff0000;"><strong>volatile的意義</strong></span>何在?---serverList對象在JVM堆中,多線程時會對該對象進行更改,每個線程對該對象操作會?
  • ?????*??????copy一個副本到本地線程棧,再對該對象進行修改操作,改完后,再將該對象同步到共享的堆內存中。?
  • ?????*?????被volatile修飾的對象則不會被copy到本地線程棧。所有線程看到的該對象是同一個。不會出現多線程問題。?
  • ?????*/??
  • ????private?volatile?List<String>?serverList;??
  • ????private?ZooKeeper?zk?=?null;??
  • ??????
  • ??????
  • ????public?static?void?main(String[]?args)?throws?Exception?{??
  • ??
  • ????????//?獲取zk連接??
  • ????????DistributedClient?client?=?new?DistributedClient();??
  • ??????????
  • ????????//創建zookeeper連接??
  • ????????client.getConnect();??
  • ??????????
  • ????????//?獲取servers的子節點信息(并監聽),從中獲取服務器信息列表??
  • ????????client.getServerList();??
  • ??
  • ????????//?業務線程啟動??
  • ????????client.handleBussiness();??
  • ??????????
  • ????}??
  • ??
  • ????/**?
  • ?????*?業務功能?
  • ?????*??
  • ?????*?@throws?InterruptedException?
  • ?????*/??
  • ????public?void?handleBussiness()?throws?InterruptedException?{??
  • ????????System.out.println("client?start?working.....");??
  • ????????Thread.sleep(Long.MAX_VALUE);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?創建到zk的客戶端連接?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?void?getConnect()?throws?Exception?{??
  • ??
  • ????????zk?=?new?ZooKeeper(connectString,?sessionTimeout,?new?Watcher()?{??
  • ??????????????
  • ????????????public?void?process(WatchedEvent?event)?{??
  • ????????????????//?收到事件通知后的回調函數(應該是我們自己的事件處理邏輯)??
  • ????????????????try?{??
  • ????????????????????//重新更新服務器列表,并且注冊了監聽??
  • ????????????????????getServerList();??
  • ??
  • ????????????????}?catch?(Exception?e)?{??
  • ????????????????}??
  • ????????????}??
  • ????????});??
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*?獲取服務器信息列表?
  • ?????*??
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?void?getServerList()?throws?Exception?{??
  • ??
  • ????????//?獲取服務器子節點信息,并且對父節點進行監聽??
  • ????????List<String>?children?=?zk.getChildren(parentNode,?true);??
  • ??
  • ????????//?先創建一個局部的list來存服務器信息??
  • ????????List<String>?servers?=?new?ArrayList<String>();??
  • ????????for?(String?child?:?children)?{??
  • ????????????//?child只是子節點的節點名??
  • ????????????byte[]?data?=?zk.getData(parentNode?+?"/"?+?child,?false,?null);??
  • ????????????servers.add(new?String(data));??
  • ????????}??
  • ????????//?把servers賦值給成員變量serverList,已提供給各業務線程使用??
  • ????????serverList?=?servers;??
  • ??????????
  • ????????//打印服務器列表??
  • ????????System.out.println(serverList);??
  • ??????????
  • ????}??
  • }??

  • 最后:可以將兩個java文件分別打包、部署到服務器測試、也可以在IDE上測試執行效果。

    轉載于:https://www.cnblogs.com/davidwang456/articles/8729355.html

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的通过Zookeeper动态感知服务器上下线[案例]的全部內容,希望文章能夠幫你解決所遇到的問題。

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