2016-09-13 6 views
4

Ich versuche self registrieren meine ASP.NET Core-Anwendung in Consul Registrierung beim Start und Registrierung beim Herunterfahren.So registrieren Sie einen Dienst mit Consul

Von here Ich kann feststellen, dass das Anrufen der http-API [put /v1/agent/service/register] möglicherweise der Weg zu gehen (oder vielleicht nicht!).

Aus meiner app, dachte ich, ich werde die Startup Klasse Ziel, mit der meine .json Hinzufügen Datei zu

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

Aber jetzt, ich bin fest wie ConfigureServices Methode sagt mir, das ist, wo ich hinzufügen Dienste starten der Container, und Configure Methode ist, wo ich die HTTP-Anfrage-Pipeline konfigurieren.

Wer mich in der richtigen Richtung zu zeigen, Online-Lesungen, Beispiele usw.

Antwort

5

Vor allem empfehle ich mit Consul zu verwenden Consul.NET zu interagieren. Mit ihm kann eine Service-Registrierung wie folgt aussehen:

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

await client.Agent.ServiceRegister(registration); 

Nun wollen wir diesen Code integrieren in ASP.NET Core-Startprozess mit Hilfe von DI und lose Kopplung. Lesen Sie Ihre JSON-Datei in ConsulOptions Instanz (DTO ohne Logik):

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

Incapsulate alle Consul bezogene Logik in der Klasse ConsulServiceConsulOptions als Abhängigkeit akzeptieren:

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

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

Fügen Sie die Klasse selbst zu DI-Container:

services.AddTransient<ConsulService>(); 

Dann eine Erweiterung Methode von IApplicationBuilder erstellen und rufen:

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

In ConsulRegister Implementierung fügen wir unsere Haken auf Anfrage Start/Stopp:

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

Sperren Abwesenheit und statische Felder sind in Ordnung, weil die Startup Klasse ausgeführt wird, wenn beim Start der Anwendung. Vergessen Sie nicht, die API in OnStopping Methode abzumelden!

+0

wird OnStarted einmal oder bei jeder Anfrage aufgerufen? Ich habe kein volles Verständnis von 'Configure' Methode und' Middlewares' –

+0

würde auch nicht 'ConsulService.Register'' async Task Register' sein, wie ich 'client.Agent.ServiceRegister (Registrierung) erwarten' '? –

+0

@rm, 'OnStarted' wird einmal aufgerufen. Ja, 'ServiceRegister' ist standardmäßig async, Sie können es leicht mit' .GetAwaiter(). GetResult() 'synchronisieren. –

Verwandte Themen