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


基本介紹:

安裝:

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

運行:

consul agent -dev

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

頁面顯示:

然后訪問8500端口就可以看到頁面:

 命令:

    consul members:輸出當前服務的信息,顯示的所有配置節點。

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

服務連接:

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

 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:當應用程序主機執行關機時觸發。所有請求應該在這一點完成。關機將阻止此事件完成。

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

        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();//服務停止時取消注冊
            });
        }
View Code

運行效果截圖:

 

 

客戶端:

簡單介紹一個獲取服務所有地址,然后打印並從其中隨機選取一個進行請求並打印:

       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");
            }
        }
View Code

系列章節:

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


免責聲明!

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



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