基于Docker的Consul服务发现集群搭建
在去年的.NET Core微服務(wù)系列文章中,初步學(xué)習(xí)了一下Consul服務(wù)發(fā)現(xiàn),總結(jié)了兩篇文章。本次基于Docker部署的方式,以一個Demo示例來搭建一個Consul的示例集群,最后給出一個HA的架構(gòu)示范,也會更加貼近于實際應(yīng)用環(huán)境。
一、示例整體架構(gòu)
此示例會由一個API Gateway, 一個Consul Client以及三個Consul Server組成,有關(guān)Consul的Client和Server這兩種模式的Agent的背景知識,請移步我之前的文章加以了解:《.NET Core微服務(wù)之基于Consul實現(xiàn)服務(wù)治理》。其中,Consul的Client和Server節(jié)點共同構(gòu)成一個Data Center,而API Gateway則從Consul中獲取到服務(wù)的IP和端口號,并返回給服務(wù)消費者。這里的API Gateway是基于Ocelot來實現(xiàn)的,它不是這里的重點,也就不過多說明了,不了解的朋友請移步我的另一篇:《.NET Core微服務(wù)之基于Ocelot實現(xiàn)API網(wǎng)關(guān)服務(wù)》。
二、Consul集群搭建
2.1 Consul鏡像拉取
docker pull consul:1.4.4 驗證:docker images
2.2 Consul Server實例創(chuàng)建
以下我的實踐是在一臺機器上(CentOS 7)操作的,因此將三個實例分別使用了不同的端口號(區(qū)別于默認端口號8500)。實際環(huán)境中,建議多臺機器部署。
(1)Consul實例1
docker run -d -p 8510:8500 --restart=always -v /XiLife/consul/data/server1:/consul/data -v /XiLife/consul/conf/server1:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --privileged=true --name=consul_server_1 consul:1.4.4 agent -server -bootstrap-expect=3 -ui -node=consul_server_1 -client='0.0.0.0' -data-dir /consul/data -config-dir /consul/config -datacenter=xdp_dc;
(2)Consul實例2
為了讓Consul實例2加入集群,首先獲取一下Consul實例1的IP地址:
JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' consul_server_1)";docker run -d -p 8520:8500 --restart=always -v /XiLife/consul/data/server2:/consul/data -v /XiLife/consul/conf/server2:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --privileged=true --name=consul_server_2 consul:1.4.4 agent -server -ui -node=consul_server_2 -client='0.0.0.0' -datacenter=xdp_dc -data-dir /consul/data -config-dir /consul/config -join=$JOIN_IP; (3)Consul實例3
驗證1:docker exec consul_server_1 consul operator raft list-peers
驗證2:http://192.168.16.170:8500/
2.3 Consul Client實例創(chuàng)建
(1)準備services.json配置文件,向Consul注冊兩個同樣的Product API服務(wù)
{ "services": [ { "id": "core.product-/192.168.16.170:8000", "name": "core.product", "tags": [ "xdp-/core.product" ], "address": "192.168.16.170", "port": 8000, "checks": [ { "name": "core.product.check", "http": "http://192.168.16.170:8000/api/health", "interval": "10s", "timeout": "5s" } ] }, { "id": "core.product-/192.168.16.170:8001", "name": "core.product", "tags": [ "xdp-/core.product" ], "address": "192.168.16.170", "port": 8001, "checks": [ { "name": "core.product.check", "http": "http://192.168.16.170:8001/api/health", "interval": "10s", "timeout": "5s" } ] } ] }????有關(guān)配置文件的細節(jié),請移步另一篇文章:《.NET Core微服務(wù)之基于Consul實現(xiàn)服務(wù)治理(續(xù))》(2)Consul Client實例
docker run -d -p 8550:8500 --restart=always -v /XiLife/consul/conf/client1:/consul/config -e CONSUL_BIND_INTERFACE='eth0' --name=consul_client_1 consul:1.4.4 agent -node=consul_client_1 -join=$JOIN_IP -client='0.0.0.0' -datacenter=xdp_dc -config-dir /consul/config (3)驗證
2.4 服務(wù)檢查監(jiān)控郵件提箱
(1)為Client添加watches.json
{ "watches": [ { "type": "checks", "handler_type": "http", "state": "critical", "http_handler_config": { "path": "http://192.168.16.170:6030/api/Notifications/consul", "method": "POST", "timeout": "10s", "header": { "Authorization": [ "token" ] } } } ] }*.這里的api接口?http://192.168.16.170:6030/api/Notifications/consul是我的一個通知服務(wù)發(fā)送Email的接口。
(2)驗證
三、Ocelot網(wǎng)關(guān)配置
3.1 為Ocelot增加Consul支持
(1)增加Nuget包:Ocelot.Provider.Consul
Nuget>>?Install-Package?Ocelot.Provider.Consul
(2)修改StartUp.cs,增加Consul支持
s.AddOcelot() ????
? ? .AddConsul();
更多內(nèi)容,請移步:Ocelot官方文檔-服務(wù)發(fā)現(xiàn)
3.2 修改Ocelot配置文件增加Consul配置
"GlobalConfiguration": { "BaseUrl": "http://api.xique.com", "ServiceDiscoveryProvider": { "Host": "192.168.16.170", "Port": 8550, "Type": "Consul" } }*.這里指向的是Consul Client實例的地址
此外,Ocelot默認策略是每次請求都去Consul中獲取服務(wù)地址列表,如果想要提高性能,也可以使用PollConsul的策略,即Ocelot自己維護一份列表,然后定期從Consul中獲取刷新,就不再是每次請求都去Consul中拿一趟了。例如下面的配置,它告訴Ocelot每2秒鐘去Consul中拿一次。
"Type": "PollConsul", "PollingInterval": 20003.3 Service配置
// -- Service { "UseServiceDiscovery": true, "DownstreamPathTemplate": "/api/{url}", "DownstreamScheme": "http", "ServiceName": "core.product", "LoadBalancerOptions": { "Type": "RoundRobin" }, "UpstreamPathTemplate": "/product/{url}", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ] }這里配置了在Consul中配置的服務(wù)名(ServiceName),以及告訴Ocelot我們使用輪詢策略(RoundRobin)做負載均衡。
3.4 驗證
第一次訪問:
第二次訪問:
四、HA示例整體架構(gòu)
對于實際應(yīng)用中,我們往往會考慮單點問題,因此會借助一些負載均衡技術(shù)來做高可用的架構(gòu),這里給出一個建議的HA示例的整體架構(gòu):
對于一個API請求,首先會經(jīng)歷一個Load Balancer才會到達API Gateway,這個Load Balancer可以是基于硬件的F5,也可以是基于軟件的Nginx或LVS再搭配Keepalived,一般來說大部分團隊都會選擇Nginx。然后API Gateway通過部署多個,來解決單點問題,也達到負載均衡的效果。而對于API Gateway和Consul Client之間的連接,我們往往也會增加一個Load Balancer來實現(xiàn)服務(wù)發(fā)現(xiàn)的高可用,這個Load Balancer也一般會基于Nginx/LVS搭配Keepalived,API Gateway只需要訪問一個Virtual IP即可。而在Consul Data Center中,Consul Server會選擇3或5個,Consul Client也會部署多個,剛剛提到的Virtual IP則會指向多個Consul Client,從而防止了Consul Client的單點問題。
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的基于Docker的Consul服务发现集群搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不断进化的分支和需求管理
- 下一篇: VS Code 1.35 发布!全新 l