新聞中心
本文轉載自微信公眾號「捉蟲大師」,作者捉蟲大師。轉載本文請聯(lián)系捉蟲大師公眾號。

成都創(chuàng)新互聯(lián)是一家專注網(wǎng)站建設、網(wǎng)絡營銷策劃、小程序開發(fā)、電子商務建設、網(wǎng)絡推廣、移動互聯(lián)開發(fā)、研究、服務為一體的技術型公司。公司成立10余年以來,已經(jīng)為1000+玻璃隔斷各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務?,F(xiàn)在,服務的1000+客戶與我們一路同行,見證我們的成長;未來,我們一起分享成功的喜悅。
前言
在之前的文章中分析了Nacos配置中心,配置中心的核心是配置的創(chuàng)建、讀取、推送。
注冊中心的核心比配置中心多一個服務探活模塊,他倆的相似度非常高,甚至阿里內部的注冊中心就叫ConfigServer。
Nacos注冊中心打算分成幾個模塊來分析,本文重點在于概要設計,基于2.0.0版本。
環(huán)境搭建
用Nacos的源碼來搭建源碼閱讀和調試環(huán)境,可參考《Nacos配置中心模塊詳解》 Nacos調試環(huán)境搭建部分。
其中 JVM參數(shù)可以指定只啟動Naming模塊,也可以不指定,默認全都啟動。
example模塊下將NamingExample復制一份進行測試。
設計概要
服務發(fā)現(xiàn)模型
客戶端視角的服務發(fā)現(xiàn)模型(注意:服務端視角的模型定義與客戶端視角有區(qū)別)包含以下幾點內容:
- Service:服務
- Cluster:集群
- Instance:實例
代碼注釋:We introduce a 'service --> cluster --> instance' model, in which service stores a list of clusters, which contains a list of instances
他們的關系如下
Service
- name:服務名
- protectThreshold:保護閾值,限制了實例被探活摘除的最大比例
- appName:服務的應用名,暫無實際用處
- groupName:分組名
- metadata:元數(shù)據(jù)
Cluster
- serviceName:所屬服務名
- name:集群名
- healthChecker:服務探活配置,此處僅對服務端主動探活生效,有TCP、HTTP、MySQL、None幾種方式,默認TCP
- defaultPort:默認端口
- defaultCheckPort:默認探活端口
- useIPPort4Check:是否使用port進行探活
- metadata:元數(shù)據(jù)
Instance
- instanceId:實例id,唯一標志,Nacos提供了simple和snowflake兩種算法來生成,默認是simple,其生成方式為ip#port#clusterName#serviceName
- ip:實例ip
- port:實例port
- weight:實例權重
- healthy:實例健康狀態(tài)
- clusterName:所屬集群名
- serviceName:所屬服務名
- metadata:元數(shù)據(jù)
- enabled:是否接收請求,可用于臨時禁用或摘流等場景
- ephemeral:是否為臨時實例,后文會介紹該參數(shù)
- getInstanceHeartBeatInterval:獲取實例心跳上報間隔時間,默認5秒,可配置
- getInstanceHeartBeatTimeOut:獲取心跳超時時間,15秒,配置
- getIpDeleteTimeout:獲取ip被刪除的超時時間,默認30秒,可配置
- getInstanceIdGenerator:獲取id生成器
除了上述的三層模型外,Nacos注冊中心和配置中心有著一樣的namespace設計,與client綁定,可隔離環(huán)境,租戶。
接口設計
- registerInstance:注冊實例
- deregisterInstance:注銷實例
- getAllInstances:獲取一個服務的所有實例(包括不健康)
- selectInstances:根據(jù)條件獲取一個服務的實例
- selectOneHealthyInstance:根據(jù)負載均衡策略獲取服務的一個健康的實例
- subscribe:訂閱服務
- unsubscribe:取消訂閱服務
- getServicesOfServer:根據(jù)條件分頁獲取所有服務
交互流程
Nacos 2.0 為ephemeral不同的實例提供了兩套流程:
- ephemeral=false,永久實例,與server端的交互采用http請求,server節(jié)點間數(shù)據(jù)同步采用了raft協(xié)議,健康檢查采用了server端主動探活的機制
- ephemeral=true,臨時實例,與server端的交互采用grpc請求,server節(jié)點間數(shù)據(jù)同步采用了distro協(xié)議,健康檢查采用了TCP連接的KeepAlive模式
臨時實例的交互流程
- client初始化,與server建立連接
只與其中一臺server節(jié)點建立長連接
- client 注冊服務,將serviceName+ip+port+clusterName等數(shù)據(jù)打包發(fā)送grpc請求
同時客戶端緩存已注冊過的服務,當client與server連接斷開重連時,client重新將這些數(shù)據(jù)注冊到server端
- server端接收到client的注冊請求,將注冊信息存入client對象(用于保存client的所有數(shù)據(jù))中,并觸發(fā)ClientChangedEvent、ClientRegisterServiceEvent、InstanceMetadataEvent
- ClientChangedEvent觸發(fā)server節(jié)點之間的數(shù)據(jù)同步(distro協(xié)議)
- ClientRegisterServiceEvent觸發(fā)更新publisherIndexes(保存service => clientId的Map
- InstanceMetadataEvent,處理元數(shù)據(jù),Nacos在2.0中將元數(shù)據(jù)與基礎數(shù)據(jù)拆分開,分為不同的處理流程
- client訂閱服務
- 根據(jù)serviceName、groupName、clusters信息生成key,創(chuàng)建eventListener,同時向server端發(fā)送訂閱請求,并緩存訂閱信息,用于連接斷開重連后再次向server端發(fā)送信息
- server端接收到client的訂閱請求
- 將訂閱信息打包為subscribers,并存入client對象中,觸發(fā)ClientSubscribeServiceEvent事件
- ClientSubscribeServiceEvent事件更新subscriberIndexes(保存service => clientId的Map
- ServiceSubscribedEvent事件會延時500ms向該client推送該服務的最新數(shù)據(jù)
- 反向的操作如注銷、取消訂閱與正向操作類似,不再贅述
最后
本文從總體上分析了Nacos 2.0的模型設計、接口設計以及交互流程,讀完后對Nacos的服務發(fā)現(xiàn)有一個整體上的認識。后續(xù)篇幅會從細節(jié)入手,如dubbo Nacos擴展、一致性協(xié)議、探活、CMDB擴展等逐一進行分析。
分享文章:Nacos注冊中心之概要設計
網(wǎng)站網(wǎng)址:http://fisionsoft.com.cn/article/dhdeopj.html


咨詢
建站咨詢
