1. 程式人生 > 其它 >微服務之Consul元件

微服務之Consul元件

最近的後端開發工作一直離不開Consul,用上了,但一直沒有去了解。今有空總結一下。

在 Spring Cloud 體系中,幾乎每個角色都會有兩個以上的產品提供選擇,比如在註冊中心有:Eureka、Consul、zookeeper、etcd 等;閘道器的產品有 Zuul、Spring Cloud Gateway 等。在註冊中心產品中,最常使用的是 Eureka 和 Consul,兩者各有特點,企業可以根據自述專案情況來選擇。

前面給大家詳細介紹了 Eureka ,本節給大家介紹 Consul 的使用。

什麼是Consul
Consul 是 HashiCorp 公司推出的開源產品,用於實現分散式系統的服務發現、服務隔離、服務配置,這些功能中的每一個都可以根據需要單獨使用,也可以同時使用所有功能。Consul 官網目前主要推 Consul 在服務網格中的使用。

與其它分散式服務註冊與發現的方案相比,Consul 的方案更“一站式”——內建了服務註冊與發現框架、分佈一致性協議實現、健康檢查、Key/Value 儲存、多資料中心方案,不再需要依賴其它工具。Consul 本身使用 go 語言開發,具有跨平臺、執行高效等特點,也非常方便和 Docker 配合使用。

Consul 的主要特點有:
Service Discovery : 服務註冊與發現,Consul 的客戶端可以做為一個服務註冊到 Consul,也可以通過 Consul 來查詢特定的服務提供者,並且根據提供的資訊進行呼叫。

Health Checking: Consul 客戶端會定期傳送一些健康檢查資料和服務端進行通訊,判斷客戶端的狀態、記憶體使用情況是否正常,用來監控整個叢集的狀態,防止服務轉發到故障的服務上面。

KV Store: Consul 還提供了一個容易使用的鍵值儲存。這可以用來保持動態配置,協助服務協調、建立 Leader 選舉,以及開發者想構造的其它一些事務。

Secure Service Communication: Consul 可以為服務生成分散式的 TLS 證書,以建立相互的 TLS 連線。 可以使用 intentions 定義允許哪些服務進行通訊。 可以使用 intentions 輕鬆管理服務隔離,而不是使用複雜的網路拓撲和靜態防火牆規則。

Multi Datacenter: Consul 支援開箱即用的多資料中心,這意味著使用者不需要擔心需要建立額外的抽象層讓業務擴充套件到多個區域。

Consul 角色
Server: 服務端, 儲存配置資訊, 高可用叢集, 在區域網內與本地客戶端通訊, 通過廣域網與其它資料中心通訊。 每個資料中心的 Server 數量推薦為 3 個或是 5 個。

Client: 客戶端, 無狀態, 將 HTTP 和 DNS 介面請求轉發給區域網內的服務端叢集。

Consul 旨在對 DevOps 社群和應用程式開發人員友好,使其成為現代、彈性基礎架構的理想選擇。

使用Consul 的優勢
使用 Raft 演算法來保證一致性, 比複雜的 Paxos 演算法更直接。相比較而言, zookeeper 採用的是 Paxos, 而 etcd 使用的則是 Raft。

支援多資料中心,內外網的服務採用不同的埠進行監聽。多資料中心叢集可以避免單資料中心的單點故障,而其部署則需要考慮網路延遲, 分片等情況等。 zookeeper 和 etcd 均不提供多資料中心功能的支援。

支援健康檢查。 etcd 不提供此功能。

支援 http 和 dns 協議介面。 zookeeper 的整合較為複雜, etcd 只支援 http 協議。

官方提供 Web 管理介面, etcd 無此功能。

Consul 保持了 CAP 中的 CP,保持了強一致性和分割槽容錯性。

Consul 支援 Http\gRPC\DNS 多種訪問方式。

Consul 的呼叫過程
首先我們根據一張圖來了解一下 Consul 服務呼叫過程:

1、當 Producer 啟動的時候,會向 Consul 傳送一個 post 請求,告訴 Consul 自己的 IP 和 Port;

2、Consul 接收到 Producer 的註冊後,每隔 10s(預設)會向 Producer 傳送一個健康檢查的請求,檢驗 Producer 是否健康;

3、當 Consumer 傳送 GET 方式請求 /api/address 到 Producer 時,會先從 Consul 中拿到一個儲存服務 IP 和 Port 的臨時表,從表中拿到 Producer 的 IP 和 Port 後再發送 GET 方式請求 /api/address;

4、該臨時表每隔 10s 會更新,只包含有通過了健康檢查的 Producer。

Spring Cloud Consul 專案是針對 Consul 的服務治理實現。Consul 是一個分散式高可用的系統,它包含多個元件,但是作為一個整體,在微服務架構中,為我們的基礎設施提供服務發現和服務配置的工具。

Consul 和 eureka的對比
我們先來通過一個表格做簡單對比

Feature Euerka Consul
服務健康檢查 可配支援 服務狀態,記憶體,硬碟等
多資料中心 — 支援
kv 儲存服務 — 支援
一致性 — raft
cap ap cp
使用介面(多語言能力) http(sidecar) 支援 http 和 dns
watch 支援 支援 long polling/大部分增量 全量/支援long polling
自身監控 metrics metrics
安全 — acl /https
程式語言 Java go
Spring Cloud 整合 已支援 已支援
通過對比可以得知, Consul 功能更強大,Euerka 更容易使用。

Consul 強一致性©帶來的是:

服務註冊相比 Eureka 會稍慢一些。因為 Consul 的 raft 協議要求必須過半數的節點都寫入成功才認為註冊成功,。Leader 掛掉時,重新選舉期間整個 Consul 不可用。保證了強一致性但犧牲了可用性。

Consul 強烈的一致性意味著它可以作為領導選舉和叢集協調的鎖定服務。

Eureka 保證高可用(A)和最終一致性:

服務註冊相對要快,因為不需要等註冊資訊 replicate 到其它節點,也不保證註冊資訊是否 replicate 成功。當資料出現不一致時,雖然 A, B 上的註冊資訊不完全相同,但每個 Eureka 節點依然能夠正常對外提供服務,這會出現查詢服務資訊時如果請求 A 查不到,但請求 B 就能查到。如此保證了可用性但犧牲了一致性。

安裝Consul
Consul 不同於 Eureka 是由 go 語言開發而成,因此需要我們單獨來安裝。

開啟 Consul官網根據不同的作業系統選擇最新的 Consul 版本,我們這裡以 Windows 64 作業系統為例,可以看出 Consul 目前的最新版本為 1.4.4


下載下來是一個 consul_1.4.4_windows_amd64.zip 的壓縮包,解壓是一個 consul.exe 的執行檔案。

cd 到對應的目錄下,使用 cmd 啟動 Consul:

cd D:\Common Files\consul
#cmd啟動: consul agent -dev # -dev表示開發模式執行,另外還有-server表示服務模式執行

為了方便啟動,可以在同級目錄下建立一個 run.bat 指令碼來啟動,指令碼內容如下:

consul agent -dev pause

下次啟動的時候直接雙擊 run.bat 檔案即可;當然也可以把 consul 的 exe 檔案路徑加入到本機的 path 路徑下,這樣後期只需要在 cmd 命令列下執行

執行命令後,命令列會輸出如下資訊:

啟動成功之後訪問:localhost:8500,就可以看到Consul的管理介面

Consul 的 Web 管理介面有一些選單,我們這裡做一下簡單的介紹:

Services,管理介面的預設頁面,用來展示註冊到 Consul 的服務,啟動後預設會有一個 consul 服務,也就是它本身。

Nodes,在 Services 介面雙擊服務名就會來到 Services 對於的 Nodes 介面,Services 是按照服務的抽象來展示的,Nodes 展示的是此服務的具體節點資訊。比如啟動了兩個訂單服務例項,Services 介面會出現一個訂單服務,Nodes 介面會展示兩個訂單服務的節點。

Key/Value ,如果有用到 Key/Value 儲存,可以在介面進行配置、查詢。

ACL,全稱 Access Control List,為訪問控制列表的展示資訊。

Intentions,可以在頁面配置請求許可權。

當我們看到這個頁面後,也就意味著 Consul 已經安裝成功了。

Keep moving forwards~