日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

萬字+20張圖探秘Nacos注冊中心核心實現原理

來源: 責編: 時間:2024-01-03 09:12:29 204觀看
導讀大家好,我是三友~~今天就應某位小伙伴的要求,來講一講Nacos作為服務注冊中心底層的實現原理不知你是否跟我一樣,在使用Nacos時有以下幾點疑問:臨時實例和永久實例是什么?有什么區別?服務實例是如何注冊到服務端的?服務實例和

大家好,我是三友~~uox28資訊網——每日最新資訊28at.com

今天就應某位小伙伴的要求,來講一講Nacos作為服務注冊中心底層的實現原理uox28資訊網——每日最新資訊28at.com

不知你是否跟我一樣,在使用Nacos時有以下幾點疑問:uox28資訊網——每日最新資訊28at.com

  • 臨時實例和永久實例是什么?有什么區別?
  • 服務實例是如何注冊到服務端的?
  • 服務實例和服務端之間是如何保活的?
  • 服務訂閱是如何實現的?
  • 集群間數據是如何同步的?CP還是AP?
  • Nacos的數據模型是什么樣的?
  • ...

本文就通過探討上述問題來探秘Nacos服務注冊中心核心的底層實現原理。uox28資訊網——每日最新資訊28at.com

雖然Nacos最新版本已經到了2.x版本,但是為了照顧那些還在用1.x版本的同學,所以本文我會同時去講1.x版本和2.x版本的實現uox28資訊網——每日最新資訊28at.com

觀前提醒,本文又又又是一篇超長的干貨,非常適合一鍵三連~~uox28資訊網——每日最新資訊28at.com

臨時實例和永久實例

臨時實例和永久實例在Nacos中是一個非常非常重要的概念uox28資訊網——每日最新資訊28at.com

之所以說它重要,主要是因為我在讀源碼的時候發現,臨時實例和永久實例在底層的許多實現機制是完全不同的uox28資訊網——每日最新資訊28at.com

臨時實例uox28資訊網——每日最新資訊28at.com

臨時實例在注冊到注冊中心之后僅僅只保存在服務端內部一個緩存中,不會持久化到磁盤uox28資訊網——每日最新資訊28at.com

這個服務端內部的緩存在注冊中心屆一般被稱為服務注冊表uox28資訊網——每日最新資訊28at.com

當服務實例出現異常或者下線之后,就會把這個服務實例從服務注冊表中剔除uox28資訊網——每日最新資訊28at.com

永久實例uox28資訊網——每日最新資訊28at.com

永久服務實例不僅僅會存在服務注冊表中,同時也會被持久化到磁盤文件中uox28資訊網——每日最新資訊28at.com

當服務實例出現異常或者下線,Nacos只會將服務實例的健康狀態設置為不健康,并不會對將其從服務注冊表中剔除uox28資訊網——每日最新資訊28at.com

所以這個服務實例的信息你還是可以從注冊中心看到,只不過處于不健康狀態uox28資訊網——每日最新資訊28at.com

這是就是兩者最最最基本的區別uox28資訊網——每日最新資訊28at.com

當然除了上述最基本的區別之外,兩者還有很多其它的區別,接下來本文還會提到uox28資訊網——每日最新資訊28at.com

這里你可能會有一個疑問uox28資訊網——每日最新資訊28at.com

為什么Nacos要將服務實例分為臨時實例和永久實例?uox28資訊網——每日最新資訊28at.com

主要還是因為應用場景不同uox28資訊網——每日最新資訊28at.com

臨時實例就比較適合于業務服務,服務下線之后可以不需要在注冊中心中查看到uox28資訊網——每日最新資訊28at.com

永久實例就比較適合需要運維的服務,這種服務幾乎是永久存在的,比如說MySQL、Redis等等uox28資訊網——每日最新資訊28at.com

MySQL、Redis等服務實例可以通過SDK手動注冊uox28資訊網——每日最新資訊28at.com

對于這些服務,我們需要一直看到服務實例的狀態,即使出現異常,也需要能夠查看時實的狀態uox28資訊網——每日最新資訊28at.com

所以從這可以看出Nacos跟你印象中的注冊中心不太一樣,他不僅僅可以注冊平時業務中的實例,還可以注冊像MySQL、Redis這個服務實例的信息到注冊中心uox28資訊網——每日最新資訊28at.com

在SpringCloud環境底下,一般其實都是業務服務,所以默認注冊服務實例都是臨時實例uox28資訊網——每日最新資訊28at.com

當然如果你想改成永久實例,可以通過下面這個配置項來完成uox28資訊網——每日最新資訊28at.com

spring  cloud:    nacos:      discovery:        #ephemeral單詞是臨時的意思,設置成false,就是永久實例了        ephemeral: false

這里還有一個小細節uox28資訊網——每日最新資訊28at.com

在1.x版本中,一個服務中可以既有臨時實例也有永久實例,服務實例是永久還是臨時是由服務實例本身決定的uox28資訊網——每日最新資訊28at.com

但是2.x版本中,一個服務中的所有實例要么都是臨時的要么都是永久的,是由服務決定的,而不是具體的服務實例uox28資訊網——每日最新資訊28at.com

所以在2.x可以說是臨時服務和永久服務uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

為什么2.x把臨時還是永久的屬性由實例本身決定改成了由服務決定?uox28資訊網——每日最新資訊28at.com

其實很簡單,你想想,假設對一個MySQL服務來說,它的每個服務實例肯定都是永久的,不會出現一些是永久的,一些是臨時的情況吧uox28資訊網——每日最新資訊28at.com

所以臨時還是永久的屬性由服務本身決定其實就更加合理了uox28資訊網——每日最新資訊28at.com

服務注冊

作為一個服務注冊中心,服務注冊肯定是一個非常重要的功能uox28資訊網——每日最新資訊28at.com

所謂的服務注冊,就是通過注冊中心提供的客戶端SDK(或者是控制臺)將服務本身的一些元信息,比如ip、端口等信息發送到注冊中心服務端uox28資訊網——每日最新資訊28at.com

服務端在接收到服務之后,會將服務的信息保存到前面提到的服務注冊表中uox28資訊網——每日最新資訊28at.com

1、1.x版本的實現

在Nacos在1.x版本的時候,服務注冊是通過Http接口實現的uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

代碼如下uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

整個邏輯比較簡單,因為Nacos服務端本身就是用SpringBoot寫的uox28資訊網——每日最新資訊28at.com

但是在2.x版本的實現就比較復雜了uox28資訊網——每日最新資訊28at.com

2、2.x版本的實現

2.1、通信協議的改變

2.x版本相比于1.x版本最主要的升級就是客戶端和服務端通信協議的改變,由1.x版本的Http改成了2.x版本gRPCuox28資訊網——每日最新資訊28at.com

gRPC是谷歌公司開發的一個高性能、開源和通用的RPC框架,Java版本的實現底層也是基于Netty來的uox28資訊網——每日最新資訊28at.com

之所以改成了gRPC,主要是因為Http請求會頻繁創建和銷毀連接,白白浪費資源uox28資訊網——每日最新資訊28at.com

所以在2.x版本之后,為了提升性能,就將通信協議改成了gRPCuox28資訊網——每日最新資訊28at.com

根據官網顯示,整體的效果還是很明顯,相比于1.x版本,注冊性能總體提升至少2倍uox28資訊網——每日最新資訊28at.com

雖然通信方式改成了gRPC,但是2.x版本服務端依然保留了Http注冊的接口,所以用1.x的Nacos SDK依然可以注冊到2.x版本的服務端uox28資訊網——每日最新資訊28at.com

2.2、具體的實現

Nacos客戶端在啟動的時候,會通過gRPC跟服務端建立長連接uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

這個連接會一直存在,之后客戶端與服務端所有的通信都是基于這個長連接來的uox28資訊網——每日最新資訊28at.com

當客戶端發起注冊的時候,就會通過這個長連接,將服務實例的信息發送給服務端uox28資訊網——每日最新資訊28at.com

服務端拿到服務實例,跟1.x一樣,也會存到服務注冊表uox28資訊網——每日最新資訊28at.com

除了注冊之外,當注冊的是臨時實例時,2.x還會將服務實例信息存儲到客戶端中的一個緩存中,供Redo操作uox28資訊網——每日最新資訊28at.com

所謂的Redo操作,其實就是一個補償機制,本質是個定時任務,默認每3s執行一次uox28資訊網——每日最新資訊28at.com

這個定時任務作用是,當客戶端與服務端重新建立連接時(因為一些異常原因導致連接斷開)uox28資訊網——每日最新資訊28at.com

那么之前注冊的服務實例肯定還要繼續注冊服務端(斷開連接服務實例就會被剔除服務注冊表)uox28資訊網——每日最新資訊28at.com

所以這個Redo操作一個很重要的作用就是重連之后的重新注冊的作用uox28資訊網——每日最新資訊28at.com

除了注冊之外,比如服務訂閱之類的操作也需要Redo操作,當連接重新建立,之前客戶端的操作都需要Redo一下uox28資訊網——每日最新資訊28at.com

小總結

1.x版本是通過Http協議來進行服務注冊的uox28資訊網——每日最新資訊28at.com

2.x由于客戶端與服務端的通信改成了gRPC長連接,所以改成通過gRPC長連接來注冊uox28資訊網——每日最新資訊28at.com

2.x比1.x多個Redo操作,當注冊的服務實例是臨時實例是,出現網絡異常,連接重新建立之后,客戶端需要將服務注冊、服務訂閱之類的操作進行重做uox28資訊網——每日最新資訊28at.com

這里你可能會有個疑問uox28資訊網——每日最新資訊28at.com

既然2.x有Redo機制保證客戶端與服務端通信正常之后重新注冊,那么1.x有類似的這種Redo機制么?uox28資訊網——每日最新資訊28at.com

當然也會有,接下往下看。uox28資訊網——每日最新資訊28at.com

心跳機制

心跳機制,也可以被稱為保活機制,它的作用就是服務實例告訴注冊中心我這個服務實例還活著uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

在正常情況下,服務關閉了,那么服務會主動向Nacos服務端發送一個服務下線的請求uox28資訊網——每日最新資訊28at.com

Nacos服務端在接收到請求之后,會將這個服務實例從服務注冊表中剔除uox28資訊網——每日最新資訊28at.com

但是對于異常情況下,比如出現網絡問題,可能導致這個注冊的服務實例無法提供服務,處于不可用狀態,也就是不健康uox28資訊網——每日最新資訊28at.com

而此時在沒有任何機制的情況下,服務端是無法知道這個服務處于不可用狀態uox28資訊網——每日最新資訊28at.com

所以為了避免這種情況,一些注冊中心,就比如Nacos、Eureka,就會用心跳機制來判斷這個服務實例是否能正常uox28資訊網——每日最新資訊28at.com

在Nacos中,心跳機制僅僅是針對臨時實例來說的,臨時實例需要靠心跳機制來保活uox28資訊網——每日最新資訊28at.com

心跳機制在1.x和2.x版本的實現也是不一樣的uox28資訊網——每日最新資訊28at.com

1.x心跳實現

在1.x中,心跳機制實現是通過客戶端和服務端各存在的一個定時任務來完成的uox28資訊網——每日最新資訊28at.com

在服務注冊時,發現是臨時實例,客戶端會開啟一個5s執行一次的定時任務uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

這個定時任務會構建一個Http請求,攜帶這個服務實例的信息,然后發送到服務端uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

在Nacos服務端也會開啟一個定時任務,默認也是5s執行一次,去檢查這些服務實例最后一次心跳的時間,也就是客戶端最后一次發送Http請求的時間uox28資訊網——每日最新資訊28at.com

  • 當最后一次心跳時間超過15s,但沒有超過30s,會把這服務實例標記成不健康
  • 當最后一次心跳超過30s,直接把服務從服務注冊表中剔除

圖片圖片uox28資訊網——每日最新資訊28at.com

這就是1.x版本的心跳機制,本質就是兩個定時任務uox28資訊網——每日最新資訊28at.com

其實1.x的這個心跳還有一個作用,就是跟上一節說的gRPC時Redo操作的作用是一樣的uox28資訊網——每日最新資訊28at.com

服務在處理心跳的時候,發現心跳攜帶這個服務實例的信息在注冊表中沒有,此時就會添加到服務注冊表uox28資訊網——每日最新資訊28at.com

所以心跳也有Redo的類似效果uox28資訊網——每日最新資訊28at.com

2.x心跳實現

在2.x版本之后,由于通信協議改成了gRPC,客戶端與服務端保持長連接,所以2.x版本之后它是利用這個gRPC長連接本身的心跳來保活uox28資訊網——每日最新資訊28at.com

一旦這個連接斷開,服務端就會認為這個連接注冊的服務實例不可用,之后就會將這個服務實例從服務注冊表中提出剔除uox28資訊網——每日最新資訊28at.com

除了連接本身的心跳之外,Nacos還有服務端的一個主動檢測機制uox28資訊網——每日最新資訊28at.com

Nacos服務端也會啟動一個定時任務,默認每隔3s執行一次uox28資訊網——每日最新資訊28at.com

這個任務會去檢查超過20s沒有發送請求數據的連接uox28資訊網——每日最新資訊28at.com

一旦發現有連接已經超過20s沒發送請求,那么就會向這個連接對應的客戶端發送一個請求uox28資訊網——每日最新資訊28at.com

如果請求不通或者響應失敗,此時服務端也會認為與客戶端的這個連接異常,從而將這個客戶端注冊的服務實例從服務注冊表中剔除uox28資訊網——每日最新資訊28at.com

所以對于2.x版本,主要是兩種機制來進行保活:uox28資訊網——每日最新資訊28at.com

  • 連接本身的心跳機制,斷開就直接剔除服務實例
  • Nacos主動檢查機制,服務端會對20s沒有發送數據的連接進行檢查,出現異常時也會主動斷開連接,剔除服務實例

小總結

心跳機制僅僅針對臨時實例而言uox28資訊網——每日最新資訊28at.com

1.x心跳機制是通過客戶端和服務端兩個定時任務來完成的,客戶端定時上報心跳信息,服務端定時檢查心跳時間,超過15s標記不健康,超過30s直接剔除uox28資訊網——每日最新資訊28at.com

1.x心跳機制還有類似2.x的Redo作用,服務端發現心跳的服務信息不存在會,會將服務信息添加到注冊表,相當于重新注冊了uox28資訊網——每日最新資訊28at.com

2.x是基于gRPC長連接本身的心跳機制和服務端的定時檢查機制來的,出現異常直接剔除uox28資訊網——每日最新資訊28at.com

健康檢查

前面說了,心跳機制僅僅是臨時實例用來保護的機制uox28資訊網——每日最新資訊28at.com

而對于永久實例來說,一般來說無法主動上報心跳uox28資訊網——每日最新資訊28at.com

就比如說MySQL實例,肯定是不會主動上報心跳到Nacos的,所以這就導致無法通過心跳機制來保活uox28資訊網——每日最新資訊28at.com

所以針對永久實例的情況,Nacos通過一種叫健康檢查的機制去判斷服務實例是否活著uox28資訊網——每日最新資訊28at.com

健康檢查跟心跳機制剛好相反,心跳機制是服務實例向服務端發送請求uox28資訊網——每日最新資訊28at.com

而所謂的健康檢查就是服務端主動向服務實例發送請求,去探測服務實例是否活著uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

健康檢查機制在1.x和2.x的實現機制是一樣的uox28資訊網——每日最新資訊28at.com

Nacos服務端在會去創建一個健康檢查任務,這個任務每次執行時間間隔會在2000~7000毫秒之間uox28資訊網——每日最新資訊28at.com

當任務觸發的時候,會根據設置的健康檢查的方式執行不同的邏輯,目前主要有以下三種方式:uox28資訊網——每日最新資訊28at.com

  • TCP
  • HTTP
  • MySQL

TCP的方式就是根據服務實例的ip和端口去判斷是否能連接成功,如果連接成功,就認為健康,反之就任務不健康uox28資訊網——每日最新資訊28at.com

HTTP的方式就是向服務實例的ip和端口發送一個Http請求,請求路徑是需要設置的,如果能正常請求,說明實例健康,反之就不健康uox28資訊網——每日最新資訊28at.com

MySQL的方式是一種特殊的檢查方式,他可以執行下面這條Sql來判斷數據庫是不是主庫uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

默認情況下,都是通過TCP的方式來探測服務實例是否還活著uox28資訊網——每日最新資訊28at.com

服務發現

所謂的服務發現就是指當有服務實例注冊成功之后,其它服務可以發現這些服務實例uox28資訊網——每日最新資訊28at.com

Nacos提供了兩種發現方式:uox28資訊網——每日最新資訊28at.com

  • 主動查詢
  • 服務訂閱

主動查詢就是指客戶端主動向服務端查詢需要關注的服務實例,也就是拉(pull)的模式uox28資訊網——每日最新資訊28at.com

服務訂閱就是指客戶端向服務端發送一個訂閱服務的請求,當被訂閱的服務有信息變動就會主動將服務實例的信息推送給訂閱的客戶端,本質就是推(push)模式uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

在我們平時使用時,一般來說都是選擇使用訂閱的方式,這樣一旦有服務實例數據的變動,客戶端能夠第一時間感知uox28資訊網——每日最新資訊28at.com

并且Nacos在整合SpringCloud的時候,默認就是使用訂閱的方式uox28資訊網——每日最新資訊28at.com

對于這兩種服務發現方式,1.x和2.x版本實現也是不一樣uox28資訊網——每日最新資訊28at.com

服務查詢其實兩者實現都很簡單uox28資訊網——每日最新資訊28at.com

1.x整體就是發送Http請求去查詢服務實例,2.x只不過是將Http請求換成了gRPC的請求uox28資訊網——每日最新資訊28at.com

服務端對于查詢的處理過程都是一樣的,從服務注冊表中查出符合查詢條件的服務實例進行返回uox28資訊網——每日最新資訊28at.com

不過對于服務訂閱,兩者的機制就稍微復雜一點uox28資訊網——每日最新資訊28at.com

在Nacos客戶端,不論是1.x還是2.x都是通過SDK中的NamingService#subscribe方法來發起訂閱的uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

當有服務實例數據變動的時,客戶端就會回調EventListener,就可以拿到最新的服務實例數據了uox28資訊網——每日最新資訊28at.com

雖然1.x還是2.x都是同樣的方法,但是具體的實現邏輯是不一樣的uox28資訊網——每日最新資訊28at.com

1.x服務訂閱實現

在1.x版本的時候,服務訂閱的處理邏輯大致會有以下三步:uox28資訊網——每日最新資訊28at.com

第一步,客戶端在啟動的時候,會去構建一個叫PushReceiver的類uox28資訊網——每日最新資訊28at.com

這個類會去創建一個UDP Socket,端口是隨機的uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

其實通過名字就可以知道這個類的作用,就是通過UDP的方式接收服務端推送的數據的uox28資訊網——每日最新資訊28at.com

第二步,調用NamingService#subscribe來發起訂閱時,會先去服務端查詢需要訂閱服務的所有實例信息uox28資訊網——每日最新資訊28at.com

之后會將所有服務實例數據存到客戶端的一個內部緩存中uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

并且在查詢的時候,會將這個UDP Socket的端口作為一個參數傳到服務端uox28資訊網——每日最新資訊28at.com

服務端接收到這個UDP端口后,后續就通過這個端口給客戶端推送服務實例數據uox28資訊網——每日最新資訊28at.com

第三步,會為這次訂閱開啟一個不定時執行的任務uox28資訊網——每日最新資訊28at.com

之所以不定時,是因為這個當執行異常的時候,下次執行的時間間隔就會變長,但是最多不超過60s,正常是10s,這個10s是查詢服務實例是服務端返回的uox28資訊網——每日最新資訊28at.com

這個任務會去從服務端查詢訂閱的服務實例信息,然后更新內部緩存uox28資訊網——每日最新資訊28at.com

這里你可能會有個疑問uox28資訊網——每日最新資訊28at.com

既然有了服務變動推送的功能,為什么還要定時去查詢更新服務實例信息呢?uox28資訊網——每日最新資訊28at.com

其實很簡單,那就是因為UDP通信不穩定導致的uox28資訊網——每日最新資訊28at.com

雖然有Push,但是由于UDP通信自身的不確定性,有可能會導致客戶端接收變動信息失敗uox28資訊網——每日最新資訊28at.com

所以這里就加了一個定時任務,彌補這種可能性,屬于一個兜底的方案。uox28資訊網——每日最新資訊28at.com

這就是1.x版本的服務訂閱的實現uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

2.x服務訂閱的實現

講完1.x的版本實現,接下來就講一講2.x版本的實現uox28資訊網——每日最新資訊28at.com

由于2.x版本換成了gRPC長連接的方式,所以2.x版本服務數據變更推送已經完全拋棄了1.x的UDP做法uox28資訊網——每日最新資訊28at.com

當有服務實例變動的時候,服務端直接通過這個長連接將服務信息發送給客戶端uox28資訊網——每日最新資訊28at.com

客戶端拿到最新服務實例數據之后的處理方式就跟1.x是一樣了uox28資訊網——每日最新資訊28at.com

除了處理方式一樣,2.x也繼承了1.x的其他的東西uox28資訊網——每日最新資訊28at.com

比如客戶端依然會有服務實例的緩存uox28資訊網——每日最新資訊28at.com

定時對比機制也保留了,只不過這個定時對比的機制默認是關閉狀態uox28資訊網——每日最新資訊28at.com

之所以默認關閉,主要還是因為長連接還是比較穩定的原因uox28資訊網——每日最新資訊28at.com

當客戶端出現異常,接收不到請求,那么服務端會直接跟客戶端斷開連接uox28資訊網——每日最新資訊28at.com

當恢復正常,由于有Redo操作,所以還是能拿到最新的實例信息的uox28資訊網——每日最新資訊28at.com

所以2.x版本的服務訂閱功能的實現大致如下圖所示uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

這里還有個細節需要注意uox28資訊網——每日最新資訊28at.com

在1.x版本的時候,任何服務都是可以被訂閱的uox28資訊網——每日最新資訊28at.com

但是在2.x版本中,只支持訂閱臨時服務,對于永久服務,已經不支持訂閱了uox28資訊網——每日最新資訊28at.com

小總結

服務查詢1.x是通過Http請求;2.x通過gRPC請求uox28資訊網——每日最新資訊28at.com

服務訂閱1.x是通過UDP來推送的;2.x就基于gRPC長連接來實現的uox28資訊網——每日最新資訊28at.com

1.x和2.x客戶端都有服務實例的緩存,也有定時對比機制,只不過1.x會自動開啟;2.x提供了一個開個,可以手動選擇是否開啟,默認不開啟uox28資訊網——每日最新資訊28at.com

數據一致性

由于Nacos是支持集群模式的,所以一定會涉及到分布式系統中不可避免的數據一致性問題uox28資訊網——每日最新資訊28at.com

1、服務實例的責任機制

再說數據一致性問題之前,先來討論一下服務實例的責任機制uox28資訊網——每日最新資訊28at.com

什么是服務實例的責任機制?uox28資訊網——每日最新資訊28at.com

比如上面提到的服務注冊、心跳管理、監控檢查機制,當只有一個Nacos服務時,那么自然而言這個服務會去檢查所有的服務實例的心跳時間,執行所有服務實例的健康檢查任務uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

但是當出現Nacos服務出現集群時,為了平衡各Nacos服務的壓力,Nacos會根據一定的規則讓每個Nacos服務只管理一部分服務實例的uox28資訊網——每日最新資訊28at.com

當然每個Nacos服務的注冊表還是全部的服務實例數據uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

這個管理機制我給他起了一個名字,就叫做責任機制,因為我在1.x和2.x都提到了responsible這個單詞uox28資訊網——每日最新資訊28at.com

本質就是Nacos服務對哪些服務實例負有心跳監測,健康檢查的責任。uox28資訊網——每日最新資訊28at.com

2、CAP定理和BASE理論

談到數據一致性問題,一定離不開兩個著名分布式理論uox28資訊網——每日最新資訊28at.com

  • CAP定理
  • BASE理論

CAP定理中,三個字母分別代表這些含義:uox28資訊網——每日最新資訊28at.com

  • C,Consistency單詞的縮寫,代表一致性,指分布式系統中各個節點的數據保持強一致,也就是每個時刻都必須一樣,不一樣整個系統就不能對外提供服務
  • A,Availability單詞的縮寫,代表可用性,指整個分布式系統保持對外可用,即使從每個節點獲取的數據可能都不一樣,只要能獲取到就行
  • P,Partition tolerance單詞的縮寫,代表分區容錯性。

所謂的CAP定理,就是指在一個分布式系統中,CAP這三個指標,最多同時只能滿足其中的兩個,不可能三個都同時滿足uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

為什么三者不能同時滿足?uox28資訊網——每日最新資訊28at.com

對于一個分布式系統,網絡分區是一定需要滿足的uox28資訊網——每日最新資訊28at.com

而所謂分區指的是系統中的服務部署在不同的網絡區域中uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

比如,同一套系統可能同時在北京和上海都有部署,那么他們就處于不同的網絡分區,就可能出現無法互相訪問的情況uox28資訊網——每日最新資訊28at.com

當然,你也可以把所有的服務都放在一個網絡分區,但是當網絡出現故障時,整個系統都無法對外提供服務,那這還有什么意義呢?uox28資訊網——每日最新資訊28at.com

所以分布式系統一定需要滿足分區容錯性,把系統部署在不同的區域網絡中uox28資訊網——每日最新資訊28at.com

此時只剩下了一致性和可用性,它們為什么不能同時滿足?uox28資訊網——每日最新資訊28at.com

其實答案很簡單,就因為可能出現網絡分區導致的通信失敗。uox28資訊網——每日最新資訊28at.com

比如說,現在出現了網絡分區的問題,上圖中的A網絡區域和B網絡區域無法相互訪問uox28資訊網——每日最新資訊28at.com

此時假設往上圖中的A網絡區域發送請求,將服務中的一個值 i 屬性設置成 1uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

如果保證可用性,此時由于A和B網絡不通,此時只有A中的服務修改成功,B無法修改成功,此時數據AB區域數據就不一致性,也就沒有保證數據一致性uox28資訊網——每日最新資訊28at.com

如果保證一致性,此時由于A和B網絡不通,所以此時A也不能修改成功,必須修改失敗,否則就會導致AB數據不一致uox28資訊網——每日最新資訊28at.com

雖然A沒修改成功,保證了數據一致性,AB還是之前相同的數據,但是此時整個系統已經沒有寫可用性了,無法成功寫數據了。uox28資訊網——每日最新資訊28at.com

所以從上面分析可以看出,在有分區容錯性的前提下,可用性和一致性是無法同時保證的。uox28資訊網——每日最新資訊28at.com

雖然無法同時一致性和可用性,但是能不能換種思路來思考一下這個問題uox28資訊網——每日最新資訊28at.com

首先我們可以先保證系統的可用性,也就是先讓系統能夠寫數據,將A區域服務中的i修改成1uox28資訊網——每日最新資訊28at.com

之后當AB區域之間網絡恢復之后,將A區域的i值復制給B區域,這樣就能夠保證AB區域間的數據最終是一致的了uox28資訊網——每日最新資訊28at.com

這不就皆大歡喜了么uox28資訊網——每日最新資訊28at.com

這種思路其實就是BASE理論的核心要點,優先保證可用性,數據最終達成一致性。uox28資訊網——每日最新資訊28at.com

BASE理論主要是包括以下三點:uox28資訊網——每日最新資訊28at.com

  • 基本可用(Basically Available):系統出現故障還是能夠對外提供服務,不至于直接無法用了
  • 軟狀態(Soft State):允許各個節點的數據不一致
  • 最終一致性,(Eventually Consistent):雖然允許各個節點的數據不一致,但是在一定時間之后,各個節點的數據最終需要一致的

BASE理論其實就是妥協之后的產物。uox28資訊網——每日最新資訊28at.com

3、Nacos的AP和CP

Nacos其實目前是同時支持AP和CP的uox28資訊網——每日最新資訊28at.com

具體使用AP還是CP得取決于Nacos內部的具體功能,并不是有的文章說的可以通過一個配置自由切換。uox28資訊網——每日最新資訊28at.com

就以服務注冊舉例來說,對于臨時實例來說,Nacos會優先保證可用性,也就是APuox28資訊網——每日最新資訊28at.com

對于永久實例,Nacos會優先保證數據的一致性,也就是CPuox28資訊網——每日最新資訊28at.com

接下來我們就來講一講Nacos的CP和AP的實現原理uox28資訊網——每日最新資訊28at.com

3.1、Nacos的AP實現

對于AP來說,Nacos使用的是阿里自研的Distro協議uox28資訊網——每日最新資訊28at.com

在這個協議中,每個服務端節點是一個平等的狀態,每個服務端節點正常情況下數據是一樣的,每個服務端節點都可以接收來自客戶端的讀寫請求uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

當某個節點剛啟動時,他會向集群中的某個節點發送請求,拉取所有的服務實例數據到自己的服務注冊表中uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

這樣其它客戶端就可以從這個服務節點中獲取到服務實例數據了uox28資訊網——每日最新資訊28at.com

當某個服務端節點接收到注冊臨時服務實例的請求,不僅僅會將這個服務實例存到自身的服務注冊表,同時也會向其它所有服務節點發送請求,將這個服務數據同步到其它所有節點uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

所以此時從任意一個節點都是可以獲取到所有的服務實例數據的。uox28資訊網——每日最新資訊28at.com

即使數據同步的過程發生異常,服務實例也成功注冊到一個Nacos服務中,對外部而言,整個Nacos集群是可用的,也就達到了AP的效果uox28資訊網——每日最新資訊28at.com

同時為了滿足BASE理論,Nacos也有下面兩種機制保證最終節點間數據最終是一致的:uox28資訊網——每日最新資訊28at.com

  • 失敗重試機制
  • 定時對比機制

失敗重試機制是指當數據同步給其它節點失敗時,會每隔3s重試一次,直到成功uox28資訊網——每日最新資訊28at.com

定時對比機制就是指,每個Nacos服務節點會定時向所有的其它服務節點發送一些認證的請求uox28資訊網——每日最新資訊28at.com

這個請求會告訴每個服務節點自己負責的服務實例的對應的版本號,這個版本號隨著服務實例的變動就會變動uox28資訊網——每日最新資訊28at.com

如果其它服務節點的數據的版本號跟自己的對不上,那就說明其它服務節點的數據不是最新的uox28資訊網——每日最新資訊28at.com

此時這個Nacos服務節點就會將自己負責的服務實例數據發給不是最新數據的節點,這樣就保證了每個節點的數據是一樣的了。uox28資訊網——每日最新資訊28at.com

3.2、Nacos的CP實現

Nacos的CP實現是基于Raft算法來實現的uox28資訊網——每日最新資訊28at.com

在1.x版本早期,Nacos是自己手動實現Raft算法uox28資訊網——每日最新資訊28at.com

在2.x版本,Nacos移除了手動實現Raft算法,轉而擁抱基于螞蟻開源的JRaft框架uox28資訊網——每日最新資訊28at.com

在Raft算法,每個節點主要有三個狀態uox28資訊網——每日最新資訊28at.com

  • Leader,負責所有的讀寫請求,一個集群只有一個
  • Follower,從節點,主要是負責復制Leader的數據,保證數據的一致性
  • Candidate,候選節點,最終會變成Leader或者Follower

集群啟動時都是節點Follower,經過一段時間會轉換成Candidate狀態,再經過一系列復雜的選擇算法,選出一個Leaderuox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

這個選舉算法比較復雜,完全值得另寫一篇文章,這里就不細說了。不過立個flag,如果本篇文章點贊量超過28個,我連夜爆肝,再來一篇。uox28資訊網——每日最新資訊28at.com

當有寫請求時,如果請求的節點不是Leader節點時,會將請求轉給Leader節點,由Leader節點處理寫請求uox28資訊網——每日最新資訊28at.com

比如,有個客戶端連到的上圖中的Nacos服務2節點,之后向Nacos服務2注冊服務uox28資訊網——每日最新資訊28at.com

Nacos服務2接收到請求之后,會判斷自己是不是Leader節點,發現自己不是uox28資訊網——每日最新資訊28at.com

此時Nacos服務2就會向Leader節點發送請求,Leader節點接收到請求之后,會處理服務注冊的過程uox28資訊網——每日最新資訊28at.com

為什么說Raft是保證CP的呢?uox28資訊網——每日最新資訊28at.com

主要是因為Raft在處理寫的時候有一個判斷過程uox28資訊網——每日最新資訊28at.com

  • 首先,Leader在處理寫請求時,不會直接數據應用到自己的系統,而是先向所有的Follower發送請求,讓他們先處理這個請求
  • 當超過半數的Follower成功處理了這個寫請求之后,Leader才會寫數據,并返回給客戶端請求處理成功
  • 如果超過一定時間未收到超過半數處理成功Follower的信號,此時Leader認為這次寫數據是失敗的,就不會處理寫請求,直接返回給客戶端請求失敗

所以,一旦發生故障,導致接收不到半數的Follower寫成功的響應,整個集群就直接寫失敗,這就很符合CP的概念了。uox28資訊網——每日最新資訊28at.com

不過這里還有一個小細節需要注意uox28資訊網——每日最新資訊28at.com

Nacos在處理查詢服務實例的請求直接時,并不會將請求轉發給Leader節點處理,而是直接查當前Nacos服務實例的注冊表uox28資訊網——每日最新資訊28at.com

這其實就會引發一個問題uox28資訊網——每日最新資訊28at.com

如果客戶端查詢的Follower節點沒有及時處理Leader同步過來的寫請求(過半響應的節點中不包括這個節點),此時在這個Follower其實是查不到最新的數據的,這就會導致數據的不一致uox28資訊網——每日最新資訊28at.com

所以說,雖然Raft協議規定要求從Leader節點查最新的數據,但是Nacos至少在讀服務實例數據時并沒有遵守這個協議uox28資訊網——每日最新資訊28at.com

當然對于其它的一些數據的讀寫請求有的還是遵守了這個協議。uox28資訊網——每日最新資訊28at.com

JRaft對于讀請求其實是做了很多優化的,其實從Follower節點通過一定的機制也是能夠保證讀到最新的數據uox28資訊網——每日最新資訊28at.com

數據模型

在Nacos中,一個服務的確定是由三部分信息確定uox28資訊網——每日最新資訊28at.com

  • 命名空間(Namespace):多租戶隔離用的,默認是public
  • 分組(Group):這個其實可以用來做環境隔離,服務注冊時可以指定服務的分組,比如是測試環境或者是開發環境,默認是DEFAULT_GROUP
  • 服務名(ServiceName):這個就不用多說了

通過上面三者就可以確定同一個服務了uox28資訊網——每日最新資訊28at.com

在服務注冊和訂閱的時候,必須要指定上述三部分信息,如果不指定,Nacos就會提供默認的信息uox28資訊網——每日最新資訊28at.com

不過,在Nacos中,在服務里面其實還是有一個集群的概念uox28資訊網——每日最新資訊28at.com

圖片圖片uox28資訊網——每日最新資訊28at.com

在服務注冊的時候,可以指定這個服務實例在哪個集體的集群中,默認是在DEFAULT集群下uox28資訊網——每日最新資訊28at.com

在SpringCloud環境底下可以通過如下配置去設置uox28資訊網——每日最新資訊28at.com

spring  cloud:    nacos:      discovery:        cluster-name: sanyoujavaCluster

在服務訂閱的時候,可以指定訂閱哪些集群下的服務實例uox28資訊網——每日最新資訊28at.com

當然,也可以不指定,如果不指定話,默認就是訂閱這個服務下的所有集群的服務實例uox28資訊網——每日最新資訊28at.com

我們日常使用中可以將部署在相同區域的服務劃分為同一個集群,比如杭州屬于一個集群,上海屬于一個集群uox28資訊網——每日最新資訊28at.com

這樣服務調用的時候,就可以優先使用同一個地區的服務了,比跨區域調用速度更快。uox28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-56584-0.html萬字+20張圖探秘Nacos注冊中心核心實現原理

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Spring Boot中集成各種日志框架Logback、Log4j2和Java Util Logging

下一篇: Go(Golang)的十個常見代碼片段用于各種任務

標簽:
  • 熱門焦點
  • K60至尊版狂暴引擎2.0加持:超177萬跑分斬獲性能第一

    Redmi的后性能時代戰略發布會今天下午如期舉辦,在本次發布會上,Redmi公布了多項關于和聯發科的深度合作,以及新機K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍牙耳機到筆記本電腦,紅米不知不覺之間也已經形成了自己頗有競爭力的產品體系,在中端和次旗艦市場上甚至要比小米新機的表現來得更好,正所謂“大丈夫生居
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 一篇文章帶你了解 CSS 屬性選擇器

    屬性選擇器對帶有指定屬性的 HTML 元素設置樣式。可以為擁有指定屬性的 HTML 元素設置樣式,而不僅限于 class 和 id 屬性。一、了解屬性選擇器CSS屬性選擇器提供了一種簡單而
  • WebRTC.Net庫開發進階,教你實現屏幕共享和多路復用!

    WebRTC.Net庫:讓你的應用更親民友好,實現視頻通話無痛接入! 除了基本用法外,還有一些進階用法可以更好地利用該庫。自定義 STUN/TURN 服務器配置WebRTC.Net 默認使用 Google 的
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 最“俊美”淘寶賣家,靠直播和短視頻圈粉,上架秒光,年銷3000萬

    來源 | 電商在線文|易琬玉編輯|斯問受訪店鋪:Ringdoll戒之人形圖源:微博@御座的黃山、“Ringdoll戒之人形”淘寶店鋪有關外貌的評價,黃山已經聽累了。生于1985年的他,哪
  • 華為Mate 60系列用上可變靈動島:正式版體驗將會更出色

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • Windows 11發布,微軟一改往常對老機型開放的態度

    距離 Windows 11 發布已經過去一周,在過去一周里,很多數碼愛好者圍繞其對 Android 應用的支持、對老機型的升級問題展開了激烈討論。與以往不同的是,在這次大
Top 主站蜘蛛池模板: 海丰县| 黔江区| 乌鲁木齐县| 扶风县| 霍邱县| 扶余县| 阳泉市| 炎陵县| 镇平县| 定兴县| 彭泽县| 贵溪市| 通江县| 怀安县| 沁水县| 信丰县| 华坪县| 隆林| 龙游县| 娱乐| 襄汾县| 驻马店市| 布尔津县| 石台县| 定南县| 娄底市| 武平县| 读书| 黄龙县| 综艺| 和林格尔县| 伊金霍洛旗| 泾源县| 邯郸县| 萨迦县| 广州市| 赞皇县| 昭平县| 开鲁县| 宜宾市| 富川|