温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

.NET Core + Consul 服务注册及发现的示例分析

发布时间:2022-01-04 09:11:45 来源:亿速云 阅读:133 作者:柒染 栏目:大数据

这篇文章将为大家详细讲解有关.NET Core + Consul 服务注册及发现的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

在分布式架构中,服务治理是必须面对的问题,如果缺乏简单有效治理方案,各服务之间只能通过人肉配置的方式进行服务关系管理,当遇到服务关系变化时,就会变得极其麻烦且容易出错。

Consul[1] 是一个用来实现分布式系统服务发现与配置的开源工具。它内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等),使用起来也较为简单。

 

Consul 架构

.NET Core + Consul 服务注册及发现的示例分析  

Consul 集群支持多数据中心,在上图中有两个 DataCenter,他们通过 Internet 互联,为了提高通信效率,只有 Server 节点才加入跨数据中心的通信。在单个数据中心中,Consul 分为 Client 和 Server 两种节点(所有的节点也被称为 Agent),Server 节点保存数据,Client 负责健康检查及转发数据请求到 Server,本身不保存注册信息;Server 节点有一个 Leader 和多个 Follower,Leader 节点会将数据同步到 Follower,Server 节点的数量推荐是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: '3'

services:
 cs1:
   image: consul
   command: agent -server -client=0.0.0.0 -bootstrap-expect=3 -node=cs1 -data-dir=/data
   volumes:
     - /usr/local/docker/consul/data/cs1:/data
 cs2:
   image: consul
   command: agent -server -client=0.0.0.0 -retry-join=cs1 -node=cs2 -data-dir=/data
   volumes:
     - /usr/local/docker/consul/data/cs2:/data
   depends_on:
     - cs1
 cs3:
   image: consul
   command: agent -server -client=0.0.0.0 -retry-join=cs1 -node=cs3 -data-dir=/data
   volumes:
     - /usr/local/docker/consul/data/cs3:/data
   depends_on:
     - cs1
 cc1:
   image: consul
   command: agent -client=0.0.0.0 -retry-join=cs1 -ui -node=cc1 -data-dir=/data
   ports:
     - 8500:8500
   volumes:
     - /usr/local/docker/consul/data/cc1:/data
   depends_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
 
.NET Core + Consul 服务注册及发现的示例分析  

当前为 cs1 为 leader,可以测试将 cs1 stop 观察 leader 的重新选举。

通过 http://192.168.124.9:8500 UI 界面查看 Consul 节点状态如下:(192.168.124.9 是 consul 容器外部访问 IP)

 
 

.NET Core 接入 Consul

.NET Core + Consul 服务注册及发现的示例分析  
  1. 创建 .NET Core WebAPI(3.1) 服务 ServiceA(2个实例) 和 ServiceB

  2. NuGet 安装 Consul

  3. 注册到 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, // 服务绑定IP
         Port = 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;
     }
    }
  4. 添加配置如下:

    "Consul": {
     "ServiceName": "service-a",
     "ServiceIP": "192.168.124.11",   // 当前服务访问 IP
     "ServicePort": 8000,
     "ServiceHealthCheck": "http://192.168.124.11:8000/healthCheck",
     "Address": "http://192.168.124.9:8500"
    }
  5. 注册成功结果如下:

    .NET Core + Consul 服务注册及发现的示例分析  
     

关于.NET Core + Consul 服务注册及发现的示例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI