摘要:應(yīng)用場景回顧下應(yīng)用場景數(shù)據(jù)發(fā)布與訂閱服務(wù)注冊與發(fā)現(xiàn)分布式鎖分布式隊列選舉配置中心命名服務(wù)負(fù)載均衡實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)服務(wù)注冊與發(fā)現(xiàn)再來看看在服務(wù)注冊與發(fā)現(xiàn)中的應(yīng)用代碼實現(xiàn)邏輯服務(wù)注冊創(chuàng)建的臨時的有序節(jié)點臨時的話斷開連接了可以監(jiān)聽到有序節(jié)點創(chuàng)
zookeeper應(yīng)用場景
回顧下zk應(yīng)用場景:
數(shù)據(jù)發(fā)布與訂閱
服務(wù)注冊與發(fā)現(xiàn)
分布式鎖
分布式隊列
master選舉
配置中心
命名服務(wù)
負(fù)載均衡
zookeeper實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)服務(wù)注冊與發(fā)現(xiàn)
再來看看zk在服務(wù)注冊與發(fā)現(xiàn)中的應(yīng)用:
代碼實現(xiàn)邏輯:
服務(wù)注冊:
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; //創(chuàng)建的臨時的有序節(jié)點 //臨時的話斷開連接了可以監(jiān)聽到,有序節(jié)點創(chuàng)建代表每一個節(jié)點否則相同節(jié)點名稱無法創(chuàng)建 zooKeeper.create(BASE_SERVICES + SERVICE_NAME+"/child",server_path.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL); System.out.println("產(chǎn)品服務(wù)注冊成功"); } catch (Exception e) { e.printStackTrace(); } } }
發(fā)現(xiàn)服務(wù):
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); } //保存注冊服務(wù)的ip端口信息,以供遠(yuǎn)程rpc調(diào)用 LoadBalance.SERVICE_LIST = newServerList; }catch (Exception e) { e.printStackTrace(); } } } public abstract class LoadBalance { public volatile static List SERVICE_LIST; public abstract String choseServiceHost(); } /** * 隨機負(fù)載均衡算法 */ 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 ; } }
再講講幾個關(guān)鍵點
1.注冊服務(wù)的時候需要創(chuàng)建臨時節(jié)點,斷開連接的時候也就是服務(wù)端掛了后節(jié)點刪除可監(jiān)聽到
2.注冊服務(wù)的時候創(chuàng)建的是有序節(jié)點,一般來說相同服務(wù)都是有幾臺機器的,創(chuàng)建順序節(jié)點可區(qū)分多臺機器的服務(wù)
3.發(fā)現(xiàn)服務(wù)的一端監(jiān)聽服務(wù)節(jié)點的子節(jié)點,有子節(jié)點被刪除了或者有新子節(jié)點創(chuàng)建即重新發(fā)現(xiàn)服務(wù)可用的機器
dubbo中基于zk的服務(wù)注冊與發(fā)現(xiàn)也是這個原理
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75152.html
Github 地址:https://github.com/Snailclimb/springboot-integration-examples ,歡迎各位 Star。 目錄: 使用 SpringBoot+Dubbo 搭建一個簡單分布式服務(wù) 實戰(zhàn)之前,先來看幾個重要的概念 什么是分布式? 什么是 Duboo? Dubbo 架構(gòu) 什么是 RPC? 為什么要用 Dubbo? 開始實戰(zhàn) 1 ...
摘要:是一個相對比較新的微服務(wù)框架,年才推出的版本雖然時間最短但是相比等框架提供的全套的分布式系統(tǒng)解決方案。提供線程池不同的服務(wù)走不同的線程池,實現(xiàn)了不同服務(wù)調(diào)用的隔離,避免了服務(wù)器雪崩的問題。通過互相注冊的方式來進行消息同步和保證高可用。 Spring Cloud 是一個相對比較新的微服務(wù)框架,...
摘要:啟動容器,加載,運行服務(wù)提供者。服務(wù)提供者在啟動時,在注冊中心發(fā)布注冊自己提供的服務(wù)。注冊中心返回服務(wù)提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者。 一 為什么需要 dubbo 很多時候,其實我們使用這個技術(shù)的時候,可能都是因為項目需要,所以,我們就用了,但是,至于為什么我們需要用到這個技術(shù),可能自身并不是很了解的,但是,其實了解技術(shù)的來由及背景知識,對...
摘要:服務(wù)器用作服務(wù)注冊服務(wù)器。此時,這個節(jié)點對于新的服務(wù)還能提供注冊服務(wù),對于死亡的仍然保留,以防還有客戶端向其發(fā)起請求。的構(gòu)架保證了它能夠成為發(fā)現(xiàn)服務(wù)。 本帖最后由 yqw_gz_java 于 2019-8-15 14:26 編輯 與ZooKeeper 一樣eureka 都可以注冊服務(wù)發(fā)現(xiàn)服務(wù)CAP定理在分布式系統(tǒng)領(lǐng)域有個著名的CAP定理(C-數(shù)據(jù)一致性;A-服務(wù)可用性;P-服務(wù)對網(wǎng)絡(luò)分...
閱讀 2043·2021-11-11 16:54
閱讀 2121·2019-08-30 15:55
閱讀 3621·2019-08-30 15:54
閱讀 398·2019-08-30 15:44
閱讀 2239·2019-08-30 10:58
閱讀 431·2019-08-26 10:30
閱讀 3055·2019-08-23 14:46
閱讀 3204·2019-08-23 13:46