一、前言


在写这篇文章之前,我看了很多关于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实现服务治理相关推荐

  1. consul集群安装以及服务的注册和发现

    consul集群安装 用springboot写了几个项目,leader说服务可以试着向consul上边迁移,于是搭建了consul的测试集群,至于为什么不用eureka,可以看下边这个表 Featur ...

  2. asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)

    概述 本文目的是搭建三台asp.net core 集群, 并配上 nginx做负载均衡 首先准备要运行的源码 http://pan.baidu.com/s/1c20x0bA 准备三台服务器(或则虚拟机 ...

  3. Consul 集群单节点与多节点

    Consul 集群 Docker concul 容器服务更新与发现: 简介 搭建 consul 集群: 部署过程: (1)配置 consul 服务器: (2)查看集群信息: (3)通过 httpd a ...

  4. 【Spark亚太研究院系列丛书】Spark实战高手之路-第一章 构建Spark集群(第二步)(4)...

    2019独角兽企业重金招聘Python工程师标准>>> 4.测试Hadoop分布式集群环境: 首先在通过Master节点格式化集群的文件系统: 输入"Y"完成格式 ...

  5. .NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新

    我们都知道在6月12日的时候微软发布了.NET Core 3.0的第6个预览版.针对.NET Core 3.0的发布我们国内的微软MVP-汪宇杰还发布的官翻版的博文进行了详细的介绍.具体的可以关注&q ...

  6. 更新丨.NET 7 预览版2 中的 ASP.NET Core

    点击上方蓝字  关注我们 (本文阅读时间:6分钟) .NET 7 预览版2 现已推出,其中包括对 ASP.NET Core 的许多重大改进. 以下是此预览版中新增内容的摘要: • 推断来自服务的 AP ...

  7. IIS中的 Asp.Net Core 和 dotnet watch

    在基于传统的.NET Framework的Asp.Net Mvc的时候,本地开发环境中可以在IIS中建立一个站点,可以直接把站点的目录指向asp.net mvc的项目的根目录.然后build一下就可以 ...

  8. 在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序

    前言 Visual Studio 2017已经发布了很久了.做为集成了Asp.Net Core 1.1的地表最强IDE工具,越来越受.NET系的开发人员追捧. 随着Google Angular4的发布 ...

  9. 在Linux和Windows的Docker容器中运行ASP.NET Core

    译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了.那么我就来翻译一下这篇文章,让更多的中文读者看到.当然Scott遇到的坑我也遇 ...

最新文章

  1. 知乎多场景内容匹配方案荣获CSDN AI优秀案例奖
  2. python图片找字_如何用python查找图像中的字母
  3. python下载晚上excel_Python自动操控excel,一小时解决你一天的工作
  4. 【JAVA 第三章 流程控制语句】课后习题 编写判断从键盘输入的字符串是否为回文
  5. 包含几通道数据_温度采集,无处不测!「数据采集」
  6. 关于Zookeeper的几个问题
  7. Robot Framework(十四) 扩展RobotFramework框架——创建测试库
  8. 计算机网络---IP数据报组成计及IP模块工作流程
  9. Gym101237C The Palindrome Extraction Manacher、SAM、倍增
  10. 7-35 混合类型数据格式化输入 (5 分)
  11. 三维地图数据资源汇总
  12. php 简单聊天室 实例,PHP简易聊天室实例
  13. Unity简易小地图制作
  14. 深度学习目标检测方法
  15. 阿尔茨海默病最新研究进展(2021年)
  16. 1.5.33 计算分数加减表达式的值
  17. 超3成医院未通过等保测评?亚信安全终端一体化赋能医疗行业安全
  18. Lombok 插件安装、使用
  19. Jenkins+Bitbucket webhook 自动触发构建
  20. 关于win10图标不正常显示的一种解决方法

热门文章

  1. 正则表达式应用:实现一个简单的计算器
  2. 2018-2019-1 20165211 实验四 外设驱动程序设计
  3. 常见的几种RuntimeException
  4. linux笔记 3-4 SMTP,.配置电子邮件传输
  5. ios下划线变量:为什么变量前要加下划线才有用?
  6. 【bayes】贝叶斯likelihood和model
  7. Avalonia跨平台入门第二十二篇之人脸检测
  8. c#使用PdfiumViewer展示、打印pdf文档
  9. 实践剖析.NET Core如何支持Cookie滑动过期和JWT混合认证、授权
  10. Orchard Core 1.0.0 正式发布!