sunpengfei
2025-08-08 61aad62d817ddb6494f52a531fccb7e82bcfd13c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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();
            });
        }
    }
}