コード例 #1
0
ファイル: ConsulExtensions.cs プロジェクト: sjdboy/EnigmaNet
        public static IHostBuilder ConfigureConsulKeyValue(this IHostBuilder source)
        {
            return(source.ConfigureAppConfiguration((host, config) =>
            {
                var appName = host.HostingEnvironment.ApplicationName;

                config
                .AddJsonFile("local-appsettings.json", false)
                .AddEnvironmentVariables()
                .AddConsul($"Common/service-appsettings.json", x =>
                {
                    var configuration = config.Build();
                    var consulOptions = new ConsulOptions();
                    configuration.Bind(ConsulOptionsKey, consulOptions);

                    Console.WriteLine("consulOptions.Url:" + consulOptions.Url);

                    if (string.IsNullOrEmpty(consulOptions.Url))
                    {
                        throw new ArgumentNullException(nameof(consulOptions.Url));
                    }

                    x.ConsulConfigurationOptions = o =>
                    {
                        o.Address = new Uri(consulOptions.Url);
                        o.Token = consulOptions.Token;
                    };
                    x.Optional = false;
                    x.ReloadOnChange = true;
                    x.PollWaitTime = TimeSpan.FromSeconds(5);
                })
                .AddConsul($"{appName}/remote-appsettings.json", x =>
                {
                    var configuration = config.Build();
                    var consulOptions = new ConsulOptions();
                    configuration.Bind(ConsulOptionsKey, consulOptions);

                    Console.WriteLine("consulOptions.Url:" + consulOptions.Url);

                    if (string.IsNullOrEmpty(consulOptions.Url))
                    {
                        throw new ArgumentNullException(nameof(consulOptions.Url));
                    }

                    x.ConsulConfigurationOptions = o =>
                    {
                        o.Address = new Uri(consulOptions.Url);
                        o.Token = consulOptions.Token;
                    };
                    x.Optional = false;
                    x.ReloadOnChange = true;
                    x.PollWaitTime = TimeSpan.FromSeconds(5);
                });
            }));
        }
コード例 #2
0
ファイル: ConsulExtensions.cs プロジェクト: sjdboy/EnigmaNet
        public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, ConsulOptions options = null)
        {
            if (options == null)
            {
                var configuration = app.ApplicationServices.GetRequiredService <IConfiguration>();
                options = configuration.GetSection(ConsulOptionsKey).Get <ConsulOptions>();
            }

            if (string.IsNullOrEmpty(options.Url))
            {
                throw new ArgumentNullException(nameof(options.Url));
            }

            var logger = app.ApplicationServices.GetService <ILoggerFactory>().CreateLogger(typeof(ConsulExtensions).FullName);

            var lifetime        = app.ApplicationServices.GetRequiredService <IHostApplicationLifetime>();
            var currentAssembly = Assembly.GetEntryAssembly();
            var serviceName     = currentAssembly.GetName().Name;
            var serviceVersion  = currentAssembly.GetName().Version?.ToString();
            var consulUrl       = options.Url;

            logger.LogInformation($"consulUrl:{consulUrl}");

            var registration = new AgentServiceRegistration()
            {
                ID   = Guid.NewGuid().ToString() + "_" + serviceName + ":" + serviceVersion,
                Name = serviceName,
            };

            lifetime.ApplicationStarted.Register(() =>
            {
                try
                {
                    var addressFeature = app.ServerFeatures.Get <IServerAddressesFeature>();
                    logger.LogInformation($"addressFeature:{string.Join(",", addressFeature.Addresses)}");

                    string ip;
                    string scheme;
                    int port;
                    {
                        var address = new Uri(addressFeature.Addresses.FirstOrDefault());

                        port   = address.Port;
                        scheme = address.Scheme;

                        ip = address.Host;
                        if (ip == "[::]")
                        {
                            ip = Utils.IpUtils.GetIp(options.IpSegment);
                        }
                    }

                    if (string.IsNullOrEmpty(ip))
                    {
                        throw new Exception("ip is null");
                    }

                    logger.LogInformation($"scheme:{scheme} ip:{ip} port:{port}");

                    var httpCheck = new AgentServiceCheck()
                    {
                        DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
                        Interval      = TimeSpan.FromSeconds(10),
                        HTTP          = $"{scheme}://{ip}:{port}{options.CheckPath}",
                        Timeout       = TimeSpan.FromSeconds(5),
                        TLSSkipVerify = false,
                    };

                    registration.Checks  = new[] { httpCheck };
                    registration.Address = ip;
                    registration.Port    = port;
                    registration.Meta    = options.Meta ?? new Dictionary <string, string>();
                    registration.Tags    = options.Tags?.ToArray();

                    registration.Meta.Add("service-ver", serviceVersion);

                    logger.LogInformation($"to register httpCheck url:{httpCheck.HTTP} address:{registration.Address} port:{registration.Port} id:{registration.ID} serverName:{registration.Name}");

                    var client = new ConsulClient(m =>
                    {
                        m.Address = new Uri(consulUrl);
                        m.Token   = options.Token;
                    });

                    client.Agent.ServiceRegister(registration).Wait();
                }
                catch
                {
                    //注册出错=>退出软件
                    lifetime.StopApplication();
                }
            });

            lifetime.ApplicationStopping.Register(() =>
            {
                var client = new ConsulClient(m =>
                {
                    m.Address = new Uri(consulUrl);
                    m.Token   = options.Token;
                });

                logger.LogInformation($"to deregister service,id:{registration.ID} serverName:{registration.Name}");

                client.Agent.ServiceDeregister(registration.ID).Wait();
            });

            app.Map(options.CheckPath, app2 =>
            {
                app2.Run(context =>
                {
                    return(context.Response.WriteAsync("ok"));
                });
            });

            return(app);
        }