public static IServiceCollection AddApskServiceDiscoveryClient(this IServiceCollection services, IConfiguration config) { var serviceDiscovery = new ServiceDiscoverySetting(); config.GetSection(nameof(ServiceDiscoverySetting)).Bind(serviceDiscovery); // dnsQuery. var dnsQuery = new LookupClient(IPAddress.Parse(serviceDiscovery.DnsEndpoint.Address), serviceDiscovery.DnsEndpoint.Port); services.AddSingleton <IDnsQuery>(sp => dnsQuery); // http context accessor. services.AddHttpContextAccessor(); // resilience http client. services.AddSingleton <IDiscoveryClient, DiscoveryClient>(); return(services); }
public static void UseApskServiceRegistration(this IApplicationBuilder app, IConfiguration config, IHostApplicationLifetime applicationLifetime) { var serviceDiscovery = new ServiceDiscoverySetting(); config.GetSection(nameof(ServiceDiscoverySetting)).Bind(serviceDiscovery); var serviceName = Assembly.GetEntryAssembly().GetName().Name.Replace(".", string.Empty); var features = app.Properties["server.Features"] as FeatureCollection; var addresses = features.Get <IServerAddressesFeature>() .Addresses .Select(p => new Uri(p)); var consul = new ConsulClient(config => { config.Datacenter = "dc1"; config.Address = new Uri(serviceDiscovery.HttpEndpoint); }); foreach (var address in addresses) { var serviceId = $"{serviceName}_{address.Host}:{address.Port}"; var registration = new AgentServiceRegistration() { Address = address.Host, Port = address.Port, Check = new AgentServiceCheck() { HTTP = $"{address.OriginalString}/healthCheck", Interval = TimeSpan.FromSeconds(30), DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5) }, ID = serviceId, Name = serviceName }; applicationLifetime.ApplicationStarted.Register(() => consul.Agent.ServiceRegister(registration).Wait()); applicationLifetime.ApplicationStopping.Register(() => consul.Agent.ServiceDeregister(registration.ID).Wait()); } }