.netcore consul实现服务注册与发现-单节点部署

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.netcore consul实现服务注册与发现-单节点部署相关的知识,希望对你有一定的参考价值。

一、Consul的基础介绍


    Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Consul的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等),使用起来也较 为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。

关于Consul的更多介绍,比如优点,这里就不再赘述了,上网一搜就可以随处找到了。但是,必须贴一个和其他类似软件的对比:

二、Consul安装前的理解


    Consul Agent有两种运行模式:ServerClient。这里的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正式安装(单节点)


1、下载Consul

.netcore consul实现服务注册与发现-单节点部署

确认好版本好,下载到我们的本机目录命令:   

> wget -P /opt/consul/ https://releases.hashicorp.com/consul/1.2.2/consul_1.2.2_linux_amd64.zip

2、安装Consul

#先解压Consul文件

> unzip consul_1.2.2_linux_amd64.zip

#将Consul文件拷贝到执行目录

> mv consul /usr/local/bin/

#注:如果找不到unzip命令请安装,命令如:

> yum install -y unzip

3、测试Consul是否安装成功

> consul

如下图表示成功:

.netcore consul实现服务注册与发现-单节点部署

4、启动与配置Consul服务

consul agent -server -ui -bootstrap-expect=1 -data-dir=/tmp/consul -node=consul-1 -client=0.0.0.0 -bind=172.16.1.174 -datacenter=dc1

如下图表示启动成功:

.netcore consul实现服务注册与发现-单节点部署

.netcore consul实现服务注册与发现-单节点部署

进一步查看server的情况与角色状态

查看各个server的情况

> consul members

查看目前全部的consul的角色状态:

> consul operator raft list-peers

.netcore consul实现服务注册与发现-单节点部署

5、通过配置文件来注册服务(也可以从consul api 接口添加服务注册,他会自动持久化

vi /etc/consul/services_config.json{ "services":[ { "id": "CLIENT_SERVICE_01", "name" : "MVCClientService", "tags": [ "urlprefix-/MVCClientService01" ], "address": "172.16.1.110", "port": 5000, "checks": [ { "name": "clientservice_check", "http": "http://172.16.1.110:5000", "interval": "10s", "timeout": "5s" } ] }, { "id": "CLIENT_SERVICE_02", "name" : "APIClientService", "tags": [ "urlprefix-/APIClientService02" ], "address": "172.16.1.110", "port": 5000, "checks": [ { "name": "clientservice_check", "http": "http://172.16.1.110:5001/api/values", "interval": "10s", "timeout": "5s" } ] } ]}


重新运行命令:

consul agent -server -ui -bootstrap-expect=1 -config-dir=/etc/consul -data-dir=/tmp/consul -node=consul-1 -client=0.0.0.0 -bind=172.16.1.174 -datacenter=dc1

注:一定要保证后端服务正常运行:端口5000,5001

运行成功后,如下图:

.netcore consul实现服务注册与发现-单节点部署

以上操作都是在Consul Server 端进行操作的,按官方说明:Consul Server与Consul Client要进行区分,后端的服务应该部署在Consul Client上,他们分别处理自己的事情就好。

6、通过consul api 接口注册服务

  • 创建一个ASP.NET Core WebAPI程序

            .netcore consul实现服务注册与发现-单节点部署

  • 创建一个HealthController用于Consul的健康检查    

[Produces("application/json")][Route("api/Health")]public class HealthController : Controller{[HttpGet]public IActionResult Get() => Ok("ok");}

注:Consul会通过call这个API来确认Service的健康状态。

  • 基于IApplicationBuilder写一个扩展方法,用于调用Consul API

  • 在nuge管理器中引入Consul包

public static class ConsulBuilderExtensions { // 服务注册 public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IApplicationLifetime lifetime, HealthService healthService, ConsulService consulService) { var consulClient = new ConsulClient(x => x.Address = new Uri($"http://{consulService.IP}:{consulService.Port}"));//请求注册的 Consul 地址 var httpCheck = new AgentServiceCheck() { DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册 Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔 HTTP = $"http://{healthService.IP}:{healthService.Port}/api/health",//健康检查地址 Timeout = TimeSpan.FromSeconds(5) }; // Register service with consul var registration = new AgentServiceRegistration() { Checks = new[] { httpCheck }, ID = healthService.Name + "_" + healthService.Port, Name = healthService.Name, Address = healthService.IP, Port = healthService.Port, Tags = new[] { $"urlprefix-/{healthService.Name}" }//添加 urlprefix-/servicename 格式的 tag 标签,以便 Fabio 识别 }; consulClient.Agent.ServiceRegister(registration).Wait();//服务启动时注册,内部实现其实就是使用 Consul API 进行注册(HttpClient发起) lifetime.ApplicationStopping.Register(() => { consulClient.Agent.ServiceDeregister(registration.ID).Wait();//服务停止时取消注册 }); return app; } }
  • 在Starup类的Configure方法中,调用此扩展方法

#region register this service ConsulService consulService = new ConsulService() { IP = Configuration["Consul:IP"], Port = Convert.ToInt32(Configuration["Consul:Port"]) }; HealthService healthService = new HealthService() { IP = Configuration["Service:IP"], Port = Convert.ToInt32(Configuration["Service:Port"]), Name = Configuration["Service:Name"], }; app.RegisterConsul(lifetime, healthService, consulService); #endregion
  • 其中用到了appSettings.json配置文件,其定义如下:

 "Service": { "Name": "DMSWebAPITest", "IP": "localhost", "Port": "5001" }, "Consul": { "IP": "localhost", "Port": "8500" }
  • 其中ConsulService类定义如下:

 public class ConsulService { public string IP { get; set; } public int Port { get; set; } }
  • 其中HealthService类定义如下:

 public class HealthService { public string Name { get; set; } public string IP { get; set; } public int Port { get; set; }  }
  • 确保HealthController的API能正常访问,以便做健康检查

  • 成功运行后,查看Consul集群的状态,UI界面

以上实现了通过配置文件注册,API接口注册到Consul实例,后续加入Ocelot构建API网关,到时会结合Consul进行进一步的集成,另外,还会尝试Polly进行熔断降级。

实战中参考的资料:https://www.cnblogs.com/edisonchou/p/9124985.html


下一篇文章已更新:.netcore consul实现服务注册与发现-集群


以上是关于.netcore consul实现服务注册与发现-单节点部署的主要内容,如果未能解决你的问题,请参考以下文章

.NETCore微服务之:基于Consul实现服务治理

.NET Core HttpClient+Consul实现服务发现

Consul实现服务治理

温故知新,.Net Core遇见Consul(HashiCorp),实践分布式服务注册与发现

.net core grpc consul 实现服务注册 服务发现 负载均衡

一个故事,一段代码告诉你如何使用不同语言(Golang&C#)提供相同的能力基于Consul做服务注册与发现