上篇文章我们讲到Ocelot实现Api网关,这篇文章我们一起来实现Ocelot与Consul结合实现服务治理;
一般我的习惯喜欢将所有的Nuget引用放在一个Core基类中,避免版本不一致的情况发生;
创建ServiceCore类库,引用Nuget
Nuget > Install-Package Consul -Version 0.7.2.6
1、创建扩展类实现Consul注册
using Consul;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using System;
namespace ServiceCore.Consul
{
public static class AppBuilderExtensions
{
public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IApplicationLifetime lifetime, ServiceEntity serviceEntity)
{
//请求注册的 Consul 地址
var consulClint = new ConsulClient(c => c.Address = new Uri($"http://{serviceEntity.ConsulIP}:{serviceEntity.ConsulPort}"));
var httpCheck = new AgentServiceCheck()
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册
Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔
HTTP = $"http://{serviceEntity.IP}:{serviceEntity.Port}/api/health",//健康检查地址
Timeout = TimeSpan.FromSeconds(5)
};
var registration = new AgentServiceRegistration()
{
Checks = new[] { httpCheck },
ID = Guid.NewGuid().ToString(),
Name = serviceEntity.ServiceName,
Address = serviceEntity.IP,
Port = serviceEntity.Port,
Tags = new[] { $"urlperfix-/{serviceEntity.ServiceName}" }//添加 urlprefix-/servicename 格式的 tag 标签,以便 Fabio 识别
};
//服务启动时注册,内部实现其实就是使用 Consul API 进行注册(HttpClient发起)
consulClint.Agent.ServiceRegister(registration).Wait();
lifetime.ApplicationStopping.Register(() =>
{
//服务停止时取消注册
consulClint.Agent.ServiceDeregister(registration.ID).Wait();
});
return app;
}
}
}
并创建ServiceEntity实体
2、修改appsetting.json文件
- Consul :IP地址及端口号
- Service :服务名称、IP地址及端口号
3、修改Startup文件
app.UseOcelot().Wait(),基于上篇文章内容;并创建服务健康检查地址,默认启动地址修改为health
最后我们启动Consul服务及项目
可以看到项目正常跑起来,我们看一下Consul可视化页面,输入http://localhost:8500