java在線學習-Nacos服務註冊的原理分析

魯班學院java源碼學習 java

Nacos提供了SDK和Open API的形式來實現服務註冊。這兩種形式的本質是同樣的,SDK方式只是提供了一種訪問的封裝,在底層仍然是基於HTTP協議完成請求的,因此咱們直接基於Open API請求方式來分析服務端的服務註冊原理。緩存

java在線學習-Nacos服務註冊的原理分析

下載以後解壓並在idea中打開,目錄結構以下:ide

java在線學習-Nacos服務註冊的原理分析

對於服務註冊,對外提供的服務接口地址爲nacos/v1/ns/instance,實現代碼在源碼的nacos-naming模塊下的InstanceController類中。學習

InstanceController.javaidea

java在線學習-Nacos服務註冊的原理分析

接下來咱們重點關注registerInstance方法,它的主要邏輯是:spa

一、建立一個空服務(在Nacos控制檯"服務列表"中展現的服務信息),其實是初始化一個serviceMap,它是一個ConcurrentHashMap集合。3d

二、getService,從serviceMap中根據namespaceId和serviceName獲得一個服務對象。對象

三、調用addInstance添加服務實例。blog

java在線學習-Nacos服務註冊的原理分析

下面簡單分析一下createEmptyService建立空服務的代碼,最終調用的方法是createServiceIfAbsent。接口

根據namespaceId和serviceName從緩存中獲取service實例。

若是service實例爲空,則建立並保存到緩存中。

java在線學習-Nacos服務註冊的原理分析

沒有太多複雜的邏輯,主要關注putServiceAndInit方法,它實現瞭如下功能:

經過putService方法將服務緩存到內存。

service.init()創建心跳檢測機制。

consistencyService.listen()實現數據一致性的監聽。

java在線學習-Nacos服務註冊的原理分析

service.init()的功能主要是經過定時任務不斷檢測當前服務下全部實例最後發送心跳包的時間,若是超時,則設置healthy爲false表示服務不健康,而且發送服務變動事件。

java在線學習-Nacos服務註冊的原理分析
java在線學習-Nacos服務註冊的原理分析

下面看putService方法,它的功能是將service保存到serviceMap中。

java在線學習-Nacos服務註冊的原理分析

上面的步驟完成以後,繼續調用addInstance方法把當前註冊的服務實例保存到Service中。

java在線學習-Nacos服務註冊的原理分析

這樣,服務的註冊基本上就完成了。

最後總結一下服務註冊的完整過程:

Nacos客戶端經過Open API的形式發生服務註冊請求。

Nacos服務端收到請求後,作如下3件事:

一、構建一個Service對象保存到ConcurrentHashMap集合中。

二、使用定時任務對當前服務下的全部實例創建心跳檢測機制。

三、基於數據一致性協議將服務數據進行同步。

相關文章
相關標籤/搜索