.Net微服務實踐(五)[服務發現]:Consul介紹和環境搭建
- 介紹
- 服務發現
- 健康檢查、鍵值儲存和資料中心
- 架構
- Consul模式
- 環境安裝
- HTTP API 和Command CLI
- 示例API介紹
- 最後
在上篇.Net微服務實踐(四)[閘道器]:Ocelot限流熔斷、快取以及負載均衡中介紹Ocelot的限流、熔斷、快取、負載均衡以及其他一些特性,Ocelot的基本配置和功能都已經介紹完了。本篇我們會介紹服務發現Consul.
介紹
Consul是一款簡單、易用、可伸縮性強的服務治理系統。主要核心功能有:服務發現、健康檢查、鍵值儲存和多資料中心。
服務發現
服務發現是consul的核心功能,分為服務註冊和服務查詢。
- 服務註冊 - 將服務節點資訊(地址+埠)新增(刪除)到服務登錄檔,服務登錄檔會記錄著服務的節點資訊和狀態
- 服務查詢 - 由其他的服務或者系統通過登錄檔查詢到指定可用服務的節點資訊。
服務發現的方式又分自主式和代理式
自主式
由各個服務主動的將自己節點資訊新增(刪除)到註冊中心。實現是通過統一封裝或者程式庫,由服務各個節點承擔服務發現的功能,與代理式相比由各自節點分擔的訪問壓力。
代理式
由一個系統(負載均衡系統)或者服務(API閘道器)來完成服務發現。因為由一個系統或者服務完成,隨著註冊服務的增加會帶來效能瓶頸,因此需要對此做叢集
健康檢查、鍵值儲存和資料中心
健康檢查
consul代理會每隔一段時間對註冊中心的服務節點進行訪問,如果響應碼為“20X"認為是健康。
鍵值儲存
鍵值儲存可以認為是一個簡易的k/v資料庫,因此可以用此來存放配置資訊。
資料中心
consul支援多資料中心,多資料中心進一步保證了Consul的可用性。
架構
- Agent - Agent是Consul叢集中每個成員長時間執行的守護程序。它是通過執行consul agent啟動的。Agent可以執行在client或server模式。由於所有節點都必須執行一個agent,因此將節點稱為客戶端或伺服器更簡單,但agent還有其他例項。所有agent都可以執行DNS或HTTP介面,並負責執行檢查和保持服務同步。
- Client - Client是將所有RPC轉發給伺服器的agent。client是相對無狀態的。client執行的唯一後臺活動是參與區域網gossip池。 這具有最小的資源開銷並且僅消耗少量的網路頻寬。
- Server - Server是具有擴充套件職責的 agent,包括參與Raft仲裁,維護叢集狀態,響應RPC查詢,通過廣域網的 gossip與其他資料中心通訊,以及將查詢轉發給leader或遠端資料中心。
- Datacenter - 雖然資料中心的定義似乎是顯而易見的,但必須考慮一些細微的細節。例如,在EC2中,多個可用區域被認為是由一個數據中心組成的? 我們將資料中心定義為私有、低延遲和高頻寬的網路環境。 這不包括通過公共網際網路的通訊,但為了我們的目的,單個EC2區域內的多個可用區域將被視為單個數據中心的一部分。
- Consensus - 在我們的文件中使用Consensus來表示對當選領導人的同意以及對交易順序的協議。由於這些事務被應用於有限狀態機,我們對Consensus的定義意味著複製狀態機的一致性。
- Gossip - Consul建立在Serf之上,它提供了一個完整的gossip協議用於多種目的。 Serf提供會員資格、失敗檢測和事件廣播。在Gossip文件中更多地描述了這些用法。 只要知道gossip涉及隨機的節點到節點的通訊就足夠了,主要是通過UDP。
- LAN Gossip - 指包含全部位於同一區域網或資料中心的節點的區域網gossip池。
- WAN Gossip—- 指僅包含伺服器的WAN gossip池。這些伺服器主要位於不同的資料中心,通常通過網際網路或廣域網進行通訊。
- RPC - 遠端過程呼叫。 這是一個請求/響應機制,允許客戶端發出伺服器請求。
Consul模式
Consul有兩種模式,Client和Server,無論各種模式都有一個consul agent。
Client模式
Client模式是一個輕量級的consul agent,只擁有註冊服務、健康檢查、轉發查詢等功能。
Server模式
Server模式與Client模式相比,除了擁有Client模式的功能還多出了資料儲存,leader選舉等。
官方建議Server模式應保證3-5個,而且應該是奇數,為什麼呢,因為少於3個無法保證高可用,多於5個又會給資料庫同步的一致性帶來壓力,而Client數量控制則沒有講究
環境安裝
下面介紹一下Windows系統下如何快速簡單的部署一個Consul的開發環境(實際生產環境要部署叢集)
-
下載 https://www.consul.io/downloads.html windows 版本,解壓
-
新增consul.exe 的路徑到環境變數
-
cmd執行 consul ,驗證
-
啟動cosul服務, cmd中輸入 consul agent -dev (dev是開發模式,生產環境下不要使用)
-
訪問 http://localhost:8500
HTTP API 和Command CLI
consul提供了豐富和command CLI和API來管理和操作Consul, 例如服務的註冊、服務的查詢、服務取消註冊、健康檢查等都有相應的Command CLI和 API
詳細的大家可以參考官方的API文件和Command CLI文件
- HTTP API - https://www.consul.io/api/health.html
- Command CLI - https://www.consul.io/docs/commands/index.html
示例API介紹
在這裡我們介紹幾個比較常用的API
服務註冊
PUT http://localhost:8500/v1/agent/service/register
body
{
"ID": "nginx1",
"Name": "nginx",
"Tags": ["primary", "v1"],
"Address": "127.0.0.1",
"Port": 80,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "100s",
"HTTP": "http://localhost:5000/health",
"Interval": "1s"
}
}
註冊一個ID為nginx1的服務
服務查詢
GET http://localhost:8500/v1/agent/services
呼叫後我們可以在response中看到剛剛註冊的nginx1的服務
{
"nginx1": {
"ID": "nginx1",
"Service": "nginx",
"Tags": [
"primary",
"v1"
],
"Meta": {},
"Port": 80,
"Address": "127.0.0.1",
"TaggedAddresses": {
"lan_ipv4": {
"Address": "127.0.0.1",
"Port": 80
},
"wan_ipv4": {
"Address": "127.0.0.1",
"Port": 80
}
},
"Weights": {
"Passing": 1,
"Warning": 1
},
"EnableTagOverride": false
}
}
服務取消註冊
PUT http://localhost:8500/v1/agent/service/deregister/nginx1
取消注服務nginx1, 這時我們再呼叫服務查詢的API,會返現response中已經沒有nginx1這個服務了
代理健康檢查
GET http://localhost:8500/v1/agent/checks
http 狀態碼返回200, 表示正常
最後
本篇我們對consul做了基本的介紹、如何在windows系統下快速的搭建consul的開發環境,以及Consul的常用API介紹。 接下來我們會結合Ocelot,在Ocelot中整合Consul做服務發現。
示例程式碼下載地址: https://github.com/lcyhjx/ocelot-demo/tree/mas