Example #1
0
        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);
        }
Example #2
0
        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());
            }
        }