新聞中心
小編給大家分享一下.NET Core微服務(wù)之基于Consul如何實(shí)現(xiàn)服務(wù)治理,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
一、Consul基礎(chǔ)介紹
Consul是HashiCorp公司推出的開(kāi)源工具,用于實(shí)現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置。與其他分布式服務(wù)注冊(cè)與發(fā)現(xiàn)的方案,比如 Airbnb的SmartStack等相比,Consul的方案更“一站式”,內(nèi)置了服務(wù)注冊(cè)與發(fā)現(xiàn)框 架、分布一致性協(xié)議實(shí)現(xiàn)、健康檢查、Key/Value存儲(chǔ)、多數(shù)據(jù)中心方案,不再需要依賴其他工具(比如ZooKeeper等),使用起來(lái)也較 為簡(jiǎn)單。
Consul用Golang實(shí)現(xiàn),因此具有天然可移植性(支持Linux、windows和Mac OS X);安裝包僅包含一個(gè)可執(zhí)行文件,方便部署,與Docker等輕量級(jí)容器可無(wú)縫配合。
關(guān)于Consul的更多介紹,比如優(yōu)點(diǎn),這里就不再贅述了,上網(wǎng)一搜就可以隨處找到了。但是,必須貼一個(gè)和其他類似軟件的對(duì)比:
此外,關(guān)于Consul的架構(gòu)以及相關(guān)的角色,如下圖所示:
要想利用Consul提供的服務(wù)實(shí)現(xiàn)服務(wù)的注冊(cè)與發(fā)現(xiàn),我們需要建立Consul Cluster。在Consul方案中,每個(gè)提供服務(wù)的節(jié)點(diǎn)上都要部署和運(yùn)行Consul的Client Agent,所有運(yùn)行Consul Agent節(jié)點(diǎn)的集合構(gòu)成Consul Cluster。Consul Agent有兩種運(yùn)行模式:Server和Client。這里的Server和Client只是Consul集群層面的區(qū)分,與搭建在Cluster之上的應(yīng)用服務(wù)無(wú)關(guān)。以Server模式運(yùn)行的Consul Agent節(jié)點(diǎn)用于維護(hù)Consul集群的狀態(tài),官方建議每個(gè)Consul Cluster至少有3個(gè)或以上的運(yùn)行在Server Mode的Agent,Client節(jié)點(diǎn)不限。
Consul支持多數(shù)據(jù)中心,每個(gè)數(shù)據(jù)中心的Consul Cluster都會(huì)在運(yùn)行于Server模式下的Agent節(jié)點(diǎn)中選出一個(gè)Leader節(jié)點(diǎn),這個(gè)選舉過(guò)程通過(guò)Consul實(shí)現(xiàn)的raft協(xié)議保證,多個(gè) Server節(jié)點(diǎn)上的Consul數(shù)據(jù)信息是強(qiáng)一致的。處于Client Mode的Consul Agent節(jié)點(diǎn)比較簡(jiǎn)單,無(wú)狀態(tài),僅僅負(fù)責(zé)將請(qǐng)求轉(zhuǎn)發(fā)給Server Agent節(jié)點(diǎn)。
二、Consul集群搭建
2.1 環(huán)境準(zhǔn)備
這里我準(zhǔn)備了三臺(tái)Linux(CentOS)虛擬機(jī)和一臺(tái)Windows Server 2008 R2虛擬機(jī),借助VMware Workstation搭建,如下圖所示。
其中,192.168.80.100會(huì)作為leader角色,其余兩臺(tái)192.168.80.101和192.168.80.102會(huì)作為follower角色。當(dāng)然,實(shí)際環(huán)境中l(wèi)eader角色不會(huì)是一個(gè)固定的,會(huì)隨著環(huán)境的變化(比如Leader宕機(jī)或失聯(lián))由算法選出新的leader。在進(jìn)行下面的操作會(huì)前,請(qǐng)確保三臺(tái)節(jié)點(diǎn)能夠相互ping通,并能夠和宿主機(jī)也ping通。另外,192.168.80.71會(huì)作為client角色,并且和其余三臺(tái)虛擬機(jī)互相ping通。
2.2 下載Consul
Consul的下載很簡(jiǎn)單,直接去:https://www.consul.io/downloads.html 選擇對(duì)應(yīng)的平臺(tái)即可。
這里我們的linux虛擬機(jī)選擇的是Linux版本:
下載之后是一個(gè)zip文件,我們通過(guò)XFtp等工具將其傳送到我們的linux節(jié)點(diǎn)中即可。
而Windows Server虛擬機(jī)選擇的是Windows版本,不再贅述。
2.3 安裝與配置Consul
1.解壓Consul.zip:
分別在三臺(tái)節(jié)點(diǎn)中解壓,解壓命令:
> unzip consul_1.1.0_linux_386.zip
解壓之后將consul復(fù)制到我們的自定義文件目錄中,比如:/usr/local/consul
> cp consul /usr/local/consul
2.設(shè)置環(huán)境變量
分別在三臺(tái)節(jié)點(diǎn)中設(shè)置環(huán)境變量:
> vim /etc/profile
在profile中增加一行CONSUL_HOME并更改PATH:
# Consul
export CONSUL_HOME=/usr/local/consul
export PATH=$PATH:$JAVA_HOME/bin:$CONSUL_HOME;
使得配置生效
> source /etc/profile
測(cè)試是否生效,在三個(gè)節(jié)點(diǎn)測(cè)試輸入consul
> consul
看到下圖所示的命令提示,就代表OK了。
3.啟動(dòng)Server(s)
分別在三臺(tái)節(jié)點(diǎn)上執(zhí)行以下命令即可啟動(dòng)Consul
192.168.80.100>consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=consul-1 -client=0.0.0.0 -bind=192.168.80.100 -datacenter=dc1
192.168.80.101>consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=consul-2 -client=0.0.0.0 -bind=192.168.80.101 -datacenter=dc1 -join 192.168.80.100
192.168.80.102>consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=consul-3 -client=0.0.0.0 -bind=192.168.80.102 -datacenter=dc1 -join 192.168.80.100
注意101和102的啟動(dòng)命令中,有一句 -join 192.168.80.100 => 有了這一句,就把101和102加入到了100所在的集群中。
啟動(dòng)之后,集群就開(kāi)始了Vote(投票選Leader)的過(guò)程,通過(guò)下面的命令可以看到集群的情況:
在Windows Server虛擬機(jī)上啟動(dòng):
> consul agent -bind 0.0.0.0 -client 192.168.80.71 -data-dir=C:\Counsul\tempdata -node EDC.DEV.WebServer -join 192.168.80.100
啟動(dòng)后會(huì)有如下提示:
4.通過(guò)UI查看集群
Consul不僅提供了豐富的命令查看集群情況,還提供了一個(gè)WebUI,默認(rèn)端口8500,我們可以通過(guò)訪問(wèn)這個(gè)URL(eg.http://192.168.80.100:8500)得到如下圖所示的WebUI:
可以看到三個(gè)節(jié)點(diǎn)都正常啟動(dòng),下面我們就來(lái)試試向Consul注冊(cè)一下我們基于ASP.NET Core的WebAPI服務(wù)。
5.模擬Leader掛掉,查看Consul集群的新選舉Leader
這里我暴力一點(diǎn)直接將Leader節(jié)點(diǎn)關(guān)機(jī):shutdown -h now,可以看到我們的80.100已經(jīng)掛了。
查看其余兩個(gè)節(jié)點(diǎn)的日志可以發(fā)現(xiàn),consul-3 (80.102)被選為了新的leader:
當(dāng)然,也可以通過(guò)80.101或102的WebUI查看:
也可以通過(guò)以下命令查看目前的各個(gè)Server的角色狀態(tài):
> consul operator raft list-peers
雖然這里80.100這個(gè)原leader節(jié)點(diǎn)掛掉了,但是只要超過(guò)一半的Server(這里是2/3還活著)還活著,集群是可以正常工作的,這也是為什么像Consul、ZooKeeper這樣的分布式管理組件推薦我們使用3個(gè)或5個(gè)節(jié)點(diǎn)來(lái)部署的原因。
三、ASP.NET Core WebAPI服務(wù)注冊(cè)
3.1 準(zhǔn)備一個(gè)ASP.NET Core WebAPI程序
Step1.創(chuàng)建一個(gè)ASP.NET Core WebAPI程序
Step2.創(chuàng)建一個(gè)HealthController用于Consul的健康檢查
[Produces("application/json")] [Route("api/Health")] public class HealthController : Controller { [HttpGet] public IActionResult Get() => Ok("ok"); }
*.Consul會(huì)通過(guò)call這個(gè)API來(lái)確認(rèn)Service的健康狀態(tài)。
Step3.改寫(xiě)啟動(dòng)代碼,調(diào)用Consul API注冊(cè)服務(wù)
(1)通過(guò)Nuget安裝Consul的.NET客戶端
PM> install-package Consul
(2)基于IApplicationBuilder寫(xiě)一個(gè)擴(kuò)展方法,用于調(diào)用Consul API
public static class AppBuilderExtensions { public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IApplicationLifetime lifetime, ServiceEntity serviceEntity) { var consulClient = new ConsulClient(x => x.Address = new Uri($"http://{serviceEntity.ConsulIP}:{serviceEntity.ConsulPort}"));//請(qǐng)求注冊(cè)的 Consul 地址 var httpCheck = new AgentServiceCheck() { DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服務(wù)啟動(dòng)多久后注冊(cè) Interval = TimeSpan.FromSeconds(10),//健康檢查時(shí)間間隔,或者稱為心跳間隔 HTTP = $"http://{serviceEntity.IP}:{serviceEntity.Port}/api/health",//健康檢查地址 Timeout = TimeSpan.FromSeconds(5) }; // Register service with consul var registration = new AgentServiceRegistration() { Checks = new[] { httpCheck }, ID = Guid.NewGuid().ToString(), Name = serviceEntity.ServiceName, Address = serviceEntity.IP, Port = serviceEntity.Port, Tags = new[] { $"urlprefix-/{serviceEntity.ServiceName}" }//添加 urlprefix-/servicename 格式的 tag 標(biāo)簽,以便 Fabio 識(shí)別 }; consulClient.Agent.ServiceRegister(registration).Wait();//服務(wù)啟動(dòng)時(shí)注冊(cè),內(nèi)部實(shí)現(xiàn)其實(shí)就是使用 Consul API 進(jìn)行注冊(cè)(HttpClient發(fā)起) lifetime.ApplicationStopping.Register(() => { consulClient.Agent.ServiceDeregister(registration.ID).Wait();//服務(wù)停止時(shí)取消注冊(cè) }); return app; }
*.這里主要是參考的田園的蟋蟀的Code,鏈接見(jiàn)參考資料部分。
(3)在Starup類的Configure方法中,調(diào)用此擴(kuò)展方法
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); // register this service ServiceEntity serviceEntity = new ServiceEntity { IP = NetworkHelper.LocalIPAddress, Port = Convert.ToInt32(Configuration["Service:Port"]), ServiceName = Configuration["Service:Name"], ConsulIP = Configuration["Consul:IP"], ConsulPort = Convert.ToInt32(Configuration["Consul:Port"]) }; app.RegisterConsul(lifetime, serviceEntity); }
其中ServiceEntity類定義如下:
View Code
其中用到了appSettings.json配置文件,其定義如下:
View Code
*.這段代碼不再解釋,一眼就能看懂。另外,除了調(diào)用Consul API之外,還可以通過(guò)配置文件的方式,例如以下配置文件格式,這里不再演示。
View Code
Step4.保留默認(rèn)創(chuàng)建的ValuesController,其余不再創(chuàng)建任何API,不是本次實(shí)驗(yàn)的重點(diǎn)。當(dāng)然,你可以集成一下Swagger,這樣有個(gè)界面文檔可以看。
這里我默認(rèn)跳轉(zhuǎn)到healthcontroller:
3.2 發(fā)布到IIS
Step1.在.NET Core程序中進(jìn)行發(fā)布很簡(jiǎn)單,既可以采用原來(lái)在VS里邊創(chuàng)建配置文件進(jìn)行發(fā)布,也可以使用命令行(例如:dotnet publish),這里我還是在VS里面發(fā)布,得到Release文件
Step2.通過(guò)Ftp工具copy到Windows Server虛擬機(jī)中
Step3.這里我的Windows Server虛擬機(jī)是2008 R2,需要裝一個(gè)Windows Server Hosting,下載地址:點(diǎn)我點(diǎn)我。如果不安裝這個(gè),你的IIS是跑不起來(lái).NET Core程序的。
Step4.按照你熟悉的方式在IIS中添加一個(gè)網(wǎng)站(服務(wù)):
Step5.更改默認(rèn)應(yīng)用程序池的.net framework版本為“無(wú)托管代碼”。
Step6.照理說(shuō),到這里就OK了,點(diǎn)擊瀏覽訪問(wèn),TMD,給我報(bào)了個(gè)502.5的錯(cuò)誤
于是乎網(wǎng)上一陣搜索,發(fā)現(xiàn)需要打個(gè)補(bǔ)?。╓indows6.1-KB2533623-x64.msu),下載地址:點(diǎn)我點(diǎn)我。
Step7.安裝補(bǔ)丁之后,重啟IIS,可以成功訪問(wèn)了=>確保Consul能夠call到我們的服務(wù)的health API。
3.3 查看Consul集群狀態(tài)
Step1.訪問(wèn)Consul的WebUI查看服務(wù)是否注冊(cè)成功:可以看到我們的ClientService已成功注冊(cè)
Step2.Consul不僅僅提供了服務(wù)注冊(cè),還提供了服務(wù)發(fā)現(xiàn),我們可以通過(guò)調(diào)用其提供的API來(lái)發(fā)現(xiàn)服務(wù)的IP和Port。
Url>http://192.168.80.100:8500/v1/catalog/service/CAS.NB.ClientService
*.我們可以看到返回了ClientService的ServiceAddress和ServicePort,就可以通過(guò)其組成URL進(jìn)行服務(wù)調(diào)用了。當(dāng)然,我們可能會(huì)對(duì)一個(gè)服務(wù)部署多個(gè)實(shí)例,以組成集群來(lái)實(shí)現(xiàn)負(fù)載均衡。我們可以設(shè)置一些負(fù)載均衡的策略,假設(shè)通過(guò)取模運(yùn)算隨機(jī)選擇一個(gè)服務(wù)地址返回給服務(wù)消費(fèi)者。
Step3.這里我們將發(fā)布的Release文件在Windows Server虛擬機(jī)上copy一份,并改一下配置文件,讓其ServiceName變?yōu)镃AS.NB.ProductService,其Port變?yōu)?820,在IIS上再添加一個(gè)網(wǎng)站,啟動(dòng)起來(lái),再通過(guò)WebUI查看Consul集群狀態(tài):
Step4.這時(shí)我們?cè)偻ㄟ^(guò)以下API進(jìn)行服務(wù)發(fā)現(xiàn):
Url>http://192.168.80.100:8500/v1/catalog/service/CAS.NB.ProductService
四、小結(jié)與后續(xù)工作
本篇主要基于一個(gè)最小化的集群搭建了一個(gè)Consul服務(wù)治理組件,并將ASP.NET Core API程序注冊(cè)到了Consul,并嘗試通過(guò)Consul進(jìn)行服務(wù)發(fā)現(xiàn)(雖然沒(méi)有模擬具體的服務(wù)消費(fèi))。本篇沒(méi)有仔細(xì)講述Consul的介紹、優(yōu)點(diǎn)、缺點(diǎn),因?yàn)楸救艘矝](méi)有啥實(shí)際的經(jīng)驗(yàn),因此只能是站在其他園友的肩膀上做個(gè)小實(shí)驗(yàn)。ASP.NET Core是一個(gè)天生適合微服務(wù)的技術(shù),也希望能在我們的學(xué)習(xí)和推動(dòng)下,讓公司把.NET Core應(yīng)用起來(lái),將來(lái)能夠跑在Linux和Docker上,這是我目前的目標(biāo),與大家共勉。
后續(xù)我會(huì)繼續(xù)嘗試基于Ocelot構(gòu)建API網(wǎng)關(guān),到時(shí)會(huì)結(jié)合Consul進(jìn)行進(jìn)一步的集成。另外,還會(huì)嘗試Polly進(jìn)行熔斷降級(jí)、Identity Server進(jìn)行驗(yàn)證,Exceptionless作分布式日志,基本上會(huì)遵循.NET Core大隊(duì)長(zhǎng)張善友的微服務(wù)示例項(xiàng)目NanoFabric用到的(或者說(shuō)是給我們安利的技術(shù)框架)那些開(kāi)源技術(shù)來(lái)搭建一個(gè)初步的微服務(wù)架構(gòu),以便于以后在公司內(nèi)部推廣和應(yīng)用。此外,考慮到公司目前的微服務(wù)架構(gòu)是基于Java的(Spring Cloud),那么也會(huì)考慮通過(guò) Steeltoe 來(lái)和Spring Cloud進(jìn)行兼容,讓Java和.Net Core微服務(wù)能夠共存(可以參考資料里的第7個(gè),田園里的蟋蟀出品)。這里,也安利一下正在學(xué)習(xí)微服務(wù)的.NET Coder們,可以看看張善友老師的NanoFabric,或者是楊中科老師的.NET Core微服務(wù)課程。
看完了這篇文章,相信你對(duì)“.NET Core微服務(wù)之基于Consul如何實(shí)現(xiàn)服務(wù)治理”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享文章:.NETCore微服務(wù)之基于Consul如何實(shí)現(xiàn)服務(wù)治理-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/dopiec.html