国外网站 icp备案,系统网站开发,辽宁省建设工程招标网,经营管理培训课程在分布式架构中#xff0c;服务治理是必须面对的问题#xff0c;如果缺乏简单有效治理方案#xff0c;各服务之间只能通过人肉配置的方式进行服务关系管理#xff0c;当遇到服务关系变化时#xff0c;就会变得极其麻烦且容易出错。Consul[1] 是一个用来实现分布式系统服务… 在分布式架构中服务治理是必须面对的问题如果缺乏简单有效治理方案各服务之间只能通过人肉配置的方式进行服务关系管理当遇到服务关系变化时就会变得极其麻烦且容易出错。Consul[1] 是一个用来实现分布式系统服务发现与配置的开源工具。它内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案不再需要依赖其他工具比如 ZooKeeper 等使用起来也较为简单。Consul 架构Consul 集群支持多数据中心在上图中有两个 DataCenter他们通过 Internet 互联为了提高通信效率只有 Server 节点才加入跨数据中心的通信。在单个数据中心中Consul 分为 Client 和 Server 两种节点所有的节点也被称为 AgentServer 节点保存数据Client 负责健康检查及转发数据请求到 Server本身不保存注册信息Server 节点有一个 Leader 和多个 FollowerLeader 节点会将数据同步到 FollowerServer 节点的数量推荐是3个或者5个在 Leader 挂掉的时候会启动选举机制产生一个新 Leader。Consul 集群搭建这里使用 Docker 搭建 3个 Server 节点 1 个 Client 节点API 服务通过 Client 节点进行服务注册和发现。从 Docker Hub 拉取 Consul 镜像docker pull consul
启动 3个 Server 节点 1 个 Client 节点docker-compose.yaml 如下version: 3services:cs1:image: consulcommand: agent -server -client0.0.0.0 -bootstrap-expect3 -nodecs1 -data-dir/datavolumes:- /usr/local/docker/consul/data/cs1:/datacs2:image: consulcommand: agent -server -client0.0.0.0 -retry-joincs1 -nodecs2 -data-dir/datavolumes:- /usr/local/docker/consul/data/cs2:/datadepends_on:- cs1cs3:image: consulcommand: agent -server -client0.0.0.0 -retry-joincs1 -nodecs3 -data-dir/datavolumes:- /usr/local/docker/consul/data/cs3:/datadepends_on:- cs1cc1:image: consulcommand: agent -client0.0.0.0 -retry-joincs1 -ui -nodecc1 -data-dir/dataports:- 8500:8500volumes:- /usr/local/docker/consul/data/cc1:/datadepends_on:- cs2- cs3
主要参数说明参数名解释-server设置为 Server 类型节点不加则为 Client 类型节点-client注册或者查询等一系列客户端对它操作的IP默认是127.0.0.1-bootstrap-expect集群期望的 Server 节点数只有达到这个值才会选举 Leader-node指定节点名称-data-dir数据存放位置-retry-join指定要加入的节点地址组建集群-ui启用 UI 界面集群状态e002ca62ac24 为容器名称可通过 docker ps | grep consul 查看选择任意一个即可查看节点状态和类型docker exec -t e002ca62ac24 consul members
当前为3 个 Server 类型节点 1 个 Client 类型节点。查看 Server 节点类型docker exec -t e002ca62ac24 consul operator raft list-peers
当前为 cs1 为 leader可以测试将 cs1 stop 观察 leader 的重新选举。通过 http://192.168.124.9:8500 UI 界面查看 Consul 节点状态如下(192.168.124.9 是 consul 容器外部访问 IP).NET Core 接入 Consul创建 .NET Core WebAPI3.1 服务 ServiceA2个实例 和 ServiceBNuGet 安装 Consul注册到 Consul 的核心代码如下源码下载[2]public static class ConsulBuilderExtensions
{public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IHostApplicationLifetime lifetime, ConsulOption consulOption){var consulClient new ConsulClient(x {x.Address new Uri(consulOption.Address);});var registration new AgentServiceRegistration(){ID Guid.NewGuid().ToString(),Name consulOption.ServiceName,// 服务名Address consulOption.ServiceIP, // 服务绑定IPPort consulOption.ServicePort, // 服务绑定端口Check new AgentServiceCheck(){DeregisterCriticalServiceAfter TimeSpan.FromSeconds(5),//服务启动多久后注册Interval TimeSpan.FromSeconds(10),//健康检查时间间隔HTTP consulOption.ServiceHealthCheck,//健康检查地址Timeout TimeSpan.FromSeconds(5)}};// 服务注册consulClient.Agent.ServiceRegister(registration).Wait();// 应用程序终止时服务取消注册lifetime.ApplicationStopping.Register(() {consulClient.Agent.ServiceDeregister(registration.ID).Wait();});return app;}
}
添加配置如下Consul: {ServiceName: service-a,ServiceIP: 192.168.124.11, // 当前服务访问 IPServicePort: 8000,ServiceHealthCheck: http://192.168.124.11:8000/healthCheck,Address: http://192.168.124.9:8500
}
注册成功结果如下ServiceB 调用 ServiceA 接口ServiceB 通过 ConsulClient 进行服务发现获取到 ServiceA 的地址然后随机请求请求任意一个实例关键代码如下using (var consulClient new ConsulClient(a a.Address new Uri(_consulOption.Address)))
{var services consulClient.Catalog.Service(service-a).Result.Response;if (services ! null services.Any()){// 模拟随机一台进行请求这里只是测试可以选择合适的负载均衡框架var service services.ElementAt(new Random().Next(services.Count()));var client _httpClientFactory.CreateClient();var response await client.GetAsync($http://{service.ServiceAddress}:{service.ServicePort}/test/get);var result await response.Content.ReadAsStringAsync();return result;}
}
多次调用结果如下参考资料[1]Consul: https://www.consul.io/[2]源码下载: https://github.com/beckjin/ConsulDotnetSamples