.Net Core服務(wù)治理Consul自動(dòng)擴(kuò)展和服務(wù)調(diào)用
今天有寫(xiě)文章的時(shí)間了,開(kāi)心。延續(xù)上一篇的話題繼續(xù),順便放上一篇的傳送門(mén):點(diǎn)這里。
服務(wù)調(diào)用
既然服務(wù)注冊(cè)已經(jīng)搞完了,那么現(xiàn)在就開(kāi)始調(diào)用這些注冊(cè)好的服務(wù)。先做一下準(zhǔn)備動(dòng)作,把consul容器跑起來(lái):
打開(kāi)控制臺(tái)確認(rèn)正常:
然后多跑幾個(gè)應(yīng)用程序模擬多點(diǎn)部署:
程序跑完以后檢察一下服務(wù)列表:
戳進(jìn)去看看:
一切準(zhǔn)備就緒,完美。然后進(jìn)入編碼環(huán)節(jié)。老規(guī)矩,直接上碼:
public static string Convert(string consulUri, string centerName, string reqUri) { ConsulClient client = new ConsulClient(x => { x.Address = new Uri(consulUri); x.Datacenter = centerName; }); //獲取consul中注冊(cè)的服務(wù)列表 var consulServiceList = client.Agent.Services().Result.Response; //統(tǒng)一請(qǐng)求地址 Uri uri = new Uri(reqUri); //取出分組名稱(chēng) string groupName = uri.Host; //匹配出對(duì)應(yīng)的服務(wù) var serviceList = consulServiceList.Where(x => x.Value.Service.ToLower().Equals(groupName.ToLower())).ToArray(); //隨機(jī)訪問(wèn)策略 var service = serviceList[new Random().Next(serviceList.Length)].Value; return $"{uri.Scheme}://{service.Address}:{service.Port}{uri.PathAndQuery}"; }
上面是自行封裝的方法,作用很簡(jiǎn)單:把通用的請(qǐng)求地址轉(zhuǎn)換為實(shí)際發(fā)起請(qǐng)求的地址,比如調(diào)用起來(lái)是這樣的:
string realUri = ConsulService.Convert("http://127.0.0.1:8700", "dc1", "http://shenzhen-ma/v1/client/base/index");
發(fā)現(xiàn)了么,分組名稱(chēng)“shenzhen-ma”直接替代了具體的ip和端口。這樣做真的可以拿到請(qǐng)求結(jié)果么?隨便寫(xiě)一個(gè)測(cè)試用的controller:
public async Task<IActionResult> Post() { string realUri = ConsulService.Convert("http://127.0.0.1:8700", "dc1", "http://shenzhen-ma/v1/client/base/index"); string result = await Service.Tool.HttpHelper.Get(realUri); return Ok(result); }
看請(qǐng)求結(jié)果:
5001應(yīng)用程序請(qǐng)求到了5004的數(shù)據(jù)。多試幾下再看看:
很顯然,通過(guò)統(tǒng)一的請(qǐng)求地址,實(shí)際的請(qǐng)求分發(fā)到了不同的節(jié)點(diǎn)上。
復(fù)盤(pán)一波
到剛才,我已經(jīng)完成了服務(wù)調(diào)用這個(gè)關(guān)鍵步驟。consul做了什么呢?它幫我們把統(tǒng)一的請(qǐng)求地址轉(zhuǎn)換成了真實(shí)發(fā)生作用的請(qǐng)求地址。未來(lái)如果增加了新的服務(wù)器,無(wú)需調(diào)整,它自己就能夠發(fā)現(xiàn)新的服務(wù)——這就是大家廣泛理解的服務(wù)發(fā)現(xiàn)。實(shí)際上,這個(gè)功能就賦予了我們動(dòng)態(tài)增加節(jié)點(diǎn)的能力。能伸能縮,是微服務(wù)的一個(gè)重要特征。當(dāng)然,因?yàn)闆](méi)有配置健康檢查,我的consul現(xiàn)在還不能自動(dòng)移除不可用的服務(wù),能伸不能縮,很尷尬。這個(gè)么,時(shí)間有限,放在下一篇文章去寫(xiě)。這一篇文章能講清楚服務(wù)調(diào)用,并由此能理解什么是服務(wù)發(fā)現(xiàn),我覺(jué)得就達(dá)標(biāo)。
到此這篇關(guān)于.Net Core服務(wù)治理Consul自動(dòng)擴(kuò)展和服務(wù)調(diào)用的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET MVC4入門(mén)教程(四):添加一個(gè)模型
本文主要介紹在MVC4中如何添加一個(gè)模型(Model),這個(gè)類(lèi)負(fù)責(zé)和數(shù)據(jù)庫(kù)交互,主要處理一些增刪改查的操作。2016-04-04在ASP.NET 2.0中操作數(shù)據(jù)之十二:在GridView控件中使用TemplateField
本文主要講解在GridView控件中如何使用TemplateField,從而更加高級(jí)的自定義GridView,實(shí)現(xiàn)自定義列表的功能。2016-05-05在ASP.NET 2.0中操作數(shù)據(jù)之六十:創(chuàng)建一個(gè)自定義的Database-Driven Site Map Provid
ASP.NET 2.0的site map是建立在provider模式的基礎(chǔ)上的,因此我們可以創(chuàng)建一個(gè)自定義的site map provider,從數(shù)據(jù)庫(kù)或某個(gè)層來(lái)獲取數(shù)據(jù)。本文就詳解介紹如何自定義的site map provider動(dòng)態(tài)的獲取數(shù)據(jù),替代先前通過(guò)"硬編碼"的方式添加到Web.sitemap文件的方法。2016-05-05在ASP.NET 2.0中操作數(shù)據(jù)之十五:在GridView的頁(yè)腳中顯示統(tǒng)計(jì)信息
本文主要介紹在GridView中顯示頁(yè)腳的實(shí)現(xiàn)方法,通過(guò)設(shè)置ShowFooter設(shè)置為T(mén)rue,再配合事件和底層的方法從而實(shí)現(xiàn)在GridView的頁(yè)腳區(qū)域顯示相關(guān)的統(tǒng)計(jì)信息。2016-05-05在ASP.NET 2.0中操作數(shù)據(jù)之二十四:分頁(yè)和排序報(bào)表數(shù)據(jù)
本文主要介紹ASP.NET 2.0中使用GirdView控件呈現(xiàn)數(shù)據(jù)時(shí)如何實(shí)現(xiàn)分頁(yè)和排序功能的,希望對(duì)大家有所幫助。2016-05-05ASP.NET MVC4入門(mén)教程(二):添加一個(gè)控制器
本文對(duì)MVC模式(模型-視圖-控制器)做了簡(jiǎn)單的介紹,并演示如何添加一個(gè)控制器。2016-04-04.Net?Core微服務(wù)網(wǎng)關(guān)Ocelot集成Consul
這篇文章介紹了.Net?Core微服務(wù)網(wǎng)關(guān)Ocelot集成Consul的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01.NET 2.0獲取配置文件AppSettings和ConnectionStrings節(jié)數(shù)據(jù)的方法
.NET 2.0獲取配置文件AppSettings和ConnectionStrings節(jié)數(shù)據(jù)的方法...2007-12-12在ASP.NET 2.0中操作數(shù)據(jù)之二十一:實(shí)現(xiàn)開(kāi)放式并發(fā)
本文主要介紹ASP.NET 2.0如何實(shí)現(xiàn)開(kāi)放式并發(fā)控制,并逐步講解從數(shù)據(jù)訪問(wèn)層到業(yè)務(wù)邏輯層以及到最終的頁(yè)面是如何一步一步操作的。2016-05-05