基于Docker的Consul服务发现集群搭建

640?wx_fmt=png

在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章。本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架构示范,也会更加贴近于实际应用环境。

一、示例整体架构

640?wx_fmt=png

  此示例会由一个API Gateway, 一个Consul Client以及三个Consul Server组成,有关Consul的Client和Server这两种模式的Agent的背景知识,请移步我之前的文章加以了解:《.NET Core微服务之基于Consul实现服务治理》。其中,Consul的Client和Server节点共同构成一个Data Center,而API Gateway则从Consul中获取到服务的IP和端口号,并返回给服务消费者。这里的API Gateway是基于Ocelot来实现的,它不是这里的重点,也就不过多说明了,不了解的朋友请移步我的另一篇:《.NET Core微服务之基于Ocelot实现API网关服务》。

二、Consul集群搭建

2.1 Consul镜像拉取

docker pull consul:1.4.4

  验证:docker images

  640?wx_fmt=png

2.2 Consul Server实例创建

  以下我的实践是在一台机器上(CentOS 7)操作的,因此将三个实例分别使用了不同的端口号(区别于默认端口号8500)。实际环境中,建议多台机器部署。

  (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;

  

640?wx_fmt=jpeg

(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

docker run -d -p 8530:8500 --restart=always 	
-v /XiLife/consul/data/server3:/consul/data 	
-v /XiLife/consul/conf/server3:/consul/config 	
-e CONSUL_BIND_INTERFACE='eth0' --privileged=true 	
--name=consul_server_3 consul:1.4.4 agent -server -ui 	
-node=consul_server_3 -client='0.0.0.0' 	
-datacenter=xdp_dc 	
-data-dir /consul/data 	
-config-dir /consul/config 	
-join=$JOIN_IP;

  验证1:docker exec consul_server_1 consul operator raft list-peers

  640?wx_fmt=png

  验证2:http://192.168.16.170:8500/

  640?wx_fmt=png

2.3 Consul Client实例创建

  (1)准备services.json配置文件,向Consul注册两个同样的Product API服务

    {	"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"	}	]	}	]	}
    有关配置文件的细节,请移步另一篇文章:《.NET Core微服务之基于Consul实现服务治理(续)

  (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)验证

  640?wx_fmt=png

  640?wx_fmt=png

  640?wx_fmt=png

2.4 服务检查监控邮件提箱

  (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是我的一个通知服务发送Email的接口。

  (2)验证

  640?wx_fmt=png

三、Ocelot网关配置

3.1 为Ocelot增加Consul支持

  (1)增加Nuget包:Ocelot.Provider.Consul

Nuget>> Install-Package Ocelot.Provider.Consul 

  (2)修改StartUp.cs,增加Consul支持

s.AddOcelot()     

    .AddConsul();

  更多内容,请移步:Ocelot官方文档-服务发现

3.2 修改Ocelot配置文件增加Consul配置

"GlobalConfiguration": {	"BaseUrl": "http://api.xique.com",	"ServiceDiscoveryProvider": {	"Host": "192.168.16.170",	"Port": 8550,	"Type": "Consul"	}	}

  *.这里指向的是Consul Client实例的地址

  此外,Ocelot默认策略是每次请求都去Consul中获取服务地址列表,如果想要提高性能,也可以使用PollConsul的策略,即Ocelot自己维护一份列表,然后定期从Consul中获取刷新,就不再是每次请求都去Consul中拿一趟了。例如下面的配置,它告诉Ocelot每2秒钟去Consul中拿一次。

    "Type": "PollConsul",	"PollingInterval": 2000

3.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中配置的服务名(ServiceName),以及告诉Ocelot我们使用轮询策略(RoundRobin)做负载均衡。

3.4 验证

  第一次访问:

  640?wx_fmt=png

  第二次访问:

  640?wx_fmt=png

四、HA示例整体架构

  对于实际应用中,我们往往会考虑单点问题,因此会借助一些负载均衡技术来做高可用的架构,这里给出一个建议的HA示例的整体架构:

640?wx_fmt=png

  对于一个API请求,首先会经历一个Load Balancer才会到达API Gateway,这个Load Balancer可以是基于硬件的F5,也可以是基于软件的Nginx或LVS再搭配Keepalived,一般来说大部分团队都会选择Nginx。然后API Gateway通过部署多个,来解决单点问题,也达到负载均衡的效果。而对于API Gateway和Consul Client之间的连接,我们往往也会增加一个Load Balancer来实现服务发现的高可用,这个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社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hills And Valleys CodeForces - 1467B 思维

给你一个数组,最多可以修改一个数,问最少的山峰和山谷数量之和。 小菜鸡做了一年。 一上来想猜个结论,让每个数等于其相邻的两个数,看了题解之后也证明的正确性,当时直接写就没后面这么多事了。 但是命运让我分情况讨…

2018 ACM-ICPC World Finals Problem D.Gem Island

2018 ACM-ICPC World Finals Problem D.Gem Island Solution 其实就是求x1x2⋯xnnd,xi∈[1,d1]x_1x_2\dots x_nnd,x_i\in[1,d1]x1​x2​⋯xn​nd,xi​∈[1,d1]的前rrr大的xix_ixi​的和的期望,可以发现每一种不同的序列{xi}\{x_i\}{xi​}的出现概率都是一个定值&a…

[译]使用LazZiya.ExpressLocalization开发多语言支持的ASP.NET Core 2.x项目

介绍开发多语言支持的ASP.NET Core 2.x Web应用程序需要大量的基础架构设置,并且耗费时间和精力。这篇文章,我们将使用LazZiya.ExpressLocalization nuget包一步本地化支持。背景大多数网络应用程序都是基于网址的本地化。因此我们可以在网址中看到所选的…

2019 ICPC World Finals Problem B. Beautiful Bridges

2019 ICPC World Finals Problem B. Beautiful Bridges Solution 太菜了,sbsbsb题调了一个下午。 首先有一个显然的O(n3)O(n^3)O(n3)的dpdpdp,令fif_ifi​表示最后一个桥柱在iii的最小代价,枚举上一个桥柱jjj,因为地面超过桥拱…

ac 梦幻布丁 启发式合并

题意:中文题。 对于每种颜色,我们都可以看成一个集合。让后把一种颜色变成另一种颜色就转换成了把两个集合的合并问题。显然我们有一个复杂度为O(NlogN)O(NlogN)O(NlogN)的启发式合并能完美的解决这个问题。 解决合并问题了,现在需要解决如何…

VS Code 1.35 发布!全新 logo 来临,远程开发进入稳定版

近期( 北京时间 2019 年 6 月 6 日 ),微软发布了 Visual Studio Code 1.35 版本,带来了众多更新。全新的 logo全新的图标来啦~ 这一次的图标更新历时两个月,VS Code 团队倾听了用户们的反馈。大家对新图标还喜欢吗&…

P2617 Dynamic Rankings 整体二分

树套树板子题,但是整体二分不管是时间复杂度还是空间复杂度都表现更优秀,所以用整体二分来水一波。 普通的整体二分是没有修改操作的。然鹅我们处理修改操作也比较容易,直接减上这个数,让后加上修改之后的数即可。这样按照时间戳来…

2019 ICPC World Finals Problem J. Miniature Golf

2019 ICPC World Finals Problem J. Miniature Golf Solution 设lll为l0l_0l0​时iii的总分为si,l0s_{i,l_0}si,l0​​,si,l0∑kmin(ai,k,l0)s_{i,l_0}\sum_k min(a_{i,k},l_0)si,l0​​∑k​min(ai,k​,l0​),让lll从小到大依次变化,可以发…

基于Domain Driven Design&Clean Architecture原则分层的新启动模板

本文的内容将在0.18.0中发布. Abp中文网将同步更新框架.敬请期待...MVC应用程序启动模板介绍MVC应用程序启动模板是基于领域驱动设计(DDD)分层(或根据偏好分层)的应用程序结构.在这篇文档中详细介绍了解决方案结构和项目参阅ASP.NET Core MVC 模板入门创建此模板的新解决方案并…

CF 1475 F . Unusual Matrix 思维

传送门 大体题意:给定两个矩阵a和b,给定一个操作,这个操作可以将a矩阵任意一行或者任意一列取反,问能否将a变成b。 乍一看不是一个很难的题,但是想我这样思维不好的还是看不出来什么东西。让后看到了题解前几句话 “ …

NEERC 17 Problem I. Interactive Sort

NEERC 17 Problem I. Interactive Sort Solution 当写了两倍正解的代码使用了两倍于正解的操作步数…… 刚开始的想法是求出一个bbb,再求出一个aaa,依次轮换,分别维护当前知道确定值的a,ba,ba,b的有序序列,然后求aaa就在bbb的有…

.Net Core 微服务容器系列基础目录篇

1.开场白HI,各位老铁,大家端午好,之前写了些关于.net core商城系列的文章,有点乱,今天心血来潮想着整理一下(今天只是先把目录列出来,后面的每篇文章这两天会进行重新修改的,目前先将…

CF 1475 D. Cleaning the Phone 思维模型

传送门 题意&#xff1a;一个人有n个程序&#xff0c;每个程序都有占的缓存和价值。现在要释放m及以上的缓存&#xff0c;求失去的价值的最小值。 题解 首先我们知道如果所有缓存加起来 < m 的话&#xff0c;直接输出 - 1 就行啦。 其次呢&#xff0c;我们发现价值只有1和2…

NEERC 17 G.The Great Wall

NEERC 17 G.The Great Wall Solution 这题的第一步tricktricktrick是&#xff1a;我们注意到取a,b,ca,b,ca,b,c的集合两两不交且并集为UUU&#xff0c;因此确定了b,cb,cb,c之后可以简单地唯一确定aaa&#xff0c;于是我们通过让bi−ai,ci−ai,Ans∑aib_i-a_i,c_i-a_i,Ans\sum…

感谢诸君的陪伴,见证微信 SDK 的成长,内含黑科技福利

Senparc.Weixin SDK5000Stars5000 Star5005005000 Stars今天 SDK 已经超过 5000 Stars在此感谢大家的每一份支持和一直以来的关注是你们的信任和陪伴给了我们前行的力量 在未来的日子里也希望大家能够继续支持我们我们将以优秀的产品和服务来回馈你们的支持&#xff01;愿我们携…

NEERC13 Problem H.Hack Protection

NEERC13 Problem H.Hack Protection Solution 注意到题目中的区间与&#xff0c;在左端点lll确定的情况下&#xff0c;对于所有r≥lr\geq lr≥l&#xff0c;ANDl,rAND_{l,r}ANDl,r​只有logloglog种取值&#xff0c;这是一个极为常见的性质。 于是我们从大到小枚举lll&#…

ABC 189 E - Rotate and Flip 矩阵转移

传送门 题意&#xff1a;给定n个点&#xff0c;m个操作&#xff0c;n和m都是1e5级别的。让后每个操作是将这个点绕原点顺时针、逆时针转90&#xff0c;将这个点按照 x p 或着 y p 做对称。再有q个询问&#xff0c;q也是1e5级别的。让后每个询问是问B这个点在第A次操作之后在…

我,宇宙最强编辑器,支持远程开发

Visual Studio Code 五月份更新之 1.35 版本已发布。此次更新的亮点包括更新 Visual Studio Code 图标 - 新版本更新了 logo。改进“转到定义&#xff08;Go to Definition&#xff09;”行为 - 通过多个定义的显示&#xff0c;更快速进行导航&#xff08;Navigation&#xff0…

ARC068C - Snuke Line

ARC068C - Snuke Line Description 其实就是给出nnn个区间[li,ri][l_i,r_i][li​,ri​]对于每一个i∈[1,M]i\in[1,M]i∈[1,M]&#xff0c;求&#xff1a; ∑j1n[⌊rji⌋−⌊lj−1i⌋≥1]\sum_{j1}^n[\lfloor \frac{r_j}{i}\rfloor-\lfloor \frac{l_j-1}{i}\rfloor\geq 1]j1∑…

.NET Core Run On Docker By Kubernetes 系列文章汇总

前言介绍.NET Core是微软新一代主力编程平台&#xff0c;开源、免费、跨平台、轻量级、高性能&#xff0c;支持Linux、Docker、k8s等环境&#xff0c;适合开发微服务、云原生、大型互联网应用、全开源解决方案。Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们…