在博文:微服務系列(1)里我們提到過注冊中心的概念,簡單來說微服務注冊中心是一個用于存儲和管理微服務實例信息的組件,它提供了服務注冊、服務發現、服務健康檢查等功能,以確保微服務之間的穩定通信。在微服務架構中,各個服務實例將自己的信息注冊到注冊中心,同時從中心獲取其他服務的實例信息以進行通信。當一個服務實例發生故障或下線時,注冊中心會自動將其從服務列表中移除,從而確保其他服務實例獲取到的服務列表始終是可用的。
舉個栗子:
有兩個服務,consumer和provider,各自都采用了多副本部署。一般來說,consumer在調用provider時,會訪問provider服務所暴露出來的負載均衡ip,一旦負載均衡ip改變了,開發者就不得不采用一些手段修改客戶端服務的請求地址。
但如果我們引入了注冊中心這個中間層,provider服務在每一次啟動時,都會向注冊中心注冊自己的信息(名稱、地址、端口、標簽等matedata),這樣,consumer側就無需在意provider側的ip變化,只需要每次向注冊中心“拿”就可以了。
微服務的注冊中心目前主流的有以下四種:
- Zookeeper
- Eureka
- Consul
- Kubernetes
(由于本人工作和consul打交道更多,這里我們主要聊consul)
consul
consul的介紹
Consul是由HashiCorp公司推出的一款開源工具,是一個分布式的、高可用的、高性能的服務注冊與發現系統,它提供了服務注冊、服務發現、健康檢查、KV存儲等功能。
consul的工作原理
-
節點類型
Consul主要由以下兩種節點組成:
Server節點:Server節點負責存儲服務實例的注冊信息、健康檢查狀態等元數據。一個Consul集群通常包含3個或5個Server節點,以實現高可用性。Server節點之間通過Raft協議進行數據同步和選舉Leader。
Client節點:Client節點負責轉發服務注冊、查詢等請求到Server節點,并緩存部分數據以提高查詢性能。Client節點通常部署在每臺微服務所在的主機上,以實現服務實例與Consul的緊密集成。
Agent:在Consul集群的每一個節點,都會運行一個Agent進程,agent分為client和server兩種模式。以后細說。 -
服務注冊
微服務實例可以通過HTTP API或者配置文件的方式將自己的信息注冊到Consul中。注冊信息包括服務名稱、地址、端口、標簽等元數據。Client節點會將服務實例的注冊信息轉發到Server節點,并存儲在內部的數據結構中。 -
服務發現
當一個服務實例需要與另一個服務進行通信時,它可以通過查詢Consul獲取目標服務的實例信息。 -
健康檢查
Consul支持的健康檢查類型包括http,tcp,script。
HTTP檢查:注冊中心定期向服務實例的指定HTTP端點發送請求,根據HTTP響應狀態碼判斷服務實例是否健康;
TCP檢查:注冊中心定期嘗試與服務實例的指定TCP端口建立連接,根據連接是否成功判斷服務實例是否健康;
命令行檢查:定期執行命名(比如:ls/ifconfig),退出狀態碼為0表示服務實例健康。 -
數據同步
Consul使用Raft協議確保Server節點之間的數據同步。通過Raft協議,Consul可以在多個Server節點之間復制數據,實現強一致性。此外,Raft協議還用于選舉Leader節點,以確保集群中只有一個節點負責處理寫請求。 -
Gossip協議
Gossip協議是一種基于UDP的輕量級通信協議,consul使用Gossip協議實現集群節點之間的成員關系管理和事件傳播。