1. 程式人生 > 其它 >Spring Cloud Alibaba Nacos 的 2 種健康檢查機制!

Spring Cloud Alibaba Nacos 的 2 種健康檢查機制!

Spring Cloud Alibaba Nacos 作為註冊中心不止提供了服務註冊和服務發現功能,它還提供了服務可用性監測的機制。有了此機制之後,Nacos 才能感知服務的健康狀態,從而為服務呼叫者提供健康的服務例項,最終保證了業務系統能夠正常的執行。

 

 

兩種健康檢查機制

 

 

Nacos 中提供了兩種健康檢查機制:

 

 

  1. 客戶端主動上報機制。

  2. 伺服器端反向探測機制。

 

 

如何理解這兩種機制呢?
想象下這麼個場景,你所在的地區突然發生地質災害,你被掩蓋在廢墟下面,搜救隊必須要知道你在廢墟里面,那麼才能對你進行施救。那有什麼方法可以讓救援隊知道你在廢墟下面?

 

 

  • 第種,你在廢墟里面大喊 help! help! I am here! ,讓搜救隊知道你的位置和健康狀態。

  • 第二種,搜救隊使用了他們的專業檢查裝置,探測到你正埋在廢墟下面。

 

 

以上這兩種方法和 Nacos 的兩種健康檢查機制類似,也就是客戶端主動上報機制,是客戶端每隔一段時間,主動向 Nacos 伺服器端上報自己的健康狀況,而伺服器端反向探測機制是 Nacos 伺服器端來檢測客戶端是否健康。

 

 

如何設定健康檢查機制?

 

 

Nacos 中的健康檢查機制不能主動設定,但健康檢查機制是和 Nacos 的服務例項型別強相關的。
也就是說 Nacos 中的兩種服務例項分別對應了兩種健康檢查機制:

 

 

  1. 臨時例項(也可以叫做非持久化例項):對應的是客戶端主動上報機制。

  2. 永久例項(也可以叫做持久化例項):服務端反向探測機制。

 

 

以淘寶為例,雙十一大促期間,流量會比平常高出很多,此時服務肯定需要增加更多例項來應對高併發,而這些例項在雙十一之後就無需繼續使用了,採用臨時例項比較合適。而對於服務的一些常備例項,則使用永久例項更合適。

 

 

客戶端主動上報機制

 

 

臨時例項每隔 5 秒會主動上報一次自己的健康狀況,傳送的資料包叫做心跳包,傳送心跳包的機制叫做心跳機制。
如果心跳包的間隔時間超過了 15 秒,那麼 Nacos 伺服器端就會將此服務例項標記為非健康例項,如果心跳包超過了 30s 秒,那麼 Nacos 伺服器端將會把此服務例項從服務列表中刪除掉


執行 Nacos 專案時,可以看到客戶端主動上報心跳包的日誌,如下圖所示:

從上述圖片可以看出,Nacos 客戶端會以每 5s 一次的頻率來上報自己的健康情況,請求資訊如下:

 

 

/nacos/v1/ns/instance/beat?app=unknown&namespaceId=public&port=8081&clusterName=DEFAULT&ip=192.168.3.72&serviceName=DEFAULT_GROUP@@spring-cloud-nacos-producer2

 

 

服務端反向探測機制

 

 

永久例項使用的伺服器端反向探測的方式實現健康檢查的,它的探測週期是 2000 毫秒 + 隨機數(5000 毫秒以內),如果檢測異常會將此服務例項,標記為非健康例項,但不會把服務例項向臨時例項那樣進行刪除。
Nacos 伺服器反向探測目前內建了 3 種探測協議:HTTP 探測、TCP 探測和 MySQL 探測。
般而言 HTTP 和 TCP 探測已經可以涵蓋絕大多數的健康檢查場景,MySQL 主要用於特殊的業務場景,例如資料庫的主備需要通過服務名對外提供訪問,需要確定當前訪問資料庫是否為主庫時,那麼我們此時的健康檢查介面,是個檢查資料庫是否為主庫的 MySQL 命令。

 

 

TCP 探測

 

 

預設情況下,永久例項使用的是 TCP 探測,這點可以在 Nacos 控制檯觀察到,如下圖所示:

預設會使用 IP埠來檢查,如下圖所示:

TCP 探測的大體邏輯是通過與註冊例項建立 channel,不斷 ping 註冊例項的埠,來判斷例項是否健康。

 

 

HTTP 探測

 

 

HTTP 探測需要在 Nacos 控制檯手動配置,如下圖所示:

我們在服務例項中新增探測介面的實現程式碼:

此時我們重新啟動服務例項,在服務詳情中可以看到我們配置的 HTTP 探測已經生效了,可以檢查出例項是健康的,如下圖所示:

Nacos 伺服器端通過檢查 HTTP 的介面是否返回 200 狀態碼,來判斷例項是否為健康狀態。

 

 

叢集下的健康檢查機制

 

 

叢集下的健康檢查機制可以用一句話來概括,那就是“各司其職”。每個服務對應了一個主註冊中心,當註冊中心接收到臨時例項的心跳包之後,將健康狀態同步給其他註冊中心。而永久例項也是類似的,每個服務對應了一個主註冊中心,當負責的註冊中心探測到服務例項的健康狀態發生改變時,再會將例項的健康狀況同步到其他註冊中心,從而實現了叢集下的健康檢查機制。

總結

 

Nacos 中提供了兩種健康檢查機制:臨時例項的客戶端主動上報機制和永久例項的服務端反向探測機制。臨時例項每隔 5s 傳送一個心跳包給 Nacos 伺服器端,伺服器端接收到心跳包之後再將健康狀況同步給其他註冊中心。永久例項支援 3 種探測協議,TCP、HTTP 和 MySQL,預設探測協議為 TCP,也就是通過不斷 ping 的方式來判斷例項是否健康