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