예제 #1
0
        public static IApplicationBuilder UseSvcDiscovery(
            this IApplicationBuilder app,
            IConfigurationRoot configuration,
            string svcDiscoveryName)
        {
            if (svcDiscoveryName.ToLower() == "nacos")
            {
                app.UseNacosAspNetCore();
            }

            if (svcDiscoveryName.ToLower() == "consul")
            {
                Uri endPoint = new Uri(configuration["App:ServerRootAddress"]);

                ServiceEntity se = new ServiceEntity()
                {
                    ServiceIP     = endPoint.Host,
                    ServicePort   = endPoint.Port,
                    ServiceName   = configuration["SvcDisco:ServiceName"],
                    DiscoveryIP   = configuration["SvcDisco:DiscoveryIp"],
                    DiscoveryPort = Int32.Parse(configuration["SvcDisco:DiscoveryPort"]),
                    TimeOut       = Int32.Parse(configuration["SvcDisco:TimeOut"]),
                    Interval      = Int32.Parse(configuration["SvcDisco:Interval"])
                };

                app.RegisterConsul(se);
            }

            return(app);
        }
예제 #2
0
        public static IApplicationBuilder RegisterConsul(
            this IApplicationBuilder app,
            ServiceEntity serviceEntity)
        {
            IHostApplicationLifetime lifetime =
                app.ApplicationServices.GetService(typeof(IHostApplicationLifetime)) as IHostApplicationLifetime;

            var consulClient = new ConsulClient(x =>
                                                x.Address = new Uri($@"http://{serviceEntity.DiscoveryIP}:{serviceEntity.DiscoveryPort}"));

            var httpCheck = new AgentServiceCheck()
            {
                DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(serviceEntity.TimeOut),
                Interval = TimeSpan.FromSeconds(serviceEntity.Interval),
                HTTP     = $"http://{serviceEntity.ServiceIP}:{serviceEntity.ServicePort}/api/health",
                Timeout  = TimeSpan.FromSeconds(serviceEntity.TimeOut)
            };

            // Register service with consul
            var registration = new AgentServiceRegistration()
            {
                Checks  = new[] { httpCheck },
                ID      = Guid.NewGuid().ToString(),
                Name    = serviceEntity.ServiceName,
                Address = serviceEntity.ServiceIP,
                Port    = serviceEntity.ServicePort,
                Tags    = new[] { $"urlprefix-/{serviceEntity.ServiceName}" }
            };

            consulClient.Agent.ServiceRegister(registration).Wait();
            lifetime.ApplicationStopping.Register(() =>
            {
                consulClient.Agent.ServiceDeregister(registration.ID).Wait();
            });

            return(app);
        }