r m*_*r m 4 c# consul microservices asp.net-core
我正在尝试在启动时将我的ASP.NET核心应用程序自行注册到Consul注册表,并在关闭时注销它.
从这里我可以收集调用http api [ put /v1/agent/service/register]可能是要走的路(或者可能不是!).
从我的应用程序中,我认为我将定位Startup该类,从添加我的.json文件开始
public Startup(IHostingEnvironment env)
{
var builder = new Configuration().AddJsonFile("consulconfig.json");
Configuration = builder.Build();
}
Run Code Online (Sandbox Code Playgroud)
但是现在,我被卡住了,因为ConfigureServices方法告诉我这是我向容器添加服务的地方,而Configure方法是我配置Http请求管道的地方.
有人指出我正确的方向,在线阅读,例子等
Ily*_*kov 11
首先,我建议使用Consul.NET 与Consul进行交互.使用它,服务注册可能如下所示:
var registration = new AgentServiceRegistration
{
Name = "foo",
Port = 4242,
Address = "http://bar"
};
using (var client = new ConsulClient())
{
await client.Agent.ServiceRegister(registration);
}
Run Code Online (Sandbox Code Playgroud)
现在让我们在DI和松散耦合的帮助下将此代码集成到ASP.NET Core启动过程中.将您的json文件读入ConsulOptions实例(没有任何逻辑的DTO):
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<ConsulOptions>(Configuration);
}
Run Code Online (Sandbox Code Playgroud)
Incapsulate类所有领事相关逻辑ConsulService接受ConsulOptions作为依赖性:
public class ConsulService : IDisposable
{
public ConsulService(IOptions<ConsulOptions> optAccessor) { }
public void Register()
{
//possible implementation of synchronous API
client.Agent.ServiceRegister(registration).GetAwaiter().GetResult();
}
}
Run Code Online (Sandbox Code Playgroud)
将类本身添加到DI容器:
services.AddTransient<ConsulService>();
Run Code Online (Sandbox Code Playgroud)
然后创建一个extention方法IApplicationBuilder并调用它:
public void Configure(IApplicationBuilder app)
{
app.ConsulRegister();
}
Run Code Online (Sandbox Code Playgroud)
在ConsulRegister实现中,我们在应用程序启动/停止时添加钩子:
public static class ApplicationBuilderExtensions
{
public static ConsulService Service { get; set; }
public static IApplicationBuilder ConsulRegister(this IApplicationBuilder app)
{
//design ConsulService class as long-lived or store ApplicationServices instead
Service = app.ApplicationServices.GetService<ConsulService>();
var life = app.ApplicationServices.GetService<IApplicationLifetime>();
life.ApplicationStarted.Register(OnStarted);
life.ApplicationStopping.Register(OnStopping);
return app;
}
private static void OnStarted()
{
Service.Register(); //finally, register the API in Consul
}
}
Run Code Online (Sandbox Code Playgroud)
锁定缺席和静态字段是正常的,因为Startup类在应用程序启动时执行一次.不要忘记在OnStopping方法中取消注册API !
| 归档时间: |
|
| 查看次数: |
4995 次 |
| 最近记录: |