.net core +ocelot+ consul 服务治理(干货)
本文案例说明环境:
Windows10、 VS2019、 netcore 3.1
consul概述说明
参考官方地址:https://www.consul.io/docs
Consul 是一个服务网格解决方案,提供具有服务发现、配置和分段功能的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用来构建完整的服务网格。是一个分布式、高可用的系统。
Consul 的主要特点是:
服务发现:Consul 的客户端可以注册服务,例如 apior mysql,其他客户端可以使用 Consul 发现给定服务的提供者。使用 DNS 或 HTTP,应用程序可以轻松找到它们所依赖的服务。
健康检查:Consul 客户端可以提供任意数量的健康检查,或者与给定服务相关联(“网络服务器是否返回 200 OK”),或者与本地节点相关联(“内存利用率是否低于 90%”)。操作员可以使用此信息来监控集群的健康状况,服务发现组件使用它来将流量从不健康的主机中路由出去。
KV 存储:应用程序可以将 Consul 的分层键/值存储用于任意数量的目的,包括动态配置、特征标记、协调、领导者选举等。简单的 HTTP API 使其易于使用。
安全服务通信:Consul 可以为服务生成和分发 TLS 证书以建立相互 TLS 连接。 意图 可用于定义允许通信的服务。可以通过可以实时更改的意图轻松管理服务分段,而不是使用复杂的网络拓扑和静态防火墙规则。
多数据中心:Consul 支持开箱即用的多个数据中心。这意味着 Consul 的用户不必担心构建额外的抽象层以扩展到多个区域。
consul 下载
下载地址:Downloads | Consul by HashiCorp
根据自身系统环境,安装对应版本
consul 可视化管理
下载安装解压到指定目录:

运行-CMD->切换到解压目录 D:\tools\consul_1.12.1_windows_amd64
启动consul命令:consul agent -dev (其它命令参考https://www.consul.io/commands)
默认端口8500

运行成功,浏览器打开http://127.0.0.1:8500/

.net core 网关
1)新建项目
新建一个.net core web api项目来做网关,部署时候需要分布式部署来达到高可用,以免单台机宕机后造成损失。

2)nuget 添加包
<PackageReference Include="Ocelot" Version="16.0.1" />
<PackageReference Include="Ocelot.Provider.Consul" Version="16.0.1" />
<PackageReference Include="Consul" Version="1.6.10.5" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
这里我是.net core3.1 版本支持包。如果使用了.net5、.net6可以安装更高版本
3)ocelot 配置
新增ocelot 配置文件:OcelotSettings.json
配置内容:
{
"Routes": [ //这里注意一下版本(旧版本用ReRoutes),官方文档ReRoutes全节点示例
{
//Upstream表示上游请求,即客户端请求到API Gateway的请求
"UpstreamPathTemplate": "/test/{url}", //请求路径模板
"UpstreamHttpMethod": [ "Get", "Post" ], //请求方法数组
//Downstreamb表示下游请求,即API Gateway转发的目标服务地址
"DownstreamPathTemplate": "/{url}", //下游请求地址模板
"DownstreamScheme": "https", //请求协议,目前应该是支持http和https
"LoadBalancerOptions": {
"type": "RoundRobin" // 负载均衡 RoundRobin(轮询)/LeastConnection(最少连接数)
},
"UseServiceDiscovery": true, //使用服务发现,目前Ocelot只支持Consul的服务发现
"ServiceName": "ConsulService" //consul服务名称
},
{ //官方文档ReRoutes全节点示例
//Upstream表示上游请求,即客户端请求到API Gateway的请求
"UpstreamPathTemplate": "/hello/{url}", //请求路径模板
"UpstreamHttpMethod": [ "Get", "Post" ], //请求方法数组
//Downstreamb表示下游请求,即API Gateway转发的目标服务地址
"DownstreamPathTemplate": "/{url}", //下游请求地址模板
"DownstreamScheme": "https", //请求协议,目前应该是支持http和https
"LoadBalancerOptions": {
"type": "RoundRobin" // 负载均衡 RoundRobin(轮询)/LeastConnection(最少连接数)
},
"UseServiceDiscovery": true, //使用服务发现,目前Ocelot只支持Consul的服务发现
"ServiceName": "HelloService" //consul服务名称
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:5001", //网关对外地址
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 8500,
"Type": "Consul" //由Consul提供服务发现
}
}
}
注:这里Routes为了更好说明,配置了两个。正常我们配置一个则可,二级目录可以通过微服务api项目route指定 area。 这里通过配置指定test、hello 二级目录名称。
后面微服务api对配置项做说明
4)ocelot注入


这里要注意AddConfigStoredInConsul 这个扩展。加上这个ocelot这个配置内容将可以在consul界面查看管理(修改及时生效),可视化管理配置。

至此网关结束
.net core api
1)新建项目
新增ConsfulDemo、ConsulDemoTwo 两个.net core web api项目
两个项目分部添加一个HealthController控制做健康监测,方便区分返回不同值


- 添加一个consul通用注册静态类
这里为了更方便同一个微服务api指定多个端口访问。如果指定一个端口访问可以直接把相关值放配置文件
public static void ConsulReg(this IConfiguration configuration)
{
ConsulClient client = new ConsulClient(c =>
{
///找到 Consul地址,默认地址
c.Address = new Uri("http://127.0.0.1:8500/"); //放入配置文件
c.Datacenter = "test_demo";
});
string ip = configuration["ip"] ?? "localhost"; //ip
string group = configuration["group"] ?? "ConsulService"; //注册服务名称(组)(对应网关配置ServiceName)
string tag = configuration["weight"]??"1"; //权重
int port = int.Parse(configuration["port"]??"0"); //端口
if (port == 0)
{
Console.WriteLine($"https://{ip}:{port}注册失败:请指定port,且不能重复");
return;
}
client.Agent.ServiceRegister(new AgentServiceRegistration()
{
///微服务唯一标识,唯一的
ID = "service-" + port,
Name = group,//服务名称(组)
Address = ip,//ip地址
Port = port,//端口
///标签参数,可以在注册的时候根据拿到tags标签来当权重,可以是属于地址参数上的tag
///注册服务时指定权重,分配时获取权重并以此为依据分配实例
Tags = new string[] { tag },
#region 配置心跳检查的
Check = new AgentServiceCheck()
{
///心跳时间
Interval = TimeSpan.FromSeconds(10),
///心跳地址
HTTP = $"https://{ip}:{port}/health/index",
///超时时间
Timeout = TimeSpan.FromSeconds(5),
///取消服务注册时间
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5)
}
#endregion
});
Console.WriteLine($"https://{ip}:{port}完成注册");
}
注:这里注意以上Name(对应网关配置的ServiceName) 、Tags 权重(调用的权重比重)
- 注入
两个项目分别注入

注入配置如果配置写死,运行两个微服务api项目,则服务自动注入到consul
这里通过命令形式,分别对两个微服务指定不同端口注册到consul
4)consul注册
运行->CMD 切换到项目目录 \bin\Debug\netcoreapp3.1>
执行命令:
dotnet ConsfulDemo.dll --urls="https://*:5010" --ip="localhost" --port=5010 --weight=1
dotnet ConsfulDemo.dll --urls="https://*:5011" --ip="localhost" --port=5011 --weight=2
两个不同权重,不同端口
dotnet ConsulDemoTwo.dll --urls="https://*:5020" --ip="localhost" --port=5020 --weight=1 --group=HelloService
dotnet ConsulDemoTwo.dll --urls="https://*:5021" --ip="localhost" --port=5021 --weight=2

--group=HelloService 默认不配置会使用ConsulService 这个服务名称
回到consul管理界面 Service服务列表多了刚才注入的两个服务



浏览器访问网关地址:https://localhost:5001/test/health/index 不停刷新,会在ok111、ok222切换


我们单独服务HelloService 的配置:

停掉5011端口,心跳检测马上显示异常

网关配置管理

可视化界面看网关配置,我们把ConsulService 服务的 请求路径地址模板改一下test 改成test1 保存,浏览器访问https://localhost:5001/test1/health/index
.net core +ocelot+ consul 服务治理-pudn.com
浙公网安备 33010602011771号