-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathConsulRegistrationExtensions.cs
More file actions
104 lines (93 loc) · 3.97 KB
/
Copy pathConsulRegistrationExtensions.cs
File metadata and controls
104 lines (93 loc) · 3.97 KB
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsulServiceRegistration
{
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Hosting;
using Consul;
namespace ConsulServiceRegistration
{
// Consul服务注册
public static class ConsulRegistrationExtensions
{
public static void AddConsul(this IServiceCollection service, IConfiguration configuration)
{
//读取配置文件
service.Configure<ConsulServiceOptions>(configuration.GetSection(nameof(ConsulServiceOptions)));
}
public static IApplicationBuilder UseConsul(this IApplicationBuilder app)
{
// 获取主机生命周期管理接口
var lifetime = app.ApplicationServices.GetRequiredService<IHostApplicationLifetime>();
// 获取服务配置项
var serviceOptions = app.ApplicationServices.GetRequiredService<IOptions<ConsulServiceOptions>>().Value;
// 健康检查
app.UseHealthChecks(serviceOptions.HealthCheck);
// 服务Id,唯一
serviceOptions.ServiceId ??= Guid.NewGuid().ToString("N");
var consulClient = new ConsulClient(configuration =>
{
// 服务注册的地址,集群中任意一个地址
configuration.Address = new Uri(serviceOptions.ConsulAddress);
});
// 获取当前服务地址和端口,这里自动获取,也可以配置
Uri uri = null;
if (app.Properties.ContainsKey("server.Features"))
{
var features = app.Properties["server.Features"] as FeatureCollection;
var address = features.Get<IServerAddressesFeature>().Addresses?.FirstOrDefault();
if (address == null)
{
// 方便使用命令启用多个服务
uri = new Uri(serviceOptions.BaseUrl);
}
else
{
uri = new Uri(address);
}
}
else
{
uri = new Uri(serviceOptions.BaseUrl);
}
// 节点服务注册对象
var registration = new AgentServiceRegistration()
{
ID = serviceOptions.ServiceId,
Name = serviceOptions.ServiceName,
Address = uri.Host,
Port = uri.Port,
Check = new AgentServiceCheck
{
// 超时时间
Timeout = TimeSpan.FromSeconds(5),
// 服务停止多久后注销服务
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
// 健康检查地址
HTTP = $"{uri.Scheme}://{uri.Host}:{uri.Port}{serviceOptions.HealthCheck}",
// 检查健康时间间隔
Interval = TimeSpan.FromSeconds(10)
}
};
// 注册服务
consulClient.Agent.ServiceRegister(registration).Wait();
// 应用程序终止时,注销服务
lifetime.ApplicationStopping.Register(() =>
{
consulClient.Agent.ServiceDeregister(serviceOptions.ServiceId).Wait();
});
return app;
}
}
}
}