实战中的asp.net core结合Consul集群Docker实现服务治理
一、前言
在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在服务器上面直接输入consul agent .... 来搭建启动consul集群,一旦把命令工具关掉,则consul无法再后台启动,尤其是在linux系统中。
如果在window系统中,采用bat文件到时可以做成开机自启,或者在linux中把命令做成一个service 服务文件来启动就可以实现后台运行。
因此为了社区能更好的发展技术,且能把consul应用在生产环境中,我认真回顾了在公司项目中的应用,特此把我开发及总结的分享给大家,此篇文章采用docker引擎,并且只涉及到consul集群部署以及结合asp.net core微服务注册。
当然如果内容有涉及安全隐患的,大家可以积极留言,共同进步。
注:以下所涉及到部署过程全部经过楼主我反复的验证,总结得来。大家在应用的过程中如果出现问题,可以留言咨询。
二、部署consul集群
1、介绍一下Consul
consul 关键特性
服务发现:支持服务发现。你可以通过 DNS 或 HTTP 的方式获取服务信息。
健康检查:支持健康检查。可以提供与给定服务相关联的任何数量的健康检查(如 web 状态码或 cpu 使用率)。
K/V 存储:键/值对存储。你可用通过 consul 存储如动态配置之类的相关信息。
多数据中心:支持多数据中心,开箱即用。
WEB UI:支持 WEB UI。点点点,你就能够了解你的服务现在的运行情况,一目了然,对开发运维是非常友好的。
说明:
在Consul方案中,每个提供服务的节点上都要部署和运行Consul的Client Agent,所有运行Consul Agent节点的集合构成Consul Cluster。
Consul Agent有两种运行模式:Server和Client。这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关。以Server模式运行的Consul Agent节点用于维护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server Mode的Agent,Client节点不限。
Consul支持多数据中心,每个数据中心的Consul Cluster都会在运行于Server模式下的Agent节点中选出一个Leader节点,这个选举过程通过Consul实现的raft协议保证,多个 Server节点上的Consul数据信息是强一致的。处于Client Mode的Consul Agent节点比较简单,无状态,仅仅负责将请求转发给Server Agent节点。
Consul与其他工具的比较
consul的端口解释
好了,该介绍的已经介绍了,接下来就是正式部署吧
2、Docker上运行Consul
第一步:安全配置,适用授权和数据加密传输(生产环境是必须的)
为了consul的安全,需要进行gossip加密以及RPC加密结合TLS。
Gossip加密:主要用于节点间的接收发送集群信息安全。
RPC加密:主要用于Agent之间调用RPC授权的安全性。
此处大家可以参考官网或者一下资料:
https://www.jianshu.com/p/3d074ed76a68
https://www.consul.io/docs/agent/encryption.html
第二步:consul集群部署
准备服务器(可以采用虚拟机部署)
名称 | IP | |
CentOS7-1 | server1 | 192.168.216.160 |
CentOS7-2 | server2 | 192.168.216.161 |
CentOS7-3 | server3 | 192.168.216.162 |
CentOS7-4 | client1 | 192.168.216.163 |
vs 2017 | project部署在docker上 | 192.168.216.163 |
部署server1
docker run -d --net=host -v $PWD/data:/consul/data -v $PWD/config:/consul/config --restart always --name consulServer1 consul agent -server -bind=192.168.216.160 -node=server1 -bootstrap-expect 3 -data-dir=/consul/data -config-file=/consul/config -client 0.0.0.0 -ui
部署server2
docker run -d --net=host -v $PWD/data:/consul/data -v $PWD/config:/consul/config --restart always --name cs2 consul agent -server -bind=192.168.216.161 -node=server2 -bootstrap-expect 3 -data-dir=/consul/data -config-file=/consul/config -client 0.0.0.0 -ui -retry-join=192.168.216.160
部署server3
docker run -d --net=host -v $PWD/data:/consul/data -v $PWD/config:/consul/config --restart always --name cs3 consul agent -server -bind=192.168.216.162 -node=server3 -bootstrap-expect 3 -data-dir=/consul/data -config-file=/consul/config -client 0.0.0.0 -ui -retry-join=192.168.216.160
部署client-连接server
docker run -d --net=host -v $PWD/data:/consul/data -v $PWD/config:/consul/config --restart always --name cc1 consul agent -bind=192.168.216.163 -node=client1 -data-dir=/consul/data -config-file=/consul/config -client 0.0.0.0 -retry-join=192.168.216.160
注:(针对以上的参数以及配置解释)
1、此处的数据挂载就是把容器内的data以及配置挂载到外部地址,$PWD代表当前目录即你运行docker命令时的目录,当然$PWD可以替换为具体的路径。
2、-data-dir=/consul/consul -config-file=/consul/config :这两个地方代表在consul启动后会把数据以及配置文件放到指定的目录下,这个对于在服务器模式下运行的代理尤其重要,因为它们必须能够保持群集状态。
3、总结,以上两点结合就是说明 consul产生的数据然后挂载在外部地址进行持久化存储。
4、server端 的-client 参数可以不用,官方推荐是 服务注册到client端,由client端再把数据统一提交到server端。
参数说明
-client : 0.0.0.0 代表绑定到所有接口的选项,如果没有此选项,则asp.net core无法进行服务注册使用
-bind :该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的
--net=host 使得docker容器越过了net namespace的隔离,免去手动指定端口映射的步骤
-retry-join 允许你在第一次失败后进行尝试,加入一个已经启动的agent的ip地址
-bootstrap-expect 提供的server节点数目
-ui 启动自有主机的界面
-data-dir :提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}:在0.7版本之后默认是true,因此不是必须的。
CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}:在0.7版本之后默认是true,因此不是必须的。如果启用,当代理收到TERM信号时,它将向Leave群集的其余部分发送消息并正常离开
打开浏览器器查看 consul :
看所有consul节点情况
docker exec -t cs1 consul members
查看server的状态,以及哪一个节点是leader
docker exec -t cs1 consul operator raft list-peers
注:
如果其中一台或者多台server端挂掉,则Consul集群就会重新选举新的Leader,
但是一旦挂掉阿的节点数量超过一半,则Consul集群就无法工作了。
三、asp.net core微服务进行服务注册
1、新建一个项目asp.net core webapi项目
引入 consul ,nuget包
2、在控制器中新建一个控制器Health,代表健康检查
3、然后在appsetting.json中添加配置文件
需要手动配置一下地址和端口号。
4、这一步是服务注册的类
ServiceRegisterOptions.cs
RegisterOptions.cs
public class RegisterOptions{ public string HttpEndpoint { get; set; }}
5、在startup.cs 中的服务注册
在Configure 方法中配置代码
自此,可以把我们的项目部署到163服务器上面的docker上啦。
我们看一下效果,成功注册到了
参考资料:
Conusl TLS配置:
https://www.jianshu.com/p/3d074ed76a68
https://www.consul.io/docs/agent/encryption.html
consul 参数配置:
https://blog.csdn.net/zl1zl2zl3/article/details/79622476
consul服务治理:
http://michaco.net/blog/ServiceDiscoveryAndHealthChecksInAspNetCoreWithConsul
https://www.cnblogs.com/myzony/p/9168851.html
https://www.cnblogs.com/edisonchou/p/9124985.html
原文地址:https://www.cnblogs.com/guolianyu/p/9614050.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
实战中的asp.net core结合Consul集群Docker实现服务治理相关推荐
- consul集群安装以及服务的注册和发现
consul集群安装 用springboot写了几个项目,leader说服务可以试着向consul上边迁移,于是搭建了consul的测试集群,至于为什么不用eureka,可以看下边这个表 Featur ...
- asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)
概述 本文目的是搭建三台asp.net core 集群, 并配上 nginx做负载均衡 首先准备要运行的源码 http://pan.baidu.com/s/1c20x0bA 准备三台服务器(或则虚拟机 ...
- Consul 集群单节点与多节点
Consul 集群 Docker concul 容器服务更新与发现: 简介 搭建 consul 集群: 部署过程: (1)配置 consul 服务器: (2)查看集群信息: (3)通过 httpd a ...
- 【Spark亚太研究院系列丛书】Spark实战高手之路-第一章 构建Spark集群(第二步)(4)...
2019独角兽企业重金招聘Python工程师标准>>> 4.测试Hadoop分布式集群环境: 首先在通过Master节点格式化集群的文件系统: 输入"Y"完成格式 ...
- .NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新
我们都知道在6月12日的时候微软发布了.NET Core 3.0的第6个预览版.针对.NET Core 3.0的发布我们国内的微软MVP-汪宇杰还发布的官翻版的博文进行了详细的介绍.具体的可以关注&q ...
- 更新丨.NET 7 预览版2 中的 ASP.NET Core
点击上方蓝字 关注我们 (本文阅读时间:6分钟) .NET 7 预览版2 现已推出,其中包括对 ASP.NET Core 的许多重大改进. 以下是此预览版中新增内容的摘要: • 推断来自服务的 AP ...
- IIS中的 Asp.Net Core 和 dotnet watch
在基于传统的.NET Framework的Asp.Net Mvc的时候,本地开发环境中可以在IIS中建立一个站点,可以直接把站点的目录指向asp.net mvc的项目的根目录.然后build一下就可以 ...
- 在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序
前言 Visual Studio 2017已经发布了很久了.做为集成了Asp.Net Core 1.1的地表最强IDE工具,越来越受.NET系的开发人员追捧. 随着Google Angular4的发布 ...
- 在Linux和Windows的Docker容器中运行ASP.NET Core
译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了.那么我就来翻译一下这篇文章,让更多的中文读者看到.当然Scott遇到的坑我也遇 ...
最新文章
- 知乎多场景内容匹配方案荣获CSDN AI优秀案例奖
- python图片找字_如何用python查找图像中的字母
- python下载晚上excel_Python自动操控excel,一小时解决你一天的工作
- 【JAVA 第三章 流程控制语句】课后习题 编写判断从键盘输入的字符串是否为回文
- 包含几通道数据_温度采集,无处不测!「数据采集」
- 关于Zookeeper的几个问题
- Robot Framework(十四) 扩展RobotFramework框架——创建测试库
- 计算机网络---IP数据报组成计及IP模块工作流程
- Gym101237C The Palindrome Extraction Manacher、SAM、倍增
- 7-35 混合类型数据格式化输入 (5 分)
- 三维地图数据资源汇总
- php 简单聊天室 实例,PHP简易聊天室实例
- Unity简易小地图制作
- 深度学习目标检测方法
- 阿尔茨海默病最新研究进展(2021年)
- 1.5.33 计算分数加减表达式的值
- 超3成医院未通过等保测评?亚信安全终端一体化赋能医疗行业安全
- Lombok 插件安装、使用
- Jenkins+Bitbucket webhook 自动触发构建
- 关于win10图标不正常显示的一种解决方法
热门文章
- 正则表达式应用:实现一个简单的计算器
- 2018-2019-1 20165211 实验四 外设驱动程序设计
- 常见的几种RuntimeException
- linux笔记 3-4 SMTP,.配置电子邮件传输
- ios下划线变量:为什么变量前要加下划线才有用?
- 【bayes】贝叶斯likelihood和model
- Avalonia跨平台入门第二十二篇之人脸检测
- c#使用PdfiumViewer展示、打印pdf文档
- 实践剖析.NET Core如何支持Cookie滑动过期和JWT混合认证、授权
- Orchard Core 1.0.0 正式发布!