实战中的asp.net core结合Consul集群&Docker实现服务治理

https://www.cnblogs.com/guolianyu/p/9614050.html

0、目录

整体架构目录:ASP.NET Core分布式项目实战-目录

一、前言

在写这篇文章之前,我看了很多关于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,代表健康检查

复制代码

[Produces("application/json")]

[Route("api/Health")]

public class HealthController : Controller

{

[HttpGet]

public IActionResult Get() => Ok("ok");

}

复制代码

3、然后在appsetting.json中添加配置文件

需要手动配置一下地址和端口号。

复制代码

{

"Logging": {

"IncludeScopes": false,

"Debug": {

"LogLevel": {

"Default": "Warning"

}

},

"Console": {

"LogLevel": {

"Default": "Warning"

}

}

},

"ServiceRegister": { //服务注册

"IsActive": true,

"ServiceName": "testconsul6",

"ServiceHost": "192.168.216.163",

"ServicePort": 5006,

"Register": {

"HttpEndpoint": "http://192.168.216.163:8500"

}

}

}

复制代码

4、这一步是服务注册的类

ServiceRegisterOptions.cs

复制代码

public class ServiceRegisterOptions

{

///



/// 是否启用

///

public bool IsActive { get; set; }

///



/// 服务名称

///

public string ServiceName { get; set; }

///



/// 服务IP或者域名

///

public string ServiceHost { get; set; }

///



/// 服务端口号

///

public int ServicePort { get; set; }

///



/// consul注册地址

///

public RegisterOptions Register { get; set; }

}

复制代码

RegisterOptions.cs

public class RegisterOptions

{

public string HttpEndpoint { get; set; }

}

5、在startup.cs 中的服务注册

复制代码

public void ConfigureServices(IServiceCollection services)

{

#region 服务注册基础信息配置

services.Configure(Configuration.GetSection("ServiceRegister"));

services.AddSingleton(p => new ConsulClient(cfg =>

{

var serviceConfiguration = p.GetRequiredService<IOptions>().Value;

if (!string.IsNullOrEmpty(serviceConfiguration.Register.HttpEndpoint))

{

cfg.Address = new Uri(serviceConfiguration.Register.HttpEndpoint);

}

}));

#endregion

        services.AddMvc();
}

复制代码

在Configure 方法中配置代码

复制代码

private static void RegisterService(IApplicationBuilder app,

IOptions serviceRegisterOptions,

IConsulClient consul,

IApplicationLifetime appLife)

{

var serviceId = $"{serviceRegisterOptions.Value.ServiceName}_{serviceRegisterOptions.Value.ServiceHost}:{serviceRegisterOptions.Value.ServicePort}";

        var httpCheck = new AgentServiceCheck()
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册
Interval = TimeSpan.FromSeconds(30),//健康检查时间间隔,或者称为心跳间隔
HTTP = $"http://{serviceRegisterOptions.Value.ServiceHost}:{serviceRegisterOptions.Value.ServicePort}/api/health",//健康检查地址
}; var registration = new AgentServiceRegistration()
{
Checks = new[] { httpCheck },
Address = serviceRegisterOptions.Value.ServiceHost,
ID = serviceId,
Name = serviceRegisterOptions.Value.ServiceName,
Port = serviceRegisterOptions.Value.ServicePort
//Tags = new[] { $"urlprefix-/{serviceRegisterOptions.Value.ServiceName}" }//添加 urlprefix-/servicename 格式的 tag 标签,以便 Fabio 识别
};
//.GetAwaiter().GetResult()
consul.Agent.ServiceRegister(registration).GetAwaiter().GetResult(); appLife.ApplicationStopping.Register(() =>
{
consul.Agent.ServiceDeregister(serviceId).GetAwaiter().GetResult();//服务停止时取消注册
});
}
#endregion

复制代码

自此,可以把我们的项目部署到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

.net core结合Consul集群&Docker实现服务治理的更多相关文章

  1. 实战中的asp.net core结合Consul集群&Docker实现服务治理

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在 ...

  2. 使用Docker搭建consul集群+registrator实现服务自动注册。

    准备工作:10.173.16.83 master10.172.178.76 node110.171.19.139 node210.162.204.252 node3 一.安装consul-cluste ...

  3. consul集群docker版本脚本

    https://blog.csdn.net/fenglailea/article/details/79098246 docker run -d --name node1 -e 'CONSUL_LOCA ...

  4. Prometheus 通过 consul 分布式集群实现自动服务发现

    转载自:https://cloud.tencent.com/developer/article/1611091 1.Consul 介绍 Consul 是基于 GO 语言开发的开源工具,主要面向分布式, ...

  5. 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现

    庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介      在第七篇文章<庐山真面目之七微服务架构Consul ...

  6. Docker 容器部署 Consul 集群

    Docker 容器部署 Consul 集群 一.docker安装与启动1.1安装docker[root@localhost /]# yum -y install docker-io 1.2更改配置文件 ...

  7. Docker部署Consul集群

    服务介绍 Consul是一种分布式.高可用.支持水平扩展的服务注册与发现工具.包含的特性有:服务发现.健康检查.键值存储.多数据中心和服务管理页面等. 官方架构设计图: 图中包含两个Consul数据中 ...

  8. Docker应用系列(三)| 构建Consul集群

    本示例基于Centos 7,在阿里云的三台机器上部署consul集群,假设目前使用的账号为release,拥有sudo权限. 由于Docker官方镜像下载较慢,可以开启阿里云的Docker镜像下载加速 ...

  9. vagrant+docker搭建consul集群开发环境

    HashiCorp 公司推出的Consul是一款分布式高可用服务治理与服务配置的工具.关于其配置与使用可以参考这篇文章 consul 简介与配置说明. 一般,我们会在多台主机上安装并启动 consul ...

随机推荐

  1. 联合文件系统 unionfs

  2. 优化MD5和IP在(MySQL)数据库中的存储

    1.MD5在MySQL数据库中的存储 用CHAR(32)来存储MD5值是一个常见的技巧.如果你的应用程序使用VARCHAR(32),则对每个值得字符串长度都需要花费额外的不 必要的开销.这个十六进制的 ...

  3. 【Tech】单点登录系统CAS客户端demo

    服务器端配置请参考: http://www.cnblogs.com/sunshineatnoon/p/4064632.html 工具:myeclipse或者javaee-eclipse 1.启动jav ...

  4. 案例:1 Ionic Framework+AngularJS+ASP.NET MVC WebApi Jsonp 移动开发

    落叶的庭院扫的一干二净之后,还要轻轻把树摇一下,抖落几片叶子,这才是Wabi Sabi的境界. 介绍:Ionic是移动框架,angularjs这就不用说了,ASP.Net MVC WebApi提供数据 ...

  5. MySQL索引操作命令详解

    创建索引: MySql创建索引的语法如下: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON table_ ...

  6. MongoDB快速入门(五)- Where子句

    RDBMS Where子句等效于MongoDB 查询文档在一些条件的基础上,可以使用下面的操作 操作 语法 示例 RDBMS等效语句 Equality {<key>:<value&g ...

  7. java基础(4)-数组(1)

    数组:存储同一种数据类型的多个元素的容器数组初始化: 元素类型[] 数组名 = new 元素类型[数组长度]int [] arr = new int[5] 元素类型[] 数组名 = new 元素类型[ ...

  8. 一个专为电商定制的域名.shop

    2.73亿元人民币获得.shop域名的经营权,使shop域名成为最高节拍价的顶级域名.虽然最终“最高节拍价”被web域名打破,但在电商届域名里shop还是王者.shop作为一个主要面向线上.线下销售实 ...

  9. java 学习汇总

    一.安装svn 插件 1.svn - http://subclipse.tigris.org/update 安装的过程中可能出错,解决方法: 导航到:The Eclipse Project Updat ...

  10. Codeforces Round #280 (Div. 2) D. Vanya and Computer Game 数学

    D. Vanya and Computer Game time limit per test 2 seconds memory limit per test 256 megabytes input s ...