摘要:應用場景回顧下應用場景數據發布與訂閱服務注冊與發現分布式鎖分布式隊列選舉配置中心命名服務負載均衡實現服務注冊與發現服務注冊與發現再來看看在服務注冊與發現中的應用代碼實現邏輯服務注冊創建的臨時的有序節點臨時的話斷開連接了可以監聽到有序節點創
zookeeper應用場景
回顧下zk應用場景:
數據發布與訂閱
服務注冊與發現
分布式鎖
分布式隊列
master選舉
配置中心
命名服務
負載均衡
zookeeper實現服務注冊與發現服務注冊與發現
再來看看zk在服務注冊與發現中的應用:
代碼實現邏輯:
服務注冊:
public class ServiceRegister { private static final String BASE_SERVICES = "/services"; private static final String SERVICE_NAME="/products"; public static void register(String address,int port) { try { ZooKeeper zooKeeper = new ZooKeeper("localhost:2181",5000,(watchedEvent)->{}); Stat exists = zooKeeper.exists(BASE_SERVICES + SERVICE_NAME, false); if(exists==null) { zooKeeper.create(BASE_SERVICES + SERVICE_NAME,"".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } String server_path = address+":"+port; //創建的臨時的有序節點 //臨時的話斷開連接了可以監聽到,有序節點創建代表每一個節點否則相同節點名稱無法創建 zooKeeper.create(BASE_SERVICES + SERVICE_NAME+"/child",server_path.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL); System.out.println("產品服務注冊成功"); } catch (Exception e) { e.printStackTrace(); } } }
發現服務:
public class InitListener implements ServletContextListener { private static final String BASE_SERVICES = "/services"; private static final String SERVICE_NAME="/products"; private ZooKeeper zooKeeper; @Override public void contextInitialized(ServletContextEvent sce) { try { zooKeeper = new ZooKeeper("localhost:2181",5000,(watchedEvent)->{ if(watchedEvent.getType() == Watcher.Event.EventType.NodeChildrenChanged && watchedEvent.getPath().equals(BASE_SERVICES+SERVICE_NAME)) { updateServiceList(); } }); updateServiceList(); } catch (Exception e) { e.printStackTrace(); } } private void updateServiceList() { try{ Listchildren = zooKeeper.getChildren(BASE_SERVICES + SERVICE_NAME, true); List newServerList = new ArrayList (); for(String subNode:children) { byte[] data = zooKeeper.getData(BASE_SERVICES + SERVICE_NAME + "/" + subNode, false, null); String host = new String(data, "utf-8"); System.out.println("host:"+host); newServerList.add(host); } //保存注冊服務的ip端口信息,以供遠程rpc調用 LoadBalance.SERVICE_LIST = newServerList; }catch (Exception e) { e.printStackTrace(); } } } public abstract class LoadBalance { public volatile static List SERVICE_LIST; public abstract String choseServiceHost(); } /** * 隨機負載均衡算法 */ public class RamdomLoadBalance extends LoadBalance { @Override public String choseServiceHost() { String result = ""; if(!CollectionUtils.isEmpty(SERVICE_LIST)) { int index = new Random().nextInt(SERVICE_LIST.size()); result = SERVICE_LIST.get(index); } return result ; } }
再講講幾個關鍵點
1.注冊服務的時候需要創建臨時節點,斷開連接的時候也就是服務端掛了后節點刪除可監聽到
2.注冊服務的時候創建的是有序節點,一般來說相同服務都是有幾臺機器的,創建順序節點可區分多臺機器的服務
3.發現服務的一端監聽服務節點的子節點,有子節點被刪除了或者有新子節點創建即重新發現服務可用的機器
dubbo中基于zk的服務注冊與發現也是這個原理
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75152.html
Github 地址:https://github.com/Snailclimb/springboot-integration-examples ,歡迎各位 Star。 目錄: 使用 SpringBoot+Dubbo 搭建一個簡單分布式服務 實戰之前,先來看幾個重要的概念 什么是分布式? 什么是 Duboo? Dubbo 架構 什么是 RPC? 為什么要用 Dubbo? 開始實戰 1 ...
摘要:是一個相對比較新的微服務框架,年才推出的版本雖然時間最短但是相比等框架提供的全套的分布式系統解決方案。提供線程池不同的服務走不同的線程池,實現了不同服務調用的隔離,避免了服務器雪崩的問題。通過互相注冊的方式來進行消息同步和保證高可用。 Spring Cloud 是一個相對比較新的微服務框架,...
摘要:啟動容器,加載,運行服務提供者。服務提供者在啟動時,在注冊中心發布注冊自己提供的服務。注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數據給消費者。 一 為什么需要 dubbo 很多時候,其實我們使用這個技術的時候,可能都是因為項目需要,所以,我們就用了,但是,至于為什么我們需要用到這個技術,可能自身并不是很了解的,但是,其實了解技術的來由及背景知識,對...
摘要:服務器用作服務注冊服務器。此時,這個節點對于新的服務還能提供注冊服務,對于死亡的仍然保留,以防還有客戶端向其發起請求。的構架保證了它能夠成為發現服務。 本帖最后由 yqw_gz_java 于 2019-8-15 14:26 編輯 與ZooKeeper 一樣eureka 都可以注冊服務發現服務CAP定理在分布式系統領域有個著名的CAP定理(C-數據一致性;A-服務可用性;P-服務對網絡分...
閱讀 2042·2021-11-11 16:54
閱讀 2115·2019-08-30 15:55
閱讀 3616·2019-08-30 15:54
閱讀 395·2019-08-30 15:44
閱讀 2235·2019-08-30 10:58
閱讀 430·2019-08-26 10:30
閱讀 3054·2019-08-23 14:46
閱讀 3197·2019-08-23 13:46