天天看點

【微服務No.1】Consul服務發現在windows下簡單使用

基本介紹:

安裝:

下載下傳位址:https://www.consul.io/downloads.html

運作:

consul agent -dev

【微服務No.1】Consul服務發現在windows下簡單使用

顯示這個界面說明已經開啟成功。

頁面顯示:

然後通路8500端口就可以看到頁面:

【微服務No.1】Consul服務發現在windows下簡單使用

 指令:

    consul members:輸出目前服務的資訊,顯示的所有配置節點。

   install-package Consul:在vs項目中安裝Consul

服務連接配接:

開啟consul服務之後需要把現有的項目連接配接叢集到consul服務,這時候需要在項目中注冊服務(在startup.cs檔案下的Configure方法):

【微服務No.1】Consul服務發現在windows下簡單使用
【微服務No.1】Consul服務發現在windows下簡單使用
String ip = Configuration["ip"];//部署到不同伺服器的時候不能寫成127.0.0.1或者0.0.0.0,因為這是讓服務消費者調用的位址
            int port = int.Parse(Configuration["port"]);//擷取服務端口
            var client = new ConsulClient(ConfigurationOverview); //回調擷取
            var result = client.Agent.ServiceRegister(new AgentServiceRegistration()
            {
                ID = "ServerNameFirst" + Guid.NewGuid(),//服務編号保證不重複
                Name = "MsgServer",//服務的名稱
                Address = ip,//服務ip位址
                Port = port,//服務端口
                Check = new AgentServiceCheck //健康檢查
                {
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服務啟動多久後反注冊
                    Interval = TimeSpan.FromSeconds(10),//健康檢查時間間隔,或者稱為心跳間隔(定時檢查服務是否健康)
                    HTTP = $"http://{ip}:{port}/api/Health",//健康檢查位址
                    Timeout = TimeSpan.FromSeconds(5)//服務的注冊時間
                }
            });      

View Code

之後在增加一個回調方法:

回調方法是代表的consul服務的位址配置。

private static void ConfigurationOverview(ConsulClientConfiguration obj)
        {
            //consul的位址
            obj.Address = new Uri("http://127.0.0.1:8500");
            //資料中心命名
            obj.Datacenter = "dc1";
        }
      

 服務到這裡已經是配置完畢。但是我們怎麼登出服務哪。當然是有辦法的拉。通過api我們可以知道ServiceDeregister方法是登出服務的方法。那麼我們應該怎麼寫哪:

首先我們要去了解一下IApplicationLifetime接口:允許消費者在優雅關機期間執行清理工作

    ApplicationStarted:當應用程式主機已完全啟動并将要等待時觸發

    ApplicationStopping:當應用程式主機執行優美關機時觸發。請求可能還在運作中。關閉将阻止此事件完成

    ApplicationStopped:當應用程式主機執行關機時觸發。所有請求應該在這一點完成。關機将阻止此事件完成。

好了,我的英語确實不好,這些就是自動翻譯的意思。不過也能讓我們明白大概的意思。知道有這個東西我們就可以實作功能了完整代碼:

【微服務No.1】Consul服務發現在windows下簡單使用
【微服務No.1】Consul服務發現在windows下簡單使用
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMvc();
            String ip = Configuration["ip"];//部署到不同伺服器的時候不能寫成127.0.0.1或者0.0.0.0,因為這是讓服務消費者調用的位址
            int port = int.Parse(Configuration["port"]);//擷取服務端口
            var client = new ConsulClient(ConfigurationOverview); //回調擷取
            string serverId = "ServerNameFirst" + Guid.NewGuid();

            var result = client.Agent.ServiceRegister(new AgentServiceRegistration()
            {
                ID = serverId,//服務編号保證不重複
                Name = "MsgServer",//服務的名稱
                Address = ip,//服務ip位址
                Port = port,//服務端口
                Check = new AgentServiceCheck //健康檢查
                {
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服務啟動多久後反注冊
                    Interval = TimeSpan.FromSeconds(10),//健康檢查時間間隔,或者稱為心跳間隔(定時檢查服務是否健康)
                    HTTP = $"http://{ip}:{port}/api/Health",//健康檢查位址
                    Timeout = TimeSpan.FromSeconds(5)//服務的注冊時間
                }
            });

            lifetime.ApplicationStopping.Register(() =>
            {
                Console.WriteLine("登出方法");
                client.Agent.ServiceDeregister(serverId).Wait();//服務停止時取消注冊
            });
        }      

運作效果截圖:

【微服務No.1】Consul服務發現在windows下簡單使用

用戶端:

簡單介紹一個擷取服務所有位址,然後列印并從其中随機選取一個進行請求并列印:

【微服務No.1】Consul服務發現在windows下簡單使用
【微服務No.1】Consul服務發現在windows下簡單使用
static List<string> Urls = new List<string>();

        static void Main(string[] args)
        {
            Console.WriteLine("開始輸出目前所有服務位址");
            Catalog_Nodes().GetAwaiter().GetResult();
            //Console.WriteLine(HelloConsul().GetAwaiter().GetResult());
            Console.WriteLine("開始随機請求一個位址服務位址");
            int index = new Random().Next(Urls.Count);
            string url = Urls[index];
            string param = "";//這裡是開始位置
            param += "{";
            param += "\"" + "id" + "\":\"" + 5 + "\",";
            param = param.TrimEnd(',');
            param += "}";
            Console.WriteLine("請求的随機位址:" + url);
            string result = HttpClientHelpClass.PostResponse(url, param, out string statusCode);
            Console.WriteLine("傳回狀态:" + statusCode);
            Console.WriteLine("傳回結果:" + result);
            Console.ReadLine();
        }
        public static async Task Catalog_Nodes()
        {
            var client = new ConsulClient();
            var nodeList = await client.Agent.Services();
            var url = nodeList.Response.Values;

            foreach (var item in url)
            {
                string Address = item.Address;
                int port = item.Port;
                string name = item.Service;
                Console.WriteLine($"位址:{Address}:{port},name:{name}");
                Urls.Add($"http://{Address}:{port}/api/Test");
            }
        }      

系列章節:

微服務系列文章主要介紹微服務所使用到的一些技術和一些技術示例:

  • 微服務——微服務的介紹和目錄
  • 微服務——【Consul】服務發現在windows下簡單使用(一)
  • 微服務——【polly】微服務故障處理庫(二)
  • 微服務——動态代理AspectCore的使用(三) 
  • 微服務——網關Ocelot+Consul實作叢集輪詢(四)

作者:YanBigFeg ——

顔秉鋒

出處:http://www.cnblogs.com/yanbigfeg

本文版權歸作者和部落格園共有,歡迎轉載,轉載請标明出處。如果您覺得本篇博文對您有所收獲,覺得小弟還算用心,請點選右下角的 [推薦],謝謝!