<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Nacos注冊中心之概要設(shè)計

          共 2957字,需瀏覽 6分鐘

           ·

          2021-08-04 15:54

          前言

          在之前的文章中分析了Nacos配置中心,配置中心的核心是配置的創(chuàng)建、讀取、推送。

          注冊中心的核心比配置中心多一個服務(wù)探活模塊,他倆的相似度非常高,甚至阿里內(nèi)部的注冊中心就叫ConfigServer

          Nacos注冊中心打算分成幾個模塊來分析,本文重點在于概要設(shè)計,基于2.0.0版本。

          環(huán)境搭建

          用Nacos的源碼來搭建源碼閱讀和調(diào)試環(huán)境,可參考《Nacos配置中心模塊詳解》 Nacos調(diào)試環(huán)境搭建部分。

          其中 JVM參數(shù)可以指定只啟動Naming模塊,也可以不指定,默認全都啟動。

          example模塊下將NamingExample復(fù)制一份進行測試。

          設(shè)計概要

          服務(wù)發(fā)現(xiàn)模型

          客戶端視角的服務(wù)發(fā)現(xiàn)模型(注意:服務(wù)端視角的模型定義與客戶端視角有區(qū)別)包含以下幾點內(nèi)容:

          • Service:服務(wù)
          • Cluster:集群
          • Instance:實例

          代碼注釋:We introduce a 'service --> cluster --> instance' model, in which service stores a list of clusters, which contains a list of instances

          他們的關(guān)系如下

          Service

          • name:服務(wù)名
          • protectThreshold:保護閾值,限制了實例被探活摘除的最大比例
          • appName:服務(wù)的應(yīng)用名,暫無實際用處
          • groupName:分組名
          • metadata:元數(shù)據(jù)

          Cluster

          • serviceName:所屬服務(wù)名
          • name:集群名
          • healthChecker:服務(wù)探活配置,此處僅對服務(wù)端主動探活生效,有TCP、HTTP、MySQL、None幾種方式,默認TCP
          • defaultPort:默認端口
          • defaultCheckPort:默認探活端口
          • useIPPort4Check:是否使用port進行探活
          • metadata:元數(shù)據(jù)

          Instance

          • instanceId:實例id,唯一標志,Nacos提供了simplesnowflake兩種算法來生成,默認是simple,其生成方式為ip#port#clusterName#serviceName
          • ip:實例ip
          • port:實例port
          • weight:實例權(quán)重
          • healthy:實例健康狀態(tài)
          • clusterName:所屬集群名
          • serviceName:所屬服務(wù)名
          • metadata:元數(shù)據(jù)
          • enabled:是否接收請求,可用于臨時禁用或摘流等場景
          • ephemeral:是否為臨時實例,后文會介紹該參數(shù)

          • getInstanceHeartBeatInterval:獲取實例心跳上報間隔時間,默認5秒,可配置
          • getInstanceHeartBeatTimeOut:獲取心跳超時時間,15秒,配置
          • getIpDeleteTimeout:獲取ip被刪除的超時時間,默認30秒,可配置
          • getInstanceIdGenerator:獲取id生成器

          除了上述的三層模型外,Nacos注冊中心和配置中心有著一樣的namespace設(shè)計,與client綁定,可隔離環(huán)境,租戶。

          接口設(shè)計

          • registerInstance:注冊實例
          • deregisterInstance:注銷實例
          • getAllInstances:獲取一個服務(wù)的所有實例(包括不健康)
          • selectInstances:根據(jù)條件獲取一個服務(wù)的實例
          • selectOneHealthyInstance:根據(jù)負載均衡策略獲取服務(wù)的一個健康的實例
          • subscribe:訂閱服務(wù)
          • unsubscribe:取消訂閱服務(wù)
          • getServicesOfServer:根據(jù)條件分頁獲取所有服務(wù)

          交互流程

          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 注冊服務(wù),將serviceName+ip+port+clusterName等數(shù)據(jù)打包發(fā)送grpc請求

            • 同時客戶端緩存已注冊過的服務(wù),當(dāng)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<Service, Set>,即哪些客戶端注冊了這個服務(wù)的索引),同時也觸發(fā)一個ServiceChangedEvent,該事件負責(zé)向監(jiān)聽該服務(wù)的客戶端進行推送
            • InstanceMetadataEvent,處理元數(shù)據(jù),Nacos在2.0中將元數(shù)據(jù)與基礎(chǔ)數(shù)據(jù)拆分開,分為不同的處理流程
          • client訂閱服務(wù)

            • 根據(jù)serviceName、groupName、clusters信息生成key,創(chuàng)建eventListener,同時向server端發(fā)送訂閱請求,并緩存訂閱信息,用于連接斷開重連后再次向server端發(fā)送信息
          • server端接收到client的訂閱請求

            • 將訂閱信息打包為subscribers,并存入client對象中,觸發(fā)ClientSubscribeServiceEvent事件
            • ClientSubscribeServiceEvent事件更新subscriberIndexes(保存service => clientId的Map<Service, Set>,即哪些客戶端訂閱了這個服務(wù)的索引),同時觸發(fā)ServiceSubscribedEvent事件
            • ServiceSubscribedEvent事件會延時500ms向該client推送該服務(wù)的最新數(shù)據(jù)
          • 反向的操作如注銷、取消訂閱與正向操作類似,不再贅述

          最后

          本文從總體上分析了Nacos 2.0的模型設(shè)計、接口設(shè)計以及交互流程,讀完后對Nacos的服務(wù)發(fā)現(xiàn)有一個整體上的認識。后續(xù)篇幅會從細節(jié)入手,如dubbo Nacos擴展、一致性協(xié)議、探活、CMDB擴展等逐一進行分析。


          關(guān)于作者:專注后端的中間件開發(fā),公眾號"捉蟲大師"作者,關(guān)注我,給你最純粹的技術(shù)干貨

          - END -
          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久激情亚洲色 | 99在线免费 | 啊啊草,在厕所操视频 | 久久婷婷六月综合 | 成人免费在线观看黄片 |