1. 程式人生 > >.Net微服務實踐(五)[服務發現]:Consul介紹和環境搭建

.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