.Net微服務實踐(五)[服務發現]:Consul介紹和環境搭建


在上篇.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的開發環境(實際生產環境要部署集群)

HTTP API 和Command CLI

consul提供了豐富和command CLI和API來管理和操作Consul, 例如服務的注冊、服務的查找、服務取消注冊、健康檢查等都有相應的Command CLI和 API

詳細的大家可以參考官方的API文檔和Command CLI文檔

示例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/master


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM