using Consul;
|
using Furion;
|
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.Hosting;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace FlexJobApi.Core
|
{
|
public class ConsulApplicationComponent : IApplicationComponent
|
{
|
public void Load(IApplicationBuilder app, IWebHostEnvironment env, ComponentContext componentContext)
|
{
|
var consulClient = app.ApplicationServices.GetRequiredService<IConsulClient>();
|
var lifetime = app.ApplicationServices.GetRequiredService<IHostApplicationLifetime>();
|
|
// 服务配置(从appsettings.json读取)
|
var serviceName = App.Configuration["Consul:ServiceName"] ?? "UnknownService";
|
var serviceHost = App.Configuration["Consul:ServiceIP"] ?? "localhost";
|
var servicePort = int.Parse(App.Configuration["Consul:ServicePort"]); // 或直接用启动端口
|
|
// 服务唯一ID(避免同一服务多实例冲突)
|
var serviceId = $"{serviceName}-{serviceHost}-{servicePort}";
|
|
// 服务注册信息
|
var registration = new AgentServiceRegistration
|
{
|
ID = serviceId,
|
Name = serviceName,
|
Address = serviceHost,
|
Port = servicePort,
|
// 健康检查配置
|
Check = new AgentServiceCheck
|
{
|
HTTP = $"http://{serviceHost}:{servicePort}{App.Configuration["Consul:ServiceHealthCheck"]}",
|
Interval = TimeSpan.FromSeconds(10),
|
Timeout = TimeSpan.FromSeconds(5),
|
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(30)
|
}
|
};
|
|
// 注册服务
|
consulClient.Agent.ServiceRegister(registration).Wait();
|
|
// 应用停止时注销服务
|
lifetime.ApplicationStopping.Register(() =>
|
{
|
consulClient.Agent.ServiceDeregister(serviceId).Wait();
|
});
|
}
|
}
|
}
|