如何使用Consul自行注册服务

问题描述 投票:4回答:1

我正在尝试self在启动时将我的ASP.NET核心应用程序注册到Consul注册表并在关闭时注销它。

here我可以收集调用http api [put /v1/agent/service/register]可能是要走的路(或者可能不是!)。

从我的应用程序,我以为我将针对Startup类,从添加我的.json文件开始

public Startup(IHostingEnvironment env)
{
   var builder = new Configuration().AddJsonFile("consulconfig.json");
   Configuration = builder.Build();
}

但是现在,我被卡住了,因为ConfigureServices方法告诉我那里我向容器添加服务,而Configure方法是我配置Http请求管道的地方。

有人指出我正确的方向,在线阅读,例子等

c# asp.net-core microservices consul
1个回答
9
投票

首先,我建议使用Consul.NET与Consul互动。使用它,服务注册可能如下所示:

var registration = new AgentServiceRegistration
{
    Name = "foo",
    Port = 4242,
    Address = "http://bar"
};

using (var client = new ConsulClient())
{
    await client.Agent.ServiceRegister(registration);
}

现在让我们在DI和松散耦合的帮助下将此代码集成到ASP.NET Core启动过程中。将您的json文件读入ConsulOptions实例(没有任何逻辑的DTO):

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();
    services.Configure<ConsulOptions>(Configuration);
}

在类ConsulService中包含所有与Consul相关的逻辑,接受ConsulOptions作为依赖:

public class ConsulService : IDisposable
{
    public ConsulService(IOptions<ConsulOptions> optAccessor) { }

    public void Register() 
    {
        //possible implementation of synchronous API
        client.Agent.ServiceRegister(registration).GetAwaiter().GetResult();
    }
}

将类本身添加到DI容器:

services.AddTransient<ConsulService>();

然后创建IApplicationBuilder的扩展方法并将其命名为:

public void Configure(IApplicationBuilder app)
{
    app.ConsulRegister();
}

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
    }
}

锁定缺席和静态字段是正常的,因为Startup类在应用程序启动时执行一次。不要忘记在OnStopping方法中取消注册API!

© www.soinside.com 2019 - 2024. All rights reserved.