天天看點

一文看懂服務治理

分布式系統架構特别是進入微服務架構後,服務治理的重要性愈發變得不可缺少而且處于重要地位。缺乏服務治理的的分布式系統架構,很難正式投入生産。那麼服務治理包括哪些方面呢?主要包括服務發現,服務注冊,負載均衡,限流,熔斷,逾時,重試,服務跟蹤等。

服務發現

服務發現是指使用一個注冊中心來記錄分布式系統中全部服務的資訊,以便讓其他服務能夠快速找到這些已注冊的服務。服務發現需要服務注冊,服務查找,服務健康檢查及服務變更通知等關鍵功能。

有兩種主要的服務發現模式:用戶端服務發現, 服務端服務發現。

用戶端服務發現

一文看懂服務治理

上圖展示了用戶端發現模式的架構,簡單來說:

Service Registry 類似企業黃頁,儲存了所有服務的資訊, client通過系統資料庫找到對應的企業電話(是一個list), 然後用戶端使用自身提供的負載均衡算法,選擇需要的電話。

當然client可以儲存查找過的位址(緩存)而不需要每次都去Service Registry 擷取;因為服務的執行個體(企業資訊,電話)可能終止(從Registry删除), 或者新的服務執行個體加入(新的企業),使得本地緩存和Registry可能有差異,(從分布式CAP的角度,對于服務發現,可用性比資料一緻性更加重要,AP勝過CP), 需要服務執行個體的系統資料庫通過心跳機制進行更新。

服務端服務發現

一文看懂服務治理

本質上就是負載均衡從用戶端解耦了出來, 常見的服務發現Eureka, etcd, Consul,Zookkeeper,nacos等。

對兩者進行對比的話,他們的優劣也十分的明顯

一文看懂服務治理

可以看到關于服務發現,關鍵是要有一個服務注冊中心。具體的服務發現機制

1.服務提供者啟動時需要注冊。

2.注冊中心與服務提供者無法保持心跳時需要剔除服務。

3.服務消費者可以從注冊中心擷取服務提供者的最新資訊,可以采取定期拉和事件通知的兩種方式。

服務注冊

就是将提供某個服務的子產品資訊(通常是這個服務的ip和端口)注冊到1個公共的元件上去(比如: zookeeper\consul)。

你可以了解為:

//服務注冊
NameServer->register(newServer); 


//服務發現
NameServer->getAllServer();      

服務注冊又分為自注冊和第三方注冊兩種方式。

服務注冊最重要的就是将服務注冊到哪裡,在注冊中心服務端,肯定有一個用來管理服務的容器,他儲存着所有服務的執行個體。

一文看懂服務治理
一文看懂服務治理
一文看懂服務治理
一文看懂服務治理

服務發現

服務注冊到注冊中心後,服務的消費者就可以進行服務發現的流程了,消費者可以直接向注冊中心發送擷取某個服務執行個體的請求,這種情況下注冊中心将傳回所有可用的服務執行個體給消費者,但是一般不推薦這種情況。另一種方法就是服務的消費者向注冊中心訂閱某個服務,并送出一個監聽器,當注冊中心中服務發生變更時,監聽器會收到通知,這時消費者更新本地的服務執行個體清單,以保證所有的服務均是可用的。

一文看懂服務治理
一文看懂服務治理

負載均衡

負載均衡,英文名稱為Load Balance,指由多台伺服器以對稱的方式組成一個伺服器集合,每台伺服器都具有等價的地位,都可以單獨對外提供服務而無須其他伺服器的輔助。通過某種負載分擔技術,将外部發送來的請求均勻配置設定到對稱結構中的某一台伺服器上,而接收到請求的伺服器獨立地回應客戶的請求。負載均衡能夠平均配置設定客戶請求到伺服器陣列,借此提供快速擷取重要資料,解決大量并發通路服務問題,這種叢集技術可以用最少的投資獲得接近于大型主機的性能。

負載均衡方式

(1)軟體負載均衡

常見的負載均衡軟體有Nginx、LVS、HAProxy。

(2)硬體負載均衡

常見的負載均衡硬體有Array、F5。

負載均衡算法

常見的負載均衡算法有:随機算法、權重輪詢、一緻性hash、最小活躍數算法。

一緻性雜湊演算法-ConsistentHashLoadBalance

伺服器叢集接收到一次請求調用時,可以根據根據請求的資訊,比如用戶端的ip位址,或請求路徑與請求參數等資訊進行哈希,可以得出一個哈希值,特點是對于相同的ip位址,或請求路徑和請求參數哈希出來的值是一樣的,隻要能再增加一個算法,能夠把這個哈希值映射成一個服務端ip位址,就可以使相同的請求(相同的ip位址,或請求路徑和請求參數)落到同一伺服器上。

因為用戶端發起的請求情況是無窮無盡的(用戶端位址不同,請求參數不同等等),是以對于的哈希值也是無窮大的,是以我們不可能把所有的哈希值都進行映射到服務端ip上,是以這裡需要用到哈希環。如下圖

一文看懂服務治理

(1)哈希值如果需要ip1和ip2之間的,則應該選擇ip2作為結果;

(2)哈希值如果需要ip2和ip3之間的,則應該選擇ip3作為結果;

(3)哈希值如果需要ip3和ip4之間的,則應該選擇ip4作為結果;

(4)哈希值如果需要ip4和ip1之間的,則應該選擇ip1作為結果;

上面這情況是比較均勻情況,如果出現ip4伺服器不存在,那就是這樣了:

一文看懂服務治理

會發現,ip3和ip1直接的範圍是比較大的,會有更多的請求落在ip1上,這是不“公平的”,解決這個問題需要加入虛拟節點,比如:

一文看懂服務治理

其中ip2-1, ip3-1就是虛拟結點,并不能處理節點,而是等同于對應的ip2和ip3伺服器。

實際上,這隻是處理這種不均衡性的一種思路,實際上就算哈希環本身是均衡的,你也可以增加更多的虛拟節點來使這個環更加平滑,比如:

一文看懂服務治理

這個彩環也是“公平的”,并且隻有ip1,2,3,4是實際的伺服器ip,其他的都是虛拟ip。

那麼我們怎麼來實作呢?

對于我們的服務端ip位址,我們肯定知道總共有多少個,需要多少個虛拟節點也有我們自己控制,虛拟節點越多則流量越均衡,另外雜湊演算法也是很關鍵的,雜湊演算法越散列流量也将越均衡。

一文看懂服務治理

Nacos 服務注冊與訂閱的完整流程

Nacos 用戶端進行服務注冊有兩個部分組成,一個是将服務資訊注冊到服務端,另一個是像服務端發送心跳包,這兩個操作都是通過 NamingProxy 和服務端進行資料互動的。

Nacos 用戶端進行服務訂閱時也有兩部分組成,一個是不斷從服務端查詢可用服務執行個體的定時任務,另一個是不斷從已變服務隊列中取出服務并通知 EventListener 持有者的定時任務。

一文看懂服務治理

限流、熔斷、逾時

了解sentinel

三豐,公衆号:soft張三豐Sentinel你了解多少

服務跟蹤

服務跟蹤

三豐,公衆号:soft張三豐APM 原理與架構

Prometheus監控(1)

三豐,公衆号:soft張三豐Prometheus監控(1)

Prometheus監控(2)

三豐,公衆号:soft張三豐Prometheus監控(2)

Prometheus監控(3)

三豐,公衆号:soft張三豐Prometheus監控(3)

Prometheus監控(4)

三豐,公衆号:soft張三豐Prometheus監控(4)

Prometheus監控(5)

三豐,公衆号:soft張三豐Prometheus監控(5)

繼續閱讀