2020-07-08
2699 11首先安装Consul,可以到Consul官网下载安装,这里以Windows环境安装为例。
Consul官网地址:https://www.consul.io/
下载压缩包解压后只有一个exe文件,我们用命令行在目录下执行命令启动开发环境
consul agent -dev(如果需要其他机器访问,命令为consul agent -dev -client 0.0.0.0 -ui)
如上所示就启动了,可以看到Client Addr是127.0.0.1:8500,可以从浏览器直接打开这个监控页面地址了。
刚开始只有一个consul服务。
下面我们我们开始在.NET Core项目中注册服务。
一般大型项目会有很多微服务,每个微服务都需要用到注册,所以我们单独创建一个类库,写一个通用的注册服务的扩展方法。
需要安装Consul等包,可以通过Nuget安装,依赖包如图所示
创建一个名为ConsulServiceRegistration的类库,里面包含两个类,代码如下:
ConsulRegistrationExtenSions.cs类代码
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Hosting;
using Consul;
namespace ConsulServiceRegistration
{
// Consul服务注册
public static class ConsulRegistrationExtensions
{
public static void AddConsul(this IServiceCollection service) {
//读取配置文件
var config = new ConfigurationBuilder().AddJsonFile("service.config.json").Build();
service.Configure<ConsulServiceOptions>(config);
}
public static IApplicationBuilder UseConsul(this IApplicationBuilder app) {
// 获取主机生命周期管理接口
var lifetime = app.ApplicationServices.GetRequiredService<IHostApplicationLifetime>();
// 获取服务配置项
var serviceOptions = app.ApplicationServices.GetRequiredService<IOptions<ConsulServiceOptions>>().Value;
// 服务Id,唯一
serviceOptions.ServiceId = Guid.NewGuid().ToString();
var consulClient = new Consul.ConsulClient(configuration =>
{
// 服务注册的地址,集群中任意一个地址
configuration.Address = new Uri(serviceOptions.ConsulAddress);
});
// 获取当前服务地址和端口,这里自动获取,也可以配置
var features = app.Properties["server.Features"] as FeatureCollection;
var address = features.Get<IServerAddressesFeature>().Addresses.First();
var uri = new Uri(address);
// 节点服务注册对象
var registration = new AgentServiceRegistration() {
ID = serviceOptions.ServiceId,
Name = serviceOptions.ServiceName,
Address = uri.Host,
Port = uri.Port,
Check = new AgentServiceCheck {
// 超时时间
Timeout = TimeSpan.FromSeconds(5),
// 服务停止多久后注销服务
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
// 健康检查地址
HTTP = $"{uri.Scheme}://{uri.Host}:{uri.Port}{serviceOptions.HealthCheck}",
// 检查健康时间间隔
Interval = TimeSpan.FromSeconds(10)
}
};
// 注册服务
consulClient.Agent.ServiceRegister(registration).Wait();
// 应用程序终止时,注销服务
lifetime.ApplicationStopping.Register(()=>{
consulClient.Agent.ServiceDeregister(serviceOptions.ServiceId).Wait();
});
return app;
}
}
}
ConsulServiceOptions.cs类代码
namespace ConsulServiceRegistration
{
public class ConsulServiceOptions
{
// 服务注册地址(Consul的地址)
public string ConsulAddress { get; set; }
// 服务Id
public string ServiceId { get; set; }
// 服务名称
public string ServiceName { get; set; }
// 健康检查地址
public string HealthCheck { get; set; }
}
}
然后再ASP.Net Core项目中引用这个类库。然后在Startup.cs里添加两个服务
public void ConfigureServices(IServiceCollection services){
// 健康检查中间件,.NET Core内置
services.AddHealthChecks();
services.AddConsul();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,IOptions<SettingModel> appOptions,IOptions<ConsulServiceOptions> serviceOptions){
// 传入健康检测地址
app.UseHealthChecks(serviceOptions.Value.HealthCheck);
app.UseConsul();
}
接下来我们需要添加一个配置文件,如代码中所写,在ASP.Net Core项目中创建一个名为service.config.json的配置文件,内容如下
{
"ConsulAddress": "http://127.0.0.1:8500",
"ServiceName": "AspNetCore",
"HealthCheck": "/Health"
}
这样编码算全部完成了,我们可以测试看看。
我通过命令行启动3个AspNetCore应用,端口分别是1234,1235,1236。
然后我们看看Consul的监控界面看
.NET Core Consul服务注册完成了。最后我们看一下.NET Core内置的健康检测页面是什么内容
访问localhost:1234/Health直接输出了Healthy