public static IApplicationBuilder StartRegister(this IApplicationBuilder app) { var options = app.ApplicationServices.GetRequiredService <IOptions <ConsulOptions> >(); var consulOptions = options?.Value; if (consulOptions == null) { throw new ArgumentNullException(nameof(consulOptions)); } // 请求注册的 Consul 地址 var consulClient = ConsulClientFactory.CreateClient(consulOptions.ConsulAddress, consulOptions.Datacenter); var registration = CreateRegistration(consulOptions); var serviceRegistry = app.ApplicationServices.GetRequiredService <IServiceRegistry>(); if (serviceRegistry != null) { serviceRegistry.ServiceRegister(registration).Wait(); } // 获取主机生命周期管理接口 var lifetime = app.ApplicationServices.GetRequiredService <IHostApplicationLifetime>(); lifetime.ApplicationStopping.Register(() => { consulClient.Agent.ServiceDeregister(registration.ID).Wait(); // 服务停止时取消注册 }); return(app); }
public static void ApplyServices(this IServiceCollection services, IConfiguration configuration) { bool enableRegister = configuration.GetValue <bool>(ApiCommon.Appsetting.EnableRegister); bool enableDiscover = configuration.GetValue <bool>(ApiCommon.Appsetting.EnableDiscover); if (!enableRegister && !enableDiscover) { return; } services.Configure <ConsulOptions>(configuration.GetSection(ApiCommon.Appsetting.ConsulSection)); services.TryAddSingleton(q => { var options = q.GetRequiredService <IOptions <ConsulOptions> >(); int ttl = options?.Value.CacheTTL ?? 30; return(new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(ttl) }); }); services.AddSingleton(q => { var options = q.GetRequiredService <IOptions <ConsulOptions> >(); return(ConsulClientFactory.CreateClient(options?.Value.ConsulAddress, options?.Value.Datacenter)); }); if (enableRegister) { services.AddSingleton <IServiceRegistry, ConsulServiceRegistry>(); services.AddHealthChecks(); } if (enableDiscover) { services.AddSingleton <IDiscoveryClient, ConsulDiscoveryClient>(); services.AddSingleton <ILoadBalancer, RandomLoadBalancer>(); services.AddDistributedMemoryCache(); } }