<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 為什么這么強!講講實現(xiàn)原理?我懵了..

          共 5009字,需瀏覽 11分鐘

           ·

          2024-04-10 15:47

          來源: blog.csdn.net/cold___play/article/details/108032204

          ? 【干貨】 ChatGPT 4.0 解鎖了,不限制次數(shù)提問 !!! ? 【干貨】 清華學(xué)姐自學(xué)的Linux筆記,天花板級別! ? 【干貨】ChatGPT 4.0 國內(nèi)直接使用,不限制次數(shù) ! ? 【干貨】 ChatGPT中文版 4.0,人人都能用,快速穩(wěn)定 !


          • Nacos架構(gòu)
          • 注冊中心的原理
          • SpringCloud完成注冊的時機(jī)
          • NacosServiceRegistry的實現(xiàn)
          • 服務(wù)提供者地址查詢
          • Nacos服務(wù)地址動態(tài)感知原理

          Nacos架構(gòu)

          d59c5e69dbce62d08cc778e763eea2b1.webp

          圖片
          • Provider APP:服務(wù)提供者
          • Consumer APP:服務(wù)消費者
          • Name Server:通過VIP(Virtual IP)或DNS的方式實現(xiàn)Nacos高可用集群的服務(wù)路由
          • Nacos Server:Nacos服務(wù)提供者,里面包含的Open API是功能訪問入口,Conig Service、Naming Service 是Nacos提供的配置服務(wù)、命名服務(wù)模塊。Consitency Protocol是一致性協(xié)議,用來實現(xiàn)Nacos集群節(jié)點的數(shù)據(jù)同步,這里使用的是Raft算法(Etcd、Redis哨兵選舉)
          • Nacos Console:控制臺

          注冊中心的原理

          • 服務(wù)實例在啟動時注冊到服務(wù)注冊表,并在關(guān)閉時注銷
          • 服務(wù)消費者查詢服務(wù)注冊表,獲得可用實例
          • 服務(wù)注冊中心需要調(diào)用服務(wù)實例的健康檢查API來驗證它是否能夠處理請求

          2e2d9e2528b5d6efe64fc6e6b52303fa.webp

          圖片

          SpringCloud完成注冊的時機(jī)

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

          SpringCloud集成Nacos的實現(xiàn)過程:

          在spring-clou-commons包的META-INF/spring.factories中包含自動裝配的配置信息如下:94eb6cd34d91f2fc57fe2b55f5b8398e.webp其中AutoServiceRegistrationAutoConfiguration就是服務(wù)注冊相關(guān)的配置類:402ab6fc6abb77fb86098b7833a612ad.webp在AutoServiceRegistrationAutoConfiguration配置類中,可以看到注入了一個AutoServiceRegistration實例,該類的關(guān)系圖如下所示。07ef839a5abda25352ce3691a1603cff.webp

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

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

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

          a82d0c1cb26434b64928fc5f5b1107af.webp最終會調(diào)用NacosServiceREgistry.register()方法進(jìn)行服務(wù)注冊。44443d87a1f3a9e9bbc7e1ff12fbfcf2.webp4a14d5db4f0e10202b12fd2a57783c8d.webp

          NacosServiceRegistry的實現(xiàn)

          在NacosServiceRegistry.registry方法中,調(diào)用了Nacos Client SDK中的namingService.registerInstance完成服務(wù)的注冊。36a8d730beac72b66a573c72f2395865.webp跟蹤NacosNamingService的registerInstance()方法:339a644423f58ab87180d3bdba311580.webp

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

          心跳機(jī)制:

          489feb77a34ab53abb84edc6de4644c9.webp

          圖片

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

          注冊原理:

          Nacos提供了SDK和Open API兩種形式來實現(xiàn)服務(wù)注冊。

          Open API:8f06c02db5fecadb3493dc051c13b0b2.webp

          SDK:fa327713eb3379b65766edf8fd060d2c.webp

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

          對于nacos服務(wù)端,對外提供的服務(wù)接口請求地址為nacos/v1/ns/instance,實現(xiàn)代碼咋nacos-naming模塊下的InstanceController類中:86be935dfb0aaf37459190f46792f455.webp

          • 從請求參數(shù)匯總獲得serviceName(服務(wù)名)和namespaceId(命名空間Id)
          • 調(diào)用registerInstance注冊實例

          f4edf5bfc56bb029abd318cbff8449e0.webp

          圖片
          • 創(chuàng)建一個控服務(wù)(在Nacos控制臺“服務(wù)列表”中展示的服務(wù)信息),實際上是初始化一個serviceMap,它是一個ConcurrentHashMap集合
          • getService,從serviceMap中根據(jù)namespaceId和serviceName得到一個服務(wù)對象。微信搜索公眾號:Java后端編程,回復(fù):java 領(lǐng)取資料 。
          • 調(diào)用addInstance添加服務(wù)實例

          2e4d3445bda868bc76f7c16c48a63ce0.webpdb0c4ab0f2fb07bd4a9a1e2c61470b85.webp

          • 根據(jù)namespaceId、serviceName從緩存中獲取Service實例
          • 如果Service實例為空,則創(chuàng)建并保存到緩存中

          e9d07a9c42464d863fe27e9db880e802.webp

          圖片
          • 通過putService()方法將服務(wù)緩存到內(nèi)存
          • service.init()建立心跳機(jī)制
          • consistencyService.listen實現(xiàn)數(shù)據(jù)一致性監(jiān)聽

          service.init ( ) 方法的如下圖所示,它主要通過定時任務(wù)不斷檢測當(dāng)前服務(wù)下所有實例最后發(fā)送心跳包的時間。如果超時,則設(shè)置healthy為false表示服務(wù)不健康,并且發(fā)送服務(wù)變更事件。在這里請大家思考一一個問題,服務(wù)實例的最后心跳包更新時間是誰來觸發(fā)的?實際上前面有講到, Nacos客戶端注冊服務(wù)的同時也建立了心跳機(jī)制。

          d2f212c98eb4fcc1992dec7d91e264d8.webp

          圖片

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

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

          總結(jié):

          • Nacos客戶端通過Open API的形式發(fā)送服務(wù)注冊請求

          • Nacos服務(wù)端收到請求后,做以下三件事:


          1. 構(gòu)建一個Service對象保存到ConcurrentHashMap集合中
          2. 使用定時任務(wù)對當(dāng)前服務(wù)下的所有實例建立心跳檢測機(jī)制
          3. 基于數(shù)據(jù)一致性協(xié)議服務(wù)數(shù)據(jù)進(jìn)行同步

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

          Open API:516e41339f5d3306083ae896e546407f.webp

          SDK:184f7b04fd2b27e0210cec074f78f265.webp

          InstanceController中的list方法:0d8633ec72e8d925f1916734686cfb3b.webp

          • 解析請求參數(shù)
          • 通過doSrvIPXT返回服務(wù)列表數(shù)據(jù)

          33319c117115607ecefde23a24e97b37.webp18a63777c61b9387bf5d8b9cc83aa920.webp

          • 根據(jù)namespaceId、serviceName獲得Service實例
          • 從Service實例中基于srvIPs得到所有服務(wù)提供者實例
          • 遍歷組裝JSON字符串并返回

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

          可以通過subscribe方法來實現(xiàn)監(jiān)聽,其中serviceName表示服務(wù)名、EventListener表示監(jiān)聽到的事件:4f28292483d2e8d7c16cfdc6b427df21.webp

          具體調(diào)用方式如下:34c1d58ec3cf3406025d1b2ec9bfb125.webp

          或者調(diào)用selectInstance方法,如果將subscribe屬性設(shè)置為true,會自動注冊監(jiān)聽:474f23d914394d452a9b2c1120e14b70.webp

          614c146b72850a4ec1119c631597dd7d.webp

          圖片

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

          • 客戶端發(fā)起時間訂閱后,在HostReactor中有一個UpdateTask線程,每10s發(fā)送一次Pull請求,獲得服務(wù)端最新的地址列表
          • 對于服務(wù)端,它和服務(wù)提供者的實例之間維持了心跳檢測,一旦服務(wù)提供者出現(xiàn)異常,則會發(fā)送一個Push消息給Nacos客戶端,也就是服務(wù)端消費者
          • 服務(wù)消費者收到請求之后,使用HostReactor中提供的processServiceJSON解析消息,并更新本地服務(wù)地址列表
                  
                    

          -End-

                    讀到這里說明你
                      喜歡
                      本公眾號的文章,歡迎 
                      
                        置頂(標(biāo)星)
                      
                      本公眾號 Linux技術(shù)迷,這樣就可以第一時間獲取推送了~
                    
          本公眾號 Linux技術(shù)迷,后臺回復(fù): Linux ,領(lǐng)取2T學(xué)習(xí)資料 ! 1. ChatGPT 4.0 + Midjourney繪畫 ,國內(nèi)直接使用 ! 2. 如何成為更好的軟件架構(gòu)師? 3.  ChatGPT 4.0 解鎖了,不限制次數(shù)提問 !!! 4. 2萬字系統(tǒng)總結(jié),帶你實現(xiàn)Linux命令自由
                
                    
                      
                          
                            
                                
                              
                            
          瀏覽 15
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  青青国产 | 伊人操 | 最近中文字幕免费MV第一季歌词十 | 欧美精品三级视频在线看 | 青青草视频免费观看 |