如何使用Consul自行注册服务
我正在尝试在启动时将我的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(); }
但现在,我陷入困境,因为ConfigureServices
方法告诉我在哪里向容器添加服务,而Configure
方法是我配置Http请求管道的地方。
有人指出我正确的方向,在线阅读,例子等
首先,我建议使用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(Configuration); }
在ConsulService
类中ConsulService
所有与Consul相关的逻辑,接受ConsulOptions
作为依赖:
public class ConsulService : IDisposable { public ConsulService(IOptions optAccessor) { } public void Register() { //possible implementation of synchronous API client.Agent.ServiceRegister(registration).GetAwaiter().GetResult(); } }
将类本身添加到DI容器:
services.AddTransient();
然后创建一个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(); var life = app.ApplicationServices.GetService(); life.ApplicationStarted.Register(OnStarted); life.ApplicationStopping.Register(OnStopping); return app; } private static void OnStarted() { Service.Register(); //finally, register the API in Consul } }
锁定缺席和静态字段是正常的,因为在应用程序启动时执行一次Startup
类。 不要忘记在OnStopping
方法中OnStopping
注册API!
- 如何在vNext Web应用程序中进行服务器端状态管理
- 用于Windows x64的ASP.NET核心应用程序(.NET Framework)仅在project.assets.json中出错
- 如何在找不到DLL时调试dotnet.exe?
- Asp网核rc2。 抽象类模型绑定
- 无法访问IIS 8上虚拟dotnet核心api应用程序下的虚拟目录
- 如何在asp.net Core中使用JWT
- 尝试激活’AuthController’时无法解析类型’Microsoft.AspNetCore.Identity.UserManager`的服务
- 路由不适用于自托管的Web API
- ASP.NET 5中的Web API身份validation