生活随笔
收集整理的這篇文章主要介紹了
五分钟了解Consul
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Hi,大家好,我叫consul,翻譯成中文叫做“領事”,其實我更喜歡叫自己為中介,因為我覺得自己做的事情和房產中介非常像。比如說想要賣房的房東到我這邊登記,我將房屋信息登錄到我的表格中(服務注冊),有買家來咨詢時,我再查詢表格將符合條件的房子返回給買家(服務發現),平時我也要做點房源的維護工作,比如每隔一天就打電話問下房東:“你的房子還賣么?(服務健康檢查)”。
我的誕生也和現在互聯網項目的開發模式有關,從之前的三層架構衍化成現在有微服務架構,把原來BLL和DAL層做事按業務拆成獨立的分布式服務(其實很多人就是把CURD放到單獨的服務中而已),為了高可用&高擴展,又把這些服務(進程)集群化,就出現一堆的地址和端口。客戶端由原來的進程內調用變成跨進程或跨網絡調用服務,把這些一堆地址和端口放到配置文件中。這樣做其實沒什么問題,但維護起來比較麻煩,比如說增加一個服務,就要修改配置文件并重啟客戶端,同理,刪掉一個服務也要同樣的操作。
我的作用主要是管理這些集群服務的配置,整體流程是這樣子的:服務(進程)啟動的時候把服務名和自己的IP、端口通過HTTP告訴我,我將這些信息記到自己的內存表格中,客戶端調用時帶上要查詢的服務名通過HTTP發送給我,我再自己的內存表中找到叫這服務名的所有配置發送給客戶端。
平時我還要做一些服務健康檢查的事兒,在上面服務啟動的時候,服務還要給我配置一個檢查接口和檢查頻率等一些參數,我會按這些參數每隔一段時間,比如10秒鐘去請求一下這個接口,如果不通,我就隔5秒再重試下,如果重試3次還不通,我就認定這個服務掛掉了,就從內存表格中刪掉這個服務配置,不然客戶端要請求到這個不通服務,我就罪過了。
說了這么多,還是看下我的整個流程圖吧,一圖勝千言:
最后,再用代碼實現下吧,語言是C#,其實語言類似,反正都有現成的sdk。
1、VS中建個控制臺應用,并通過nuget安裝consul包
2、注冊幾個服務
static void Main(string[] args)
{string serviceName = "OrderService";// 注冊服務RegisteService(serviceName, new DnsEndPoint("127.0.0.1", 16005));RegisteService(serviceName, new DnsEndPoint("127.0.0.1", 16007));RegisteService(serviceName, new DnsEndPoint("127.0.0.1", 16008));Console.ReadKey();
}
static bool RegisteService(string serviceName, DnsEndPoint dnsEndPoint)
{var serviceId = GenServiceId(serviceName, dnsEndPoint);var checkId = GenCheckId(serviceName, dnsEndPoint);var checkName = GenCheckName(serviceName, dnsEndPoint);var check = new AgentCheckRegistration{ID = checkId,Name = checkName,TCP = $"{dnsEndPoint.Host}:{dnsEndPoint.Port}",Interval = TimeSpan.FromSeconds(10),Status = HealthStatus.Passing,DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(20),};var service = new AgentServiceRegistration{ID = serviceId,Name = serviceName,Address = dnsEndPoint.Host,Port = dnsEndPoint.Port,Check = check};var _client = new ConsulClient(config =>{var uriBuilder = new UriBuilder("http://localhost:8500");config.Address = uriBuilder.Uri;});var res = _client.Agent.ServiceRegister(service).Result;if (res.StatusCode != HttpStatusCode.OK)return false;return true;
}
3、服務發現
static void Main(string[] args)
{string serviceName = "OrderService";// 服務發現List<string> targets = FindServiceEndpoints(serviceName);foreach (var item in targets){Console.WriteLine(item);}Console.ReadKey();
}
static List<string> FindServiceEndpoints(string serviceName)
{var _client = new ConsulClient(config =>{var uriBuilder = new UriBuilder("http://localhost:8500");config.Address = uriBuilder.Uri;});var targets = new List<string>();try{var r = _client.Health.Service(serviceName, "", true).Result;if (r.StatusCode != HttpStatusCode.OK)throw new ApplicationException($"query consul server error");targets = r.Response.Select(x => $"{x.Service.Address}:{x.Service.Port}").ToList();}catch { }return targets;
}
PS:不要忘了把consul也做成集群~~
總結
以上是生活随笔為你收集整理的五分钟了解Consul的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。