<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>

          從實現(xiàn)原理來講,Nacos 為什么這么強

          共 3216字,需瀏覽 7分鐘

           ·

          2022-04-17 20:12

          2ea144fd4a07f6ae044b603e610d7c10.webp

          大家好,我是寶哥!

          Nacos架構

          3196cb21e6669de221432c2d09e24cf5.webp
          • Provider APP:服務提供者

          • Consumer APP:服務消費者

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

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

          • Nacos Console:控制臺

          注冊中心的原理

          • 服務實例在啟動時注冊到服務注冊表,并在關閉時注銷

          • 服務消費者查詢服務注冊表,獲得可用實例

          • 服務注冊中心需要調用服務實例的健康檢查API來驗證它是否能夠處理請求

          e2819b3a94e82b3c629d8071a78db634.webp

          SpringCloud完成注冊的時機

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

          98dc5ef92c09dd1c1d4420d329ccdddc.webp

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

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

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

          14a4928bb717452e760160b4fab4bcad.webp

          其中AutoServiceRegistrationAutoConfiguration就是服務注冊相關的配置類:

          8655ca1ca12a48cd119e8cd061f82cec.webp

          AutoServiceRegistrationAutoConfiguration配置類中,可以看到注入了一個AutoServiceRegistration實例,該類的關系圖如下所示。

          430aa8241254b4e3154aa5252c6a1ce5.webp

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

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

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

          0f710636b4ea5fdc5e7b477121196347.webp

          最終會調用NacosServiceREgistry.register()方法進行服務注冊。

          057dde9458be8462f32d6d2ab0a36e9b.webpc93ca9d71d2eb3b6e3c24918e4184b81.webp

          NacosServiceRegistry的實現(xiàn)

          NacosServiceRegistry.registry方法中,調用了Nacos Client SDK中的namingService.registerInstance完成服務的注冊。

          51c5a23e538a4521cc3e9962dc584726.webp

          跟蹤NacosNamingService的registerInstance()方法:

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

          • serverProxy.registerService()實現(xiàn)服務注冊

          心跳機制:

          ad937b7aab385660a0afcab81ef526e8.webp

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

          注冊原理:

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

          Open API:

          18a6b7a1b2f49b977b1c243258f4f19c.webp

          SDK:

          d7ad6d60fd1b3573491cf765276cafc9.webp

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

          340fd2c3a44ad3c6c2e1e594980e6167.webp

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

          687198f33b53f523fc47a9bbe37bce78.webp
          • 從請求參數(shù)匯總獲得serviceName(服務名)和namespaceId(命名空間Id)

          • 調用registerInstance注冊實例

          b45c82f59ae29dfeb03b24a723f20285.webp
          • 創(chuàng)建一個控服務(在Nacos控制臺“服務列表”中展示的服務信息),實際上是初始化一個serviceMap,它是一個ConcurrentHashMap集合

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

          • 調用addInstance添加服務實例

          fe96f9cbb95ac1493bb2e521729b2889.webp06bc879ae0e288a891c87f92951bad9b.webp
          • 根據(jù)namespaceId、serviceName從緩存中獲取Service實例

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

          f9f91db2a5f59d4101183d566a3fba0b.webp
          • 通過putService()方法將服務緩存到內存

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

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

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

          在這里請大家思考一一個問題,服務實例的最后心跳包更新時間是誰來觸發(fā)的?實際上前面有講到, Nacos客戶端注冊服務的同時也建立了心跳機制。

          3566de455cd6a2c1d083d3361d5b652a.webp

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

          ef9eedeb4ecdbbd01b8e78377df6e32c.webp

          繼續(xù)調用addInstance方法把當前注冊的服務實例保存到Service中:

          84e8e7c1ec1dab2cd6156148e0b87d5d.webp

          總結:

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

          服務提供者地址查詢

          Open API:

          e434a7441a0123786c0d6e6a1120747e.webp

          SDK:

          4fda8291fec21f788ef5e070b11f556b.webp

          InstanceController中的list方法:

          42bfe76ca0390578b0f694ac8d5387bc.webp
          • 解析請求參數(shù)

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

          d6675e02f3f27d1bbeb3656434690e3e.webp27f9d93cf5e7509fec49fcf42e3e69ac.webp
          • 根據(jù)namespaceId、serviceName獲得Service實例

          • 從Service實例中基于srvIPs得到所有服務提供者實例

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

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

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

          ed2412553b0fbfdbb01513292a5096b0.webp

          具體調用方式如下:

          904faf3045b760d90c3c79192aa672ff.webp

          或者調用selectInstance方法,如果將subscribe屬性設置為true,會自動注冊監(jiān)聽:

          ae14736b0d42a211f7f507c4924ff96d.webp0e842b9f80b87c8f18d55e9df418dd23.webp

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

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

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

          • 服務消費者收到請求之后,使用HostReactor中提供的processServiceJSON解析消息,并更新本地服務地址列表

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

          details/108032204

          精彩推薦:

          大文件上傳最全方案:秒傳、斷點續(xù)傳、分片上傳

          老板要我開發(fā)一個簡單的工作流引擎

          Spring+websocket+quartz實現(xiàn)消息定時推送

          一口氣說出 6 種實現(xiàn)延時消息的方案

          微服務架構統(tǒng)一安全認證設計與實踐

          瀏覽 61
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  亚洲国产伦理 | 国产成人无码在线高清播放 | 欧美成人性爱在线播放 | 国产精品视频在线播放 | 亚洲中文日韩无码 |