.NET Core微服務使用Consul實現服務注冊/發現/健康檢查


 關於Consul的更多介紹,比如優點,這里就不再贅述了,上網一搜就可以隨處找到了。但是,必須貼一個和其他類似軟件的對比:

關於Consul的架構以及相關的角色

 

基於IApplicationBuilder寫一個擴展方法,用於調用Consul API

   public static class RegisterService
    {
        const string _consulIP = "192.168.200.145";
        const int _consulPort = 8500;
        public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IApplicationLifetime lifetime, IHostingEnvironment env)
        {
            var server = AppConfiguration.Configurations["urls"];
            if (server.IsContains("/") && server.Contains(":"))
            {
                var str = server.Split('/').LastOrDefault().Split(':');
                string _ip = str.FirstOrDefault();
                int _port = Convert.ToInt32(str.LastOrDefault());
                try
                {
                    if (_ip.IsNotNull() && _port > 0)
                    {
                        var consulClient = new ConsulClient(x => x.Address = new Uri($"http://{_consulIP}:{_consulPort}"));//請求注冊的 Consul 地址
                        var httpCheck = new AgentServiceCheck()
                        {
                            DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(1),//服務啟動多久后注冊
                            Interval = TimeSpan.FromSeconds(1),//健康檢查時間間隔,或者稱為心跳間隔
                            HTTP = $"http://{_ip}:{_port}/api/health",//健康檢查地址
                            Timeout = TimeSpan.FromSeconds(5)
                        };
                        var registration = new AgentServiceRegistration()
                        {
                            Checks = new[] { httpCheck },
                            ID = Guid.NewGuid().ToString(),
                            Name = env.ApplicationName,
                            Address = _ip,
                            Port = _port,
                            Tags = new[] { $"urlprefix-/{env.ApplicationName}" }//添加 urlprefix-/servicename 格式的 tag 標簽,以便 Fabio 識別
                        };
                        consulClient.Agent.ServiceRegister(registration).Wait();//服務啟動時注冊,內部實現其實就是使用 Consul API 進行注冊(HttpClient發起)
                        lifetime.ApplicationStopping.Register(() =>
                        {
                            consulClient.Agent.ServiceDeregister(registration.ID).Wait();//服務停止時取消注冊
                        });
                        return app;
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception($"注冊服務器{_consulIP}:{_consulPort}:", ex);
                }
            }
            throw new Exception("服務(注冊/發現)獲取Host失敗");
        }
    }
View Code

 

在Starup類的Configure方法中,調用此擴展方法調用:

      public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseStaticFiles();
            Configures<TokenProvider>(app, env);
            app.RegisterConsul(lifetime, env);
            app.UseMvc();
        }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM