上篇文章我們講到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