這篇文章將為大家詳細(xì)講解有關(guān).NET Core + Consul 服務(wù)注冊(cè)及發(fā)現(xiàn)的示例分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
專注于為中小企業(yè)提供做網(wǎng)站、網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)中江免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了近千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
在分布式架構(gòu)中,服務(wù)治理是必須面對(duì)的問題,如果缺乏簡(jiǎn)單有效治理方案,各服務(wù)之間只能通過人肉配置的方式進(jìn)行服務(wù)關(guān)系管理,當(dāng)遇到服務(wù)關(guān)系變化時(shí),就會(huì)變得極其麻煩且容易出錯(cuò)。
Consul[1] 是一個(gè)用來(lái)實(shí)現(xiàn)分布式系統(tǒng)服務(wù)發(fā)現(xiàn)與配置的開源工具。它內(nèi)置了服務(wù)注冊(cè)與發(fā)現(xiàn)框架、分布一致性協(xié)議實(shí)現(xiàn)、健康檢查、Key/Value存儲(chǔ)、多數(shù)據(jù)中心方案,不再需要依賴其他工具(比如 ZooKeeper 等),使用起來(lái)也較為簡(jiǎn)單。
Consul 集群支持多數(shù)據(jù)中心,在上圖中有兩個(gè) DataCenter,他們通過 Internet 互聯(lián),為了提高通信效率,只有 Server 節(jié)點(diǎn)才加入跨數(shù)據(jù)中心的通信。在單個(gè)數(shù)據(jù)中心中,Consul 分為 Client 和 Server 兩種節(jié)點(diǎn)(所有的節(jié)點(diǎn)也被稱為 Agent),Server 節(jié)點(diǎn)保存數(shù)據(jù),Client 負(fù)責(zé)健康檢查及轉(zhuǎn)發(fā)數(shù)據(jù)請(qǐng)求到 Server,本身不保存注冊(cè)信息;Server 節(jié)點(diǎn)有一個(gè) Leader 和多個(gè) Follower,Leader 節(jié)點(diǎn)會(huì)將數(shù)據(jù)同步到 Follower,Server 節(jié)點(diǎn)的數(shù)量推薦是3個(gè)或者5個(gè),在 Leader 掛掉的時(shí)候會(huì)啟動(dòng)選舉機(jī)制產(chǎn)生一個(gè)新 Leader。
這里使用 Docker 搭建 3個(gè) Server 節(jié)點(diǎn) + 1 個(gè) Client 節(jié)點(diǎn),API 服務(wù)通過 Client 節(jié)點(diǎn)進(jìn)行服務(wù)注冊(cè)和發(fā)現(xiàn)。
docker pull consul
docker-compose.yaml
如下:
version: '3'
services:
cs1:
image: consul
command: agent -server -client=0.0.0.0 -bootstrap-expect=3 -node=cs1 -data-dir=/data
volumes:
- /usr/local/docker/consul/data/cs1:/data
cs2:
image: consul
command: agent -server -client=0.0.0.0 -retry-join=cs1 -node=cs2 -data-dir=/data
volumes:
- /usr/local/docker/consul/data/cs2:/data
depends_on:
- cs1
cs3:
image: consul
command: agent -server -client=0.0.0.0 -retry-join=cs1 -node=cs3 -data-dir=/data
volumes:
- /usr/local/docker/consul/data/cs3:/data
depends_on:
- cs1
cc1:
image: consul
command: agent -client=0.0.0.0 -retry-join=cs1 -ui -node=cc1 -data-dir=/data
ports:
- 8500:8500
volumes:
- /usr/local/docker/consul/data/cc1:/data
depends_on:
- cs2
- cs3
主要參數(shù)說明:
參數(shù)名 | 解釋 |
---|---|
-server | 設(shè)置為 Server 類型節(jié)點(diǎn),不加則為 Client 類型節(jié)點(diǎn) |
-client | 注冊(cè)或者查詢等一系列客戶端對(duì)它操作的IP,默認(rèn)是127.0.0.1 |
-bootstrap-expect | 集群期望的 Server 節(jié)點(diǎn)數(shù),只有達(dá)到這個(gè)值才會(huì)選舉 Leader |
-node | 指定節(jié)點(diǎn)名稱 |
-data-dir | 數(shù)據(jù)存放位置 |
-retry-join | 指定要加入的節(jié)點(diǎn)地址(組建集群) |
-ui | 啟用 UI 界面 |
(e002ca62ac24 為容器名稱,可通過 docker ps | grep consul 查看,選擇任意一個(gè)即可)
docker exec -t e002ca62ac24 consul members
當(dāng)前為3 個(gè) Server 類型節(jié)點(diǎn) ,1 個(gè) Client 類型節(jié)點(diǎn)。
docker exec -t e002ca62ac24 consul operator raft list-peers
當(dāng)前為 cs1 為 leader,可以測(cè)試將 cs1 stop 觀察 leader 的重新選舉。
通過 http://192.168.124.9:8500
UI 界面查看 Consul 節(jié)點(diǎn)狀態(tài)如下:(192.168.124.9 是 consul 容器外部訪問 IP)
創(chuàng)建 .NET Core WebAPI(3.1) 服務(wù) ServiceA(2個(gè)實(shí)例) 和 ServiceB
NuGet 安裝 Consul
注冊(cè)到 Consul 的核心代碼如下(源碼下載[2]):
public static class ConsulBuilderExtensions
{
public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IHostApplicationLifetime lifetime, ConsulOption consulOption)
{
var consulClient = new ConsulClient(x =>
{
x.Address = new Uri(consulOption.Address);
});
var registration = new AgentServiceRegistration()
{
ID = Guid.NewGuid().ToString(),
Name = consulOption.ServiceName,// 服務(wù)名
Address = consulOption.ServiceIP, // 服務(wù)綁定IP
Port = consulOption.ServicePort, // 服務(wù)綁定端口
Check = new AgentServiceCheck()
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服務(wù)啟動(dòng)多久后注冊(cè)
Interval = TimeSpan.FromSeconds(10),//健康檢查時(shí)間間隔
HTTP = consulOption.ServiceHealthCheck,//健康檢查地址
Timeout = TimeSpan.FromSeconds(5)
}
};
// 服務(wù)注冊(cè)
consulClient.Agent.ServiceRegister(registration).Wait();
// 應(yīng)用程序終止時(shí),服務(wù)取消注冊(cè)
lifetime.ApplicationStopping.Register(() =>
{
consulClient.Agent.ServiceDeregister(registration.ID).Wait();
});
return app;
}
}
添加配置如下:
"Consul": {
"ServiceName": "service-a",
"ServiceIP": "192.168.124.11", // 當(dāng)前服務(wù)訪問 IP
"ServicePort": 8000,
"ServiceHealthCheck": "http://192.168.124.11:8000/healthCheck",
"Address": "http://192.168.124.9:8500"
}
注冊(cè)成功結(jié)果如下:
關(guān)于.NET Core + Consul 服務(wù)注冊(cè)及發(fā)現(xiàn)的示例分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。