Dotnet Consul 服务发现
在分布式架构中,服务治理是必须面对的问题,如果缺乏简单有效治理方案,各服务之间只能通过人肉配置的方式进行服务关系管理,当遇到服务关系变化时,就会变得极其麻烦且容易出错,Consul 是一个用来实现分布式系统服务发现与配置的开源工具。它内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等),使用起来也较为简单。
Consul 架构
Consul 集群支持多数据中心,在上图中有两个 DataCenter,他们通过 Internet 互联,为了提高通信效率,只有 Server 节点才加入跨数据中心的通信。在单个数据中心中,Consul 分为 Client 和 Server 两种节点(所有的节点也被称为 Agent),Server 节点保存数据,Client 负责健康检查及转发数据请求到 Server,本身不保存注册信息;Server 节点有一个 Leader 和多个 Follower,Leader 节点会将数据同步到 Follower,Server 节点的数量推荐是 3 个或者 5 个,在 Leader 挂掉的时候会启动选举机制产生一个新 Leader,接下来我们用 Dotnet 加上 Docker 搭建一个我们自己的服务治理。
Consul 集群搭建
1.首先把 Consul 官方镜像拉取下来:
docker pull consul
2.启动一个 Client 节点:
1 | docker run --name cc1 -p 5500:8500 -v /data/cc1:/data consul agent -bind 172.17.0.5 -node consul-client-1 -data-dir /data -client 0.0.0.0 -ui -join 172.17.0.2 |
3.这里我们搭建三个 service 节点,一个 Leader,两个 Slave。
启动 Leader:
1 | docker run --name cs1 -p 8500:8500 -v /data/cs1:/data consul agent -server -bind 172.17.0.2 -node consul-server-1 -data-dir /data -bootstrap-expect 3 -client 0.0.0.0 -ui |
启动 Slave 1:
1 | docker run --name cs2 -p 7500:8500 -v /data/cs2:/data consul agent -server -bind 172.17.0.3 -node consul-server-2 -data-dir /data -bootstrap-expect 3 -client 0.0.0.0 -ui -join 172.17.0.2 |
启动 Slave 2:
1 | docker run --name cs3 -p 6500:8500 -v /data/cs3:/data consul agent -server -bind 172.17.0.4 -node consul-server-3 -data-dir /data -bootstrap-expect 3 -client 0.0.0.0 -ui -join 172.17.0.2 |
参数说明:
参数名 | 解释 |
---|---|
–name | Docker 容器名称(每个 Consul 节点一个容器) |
-p | 容器内部 8500 端口映射到当前主机端口,因为使用的同一台主机,所以这里每个容器内的 8500 端口映射到当前主机的不同端口 |
-v | 将节点相关注册数据挂载到当前主机的指定位置,否则重启后会丢失,Docker 设置里头给 Sharing 权限 |
-server | 设置为 Server 类型节点,不加则为 Client 类型节点 |
-bind | 指定节点绑定的地址 |
-node | 指定节点名称 |
-data-dir | 数据存放位置 |
-bootstrap-expect | 集群期望的 Server 节点数,只有达到这个值才会选举 Leader |
-client | 注册或者查询等一系列客户端对它操作的 IP,默认是 127.0.0.1 |
-ui | 启用 UI 界面 |
-join | 指定要加入的节点地址(组建集群) |
集群组建完成了,我们可以查看 consul 集群的状态。
1.查看节点类型以及状态
docker exec -t cs1 consul members
2.查看 Server 节点类型
docker exec -t cs1 consul operator raft list-peers
.NET Core 集成 Consul
1.创建一个 WebAPI 程序,我这里命名为 ServiceA
2.Nuget 安装 Consul 包
3.注册 A 节点
1 | public static class ConsulBuilderExtensions |
添加刚刚的节点
1 | "ServiceName": "ServiceA", |
4.注册 B 节点,并且调用 A 节点
1 | var url = _configuration["ConsulAddress"].ToString(); |