sunpengfei
2025-08-08 c8b6903d85e7ceef504a198b4bdfc6b72a73fe19
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using Consul;
using FlexJobApi.Core;
using Furion;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
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.FlexJobServer.Test
{
    public class Startup : AppStartup
    {
        public void ConfigureServices(IServiceCollection services, IConfiguration config)
        {
            services.AddSingleton<IConsulClient, ConsulClient>(p => new ConsulClient(options =>
            {
                var address = config["Consul:Address"] ?? "http://localhost:8500";
                options.Address = new Uri(address);
            }));
            services.AddComponent<DistributedCacheServiceComponent>();
            services.AddHttpRemote();
            services.AddSingleton<ResourceHttpUtils>();
        }
 
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IConfiguration config)
        {
            var consulClient = app.ApplicationServices.GetRequiredService<IConsulClient>();
            var lifetime = app.ApplicationServices.GetRequiredService<IHostApplicationLifetime>();
 
            // 服务配置(从appsettings.json读取)
            var serviceName = config["Consul:ServiceName"] ?? "UnknownService";
            var serviceHost = config["Consul:ServiceIP"] ?? "localhost";
            var servicePort = int.Parse(config["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}{config["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();
            });
        }
    }
}