生活随笔
收集整理的這篇文章主要介紹了
通过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;??????????????????????public?static?void?main(String[]?args)?throws?Exception?{????????????????????DistributedServer?server?=?new?DistributedServer();??????????server.getConnect();????????????????????server.registerServer(args[0]);????????????????????server.handleBussiness(args[0]);????????}??????????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)?{??????????????????}??????????????}??????????});????????}????????????public?void?registerServer(String?hostname)?throws?Exception?{????????????????????????????????????String?create?=?zk.create(parentNode?+?"/server",?hostname.getBytes(),?Ids.OPEN_ACL_UNSAFE,?CreateMode.EPHEMERAL_SEQUENTIAL);??????????System.out.println(hostname?+?"is?online.."?+?create);????????}????????????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";????????????????private?volatile?List<String>?serverList;??????private?ZooKeeper?zk?=?null;??????????????????public?static?void?main(String[]?args)?throws?Exception?{????????????????????DistributedClient?client?=?new?DistributedClient();????????????????????????????client.getConnect();????????????????????????????client.getServerList();????????????????????client.handleBussiness();????????????????}????????????public?void?handleBussiness()?throws?InterruptedException?{??????????System.out.println("client?start?working.....");??????????Thread.sleep(Long.MAX_VALUE);??????}????????????public?void?getConnect()?throws?Exception?{????????????zk?=?new?ZooKeeper(connectString,?sessionTimeout,?new?Watcher()?{????????????????????????????public?void?process(WatchedEvent?event)?{??????????????????????????????????try?{??????????????????????????????????????????getServerList();????????????????????}?catch?(Exception?e)?{??????????????????}??????????????}??????????});????????}????????????public?void?getServerList()?throws?Exception?{????????????????????List<String>?children?=?zk.getChildren(parentNode,?true);????????????????????List<String>?servers?=?new?ArrayList<String>();??????????for?(String?child?:?children)?{??????????????????????????byte[]?data?=?zk.getData(parentNode?+?"/"?+?child,?false,?null);??????????????servers.add(new?String(data));??????????}??????????????????serverList?=?servers;????????????????????????????System.out.println(serverList);????????????????}??}??
最后:可以將兩個java文件分別打包、部署到服務器測試、也可以在IDE上測試執行效果。
轉載于:https://www.cnblogs.com/davidwang456/articles/8729355.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的通过Zookeeper动态感知服务器上下线[案例]的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。