在上篇.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 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做服務發現。