1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Nacos實(shí)現(xiàn)原理詳解

        共 3319字,需瀏覽 7分鐘

         ·

        2022-05-09 22:56

        Nacos架構(gòu)

        • Provider APP:服務(wù)提供者

        • Consumer APP:服務(wù)消費(fèi)者

        • Name Server:通過(guò)VIP(Virtual IP)或DNS的方式實(shí)現(xiàn)Nacos高可用集群的服務(wù)路由

        • Nacos Server:Nacos服務(wù)提供者,里面包含的Open API是功能訪問(wèn)入口,Conig Service、Naming Service 是Nacos提供的配置服務(wù)、命名服務(wù)模塊。Consitency Protocol是一致性協(xié)議,用來(lái)實(shí)現(xiàn)Nacos集群節(jié)點(diǎn)的數(shù)據(jù)同步,這里使用的是Raft算法(Etcd、Redis哨兵選舉)

        • Nacos Console:控制臺(tái)

        注冊(cè)中心的原理

        • 服務(wù)實(shí)例在啟動(dòng)時(shí)注冊(cè)到服務(wù)注冊(cè)表,并在關(guān)閉時(shí)注銷

        • 服務(wù)消費(fèi)者查詢服務(wù)注冊(cè)表,獲得可用實(shí)例

        • 服務(wù)注冊(cè)中心需要調(diào)用服務(wù)實(shí)例的健康檢查API來(lái)驗(yàn)證它是否能夠處理請(qǐng)求

        SpringCloud完成注冊(cè)的時(shí)機(jī)

        在Spring-Cloud-Common包中有一個(gè)類org.springframework.cloud. client.serviceregistry .ServiceRegistry?,它是Spring Cloud提供的服務(wù)注冊(cè)的標(biāo)準(zhǔn)。集成到Spring Cloud中實(shí)現(xiàn)服務(wù)注冊(cè)的組件,都會(huì)實(shí)現(xiàn)該接口。

        該接口有一個(gè)實(shí)現(xiàn)類是NacoServiceRegistry。

        SpringCloud集成Nacos的實(shí)現(xiàn)過(guò)程:

        spring-clou-commons包的META-INF/spring.factories中包含自動(dòng)裝配的配置信息如下:

        其中AutoServiceRegistrationAutoConfiguration就是服務(wù)注冊(cè)相關(guān)的配置類:

        AutoServiceRegistrationAutoConfiguration配置類中,可以看到注入了一個(gè)AutoServiceRegistration實(shí)例,該類的關(guān)系圖如下所示。

        可以看出,?AbstractAutoServiceRegistration抽象類實(shí)現(xiàn)了該接口,并且最重要的是NacosAutoServiceRegistration繼承了AbstractAutoServiceRegistration

        看到EventListener我們就應(yīng)該知道,Nacos是通過(guò)Spring的事件機(jī)制繼承到SpringCloud中去的。

        AbstractAutoServiceRegistration實(shí)現(xiàn)了onApplicationEvent抽象方法,并且監(jiān)聽(tīng)WebServerInitializedEvent事件(當(dāng)Webserver初始化完成之后) , 調(diào)用this.bind ( event )方法。

        最終會(huì)調(diào)用NacosServiceREgistry.register()方法進(jìn)行服務(wù)注冊(cè)。

        NacosServiceRegistry的實(shí)現(xiàn)

        NacosServiceRegistry.registry方法中,調(diào)用了Nacos Client SDK中的namingService.registerInstance完成服務(wù)的注冊(cè)。

        跟蹤NacosNamingService的registerInstance()方法:

        • 通過(guò)beatReactor.addBeatInfo()創(chuàng)建心跳信息實(shí)現(xiàn)健康檢測(cè), Nacos Server必須要確保注冊(cè)的服務(wù)實(shí)例是健康的,而心跳檢測(cè)就是服務(wù)健康檢測(cè)的手段。

        • serverProxy.registerService()實(shí)現(xiàn)服務(wù)注冊(cè)

        心跳機(jī)制:

        從上述代碼看,所謂心跳機(jī)制就是客戶端通過(guò)schedule定時(shí)向服務(wù)端發(fā)送一個(gè)數(shù)據(jù)包 ,然后啟動(dòng)-個(gè)線程不斷檢測(cè)服務(wù)端的回應(yīng),如果在設(shè)定時(shí)間內(nèi)沒(méi)有收到服務(wù)端的回應(yīng),則認(rèn)為服務(wù)器出現(xiàn)了故障。Nacos服務(wù)端會(huì)根據(jù)客戶端的心跳包不斷更新服務(wù)的狀態(tài)。

        注冊(cè)原理:

        Nacos提供了SDK和Open API兩種形式來(lái)實(shí)現(xiàn)服務(wù)注冊(cè)。

        Open API:

        SDK:

        這兩種形式本質(zhì)都一樣,底層都是基于HTTP協(xié)議完成請(qǐng)求的。所以注冊(cè)服務(wù)就是發(fā)送一個(gè)HTTP請(qǐng)求:

        對(duì)于nacos服務(wù)端,對(duì)外提供的服務(wù)接口請(qǐng)求地址為nacos/v1/ns/instance,實(shí)現(xiàn)代碼咋nacos-naming模塊下的InstanceController類中:

        • 從請(qǐng)求參數(shù)匯總獲得serviceName(服務(wù)名)和namespaceId(命名空間Id)

        • 調(diào)用registerInstance注冊(cè)實(shí)例

        • 創(chuàng)建一個(gè)控服務(wù)(在Nacos控制臺(tái)“服務(wù)列表”中展示的服務(wù)信息),實(shí)際上是初始化一個(gè)serviceMap,它是一個(gè)ConcurrentHashMap集合

        • getService,從serviceMap中根據(jù)namespaceId和serviceName得到一個(gè)服務(wù)對(duì)象

        • 調(diào)用addInstance添加服務(wù)實(shí)例

        • 根據(jù)namespaceId、serviceName從緩存中獲取Service實(shí)例

        • 如果Service實(shí)例為空,則創(chuàng)建并保存到緩存中

        • 通過(guò)putService()方法將服務(wù)緩存到內(nèi)存

        • service.init()建立心跳機(jī)制

        • consistencyService.listen實(shí)現(xiàn)數(shù)據(jù)一致性監(jiān)聽(tīng)

        service.init ( )方法的如下圖所示,它主要通過(guò)定時(shí)任務(wù)不斷檢測(cè)當(dāng)前服務(wù)下所有實(shí)例最后發(fā)送心跳包的時(shí)間。如果超時(shí),則設(shè)置healthy為false表示服務(wù)不健康,并且發(fā)送服務(wù)變更事件。

        在這里請(qǐng)大家思考一一個(gè)問(wèn)題,服務(wù)實(shí)例的最后心跳包更新時(shí)間是誰(shuí)來(lái)觸發(fā)的?實(shí)際上前面有講到, Nacos客戶端注冊(cè)服務(wù)的同時(shí)也建立了心跳機(jī)制。

        putService方法,它的功能是將Service保存到serviceMap中:

        繼續(xù)調(diào)用addInstance方法把當(dāng)前注冊(cè)的服務(wù)實(shí)例保存到Service中:

        總結(jié):

        • Nacos客戶端通過(guò)Open API的形式發(fā)送服務(wù)注冊(cè)請(qǐng)求
        • Nacos服務(wù)端收到請(qǐng)求后,做以下三件事:
          • 構(gòu)建一個(gè)Service對(duì)象保存到ConcurrentHashMap集合中
          • 使用定時(shí)任務(wù)對(duì)當(dāng)前服務(wù)下的所有實(shí)例建立心跳檢測(cè)機(jī)制
          • 基于數(shù)據(jù)一致性協(xié)議服務(wù)數(shù)據(jù)進(jìn)行同步

        服務(wù)提供者地址查詢

        Open API:

        SDK:

        InstanceController中的list方法:

        • 解析請(qǐng)求參數(shù)

        • 通過(guò)doSrvIPXT返回服務(wù)列表數(shù)據(jù)

        • 根據(jù)namespaceId、serviceName獲得Service實(shí)例

        • 從Service實(shí)例中基于srvIPs得到所有服務(wù)提供者實(shí)例

        • 遍歷組裝JSON字符串并返回

        Nacos服務(wù)地址動(dòng)態(tài)感知原理

        可以通過(guò)subscribe方法來(lái)實(shí)現(xiàn)監(jiān)聽(tīng),其中serviceName表示服務(wù)名、EventListener表示監(jiān)聽(tīng)到的事件:

        具體調(diào)用方式如下:

        或者調(diào)用selectInstance方法,如果將subscribe屬性設(shè)置為true,會(huì)自動(dòng)注冊(cè)監(jiān)聽(tīng):

        Nacos客戶端中有一個(gè)HostReactor類,它的功能是實(shí)現(xiàn)服務(wù)的動(dòng)態(tài)更新,基本原理是:

        • 客戶端發(fā)起時(shí)間訂閱后,在HostReactor中有一個(gè)UpdateTask線程,每10s發(fā)送一次Pull請(qǐng)求,獲得服務(wù)端最新的地址列表

        • 對(duì)于服務(wù)端,它和服務(wù)提供者的實(shí)例之間維持了心跳檢測(cè),一旦服務(wù)提供者出現(xiàn)異常,則會(huì)發(fā)送一個(gè)Push消息給Nacos客戶端,也就是服務(wù)端消費(fèi)者

        • 服務(wù)消費(fèi)者收到請(qǐng)求之后,使用HostReactor中提供的processServiceJSON解析消息,并更新本地服務(wù)地址列表

          作者:吳聲子夜歌

          來(lái)源:blog.csdn.net/cold___play/article/details/108032204

          推薦閱讀:

          世界的真實(shí)格局分析,地球人類社會(huì)底層運(yùn)行原理

          不是你需要中臺(tái),而是一名合格的架構(gòu)師(附各大廠中臺(tái)建設(shè)PPT)

          億級(jí)(無(wú)限級(jí))并發(fā),沒(méi)那么難

          論數(shù)字化轉(zhuǎn)型——轉(zhuǎn)什么,如何轉(zhuǎn)?

          華為干部與人才發(fā)展手冊(cè)(附PPT)

          企業(yè)10大管理流程圖,數(shù)字化轉(zhuǎn)型從業(yè)者必備!

          【中臺(tái)實(shí)踐】華為大數(shù)據(jù)中臺(tái)架構(gòu)分享.pdf

          華為的數(shù)字化轉(zhuǎn)型方法論

          華為如何實(shí)施數(shù)字化轉(zhuǎn)型(附PPT)

          超詳細(xì)280頁(yè)Docker實(shí)戰(zhàn)文檔!開(kāi)放下載

          華為大數(shù)據(jù)解決方案(PPT)

          瀏覽 64
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          1. <strong id="7actg"></strong>
          2. <table id="7actg"></table>

          3. <address id="7actg"></address>
            <address id="7actg"></address>
            1. <object id="7actg"><tt id="7actg"></tt></object>
              国产欧美一区二区三区在线看蜜臂 | 麻豆视频一区999 | 成人午夜色情无码视毛片 | 精品人妻一区二区三区奶水 | 亚洲伊人成 | 91九色丨porny丨国产jk | 潘金莲一级淫片免费放动漫 | 免费婬乱AAA大片 | 韩国黄色三级片视频 | 王鸥大尺度做爰未删减 |