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