ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡
本系列相關(guān)文章:
《ASP.NET Core中Ocelot的使用:API網(wǎng)關(guān)的應(yīng)用》
《ASP.NET Core中Ocelot的使用:基于Spring Clound Netflix Eureka的動(dòng)態(tài)路由》
本文將基于前兩篇文章所述內(nèi)容,繼續(xù)介紹如何在服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)路由的基礎(chǔ)上,使用Ocelot實(shí)現(xiàn)負(fù)載均衡。Ocelot本身是帶有負(fù)載均衡功能的,這一點(diǎn)其實(shí)跟Nginx提供的HTTP load balancer是類似的功能(我覺(jué)得整個(gè)Ocelot提供的功能,通過(guò)Nginx也都可以實(shí)現(xiàn),不過(guò)Ocelot更加.NET化,對(duì)于.NET開(kāi)發(fā)人員來(lái)說(shuō)更為簡(jiǎn)單和容易接受)。根據(jù)官方文檔,Ocelot支持如下幾種負(fù)載均衡策略:
LeastConnection:根據(jù)服務(wù)當(dāng)前正在處理的請(qǐng)求個(gè)數(shù)來(lái)決定將使用哪個(gè)服務(wù)來(lái)處理新接收到的請(qǐng)求,將請(qǐng)求轉(zhuǎn)發(fā)給當(dāng)前連接數(shù)最少的服務(wù)
RoundRobin:經(jīng)典模式,輪詢法,逐個(gè)選擇可用的服務(wù)來(lái)處理接收到的請(qǐng)求
NoLoadBalancer:僅使用第一個(gè)可用的服務(wù)來(lái)處理接收到的請(qǐng)求
CookieStickySessions:通過(guò)使用Cookie,確保特定的請(qǐng)求能夠被分配到特定的服務(wù)上進(jìn)行處理
今天我們選擇RoundRobin來(lái)看看如何基于服務(wù)發(fā)現(xiàn)來(lái)實(shí)現(xiàn)負(fù)載均衡。同樣,首先需要對(duì)架構(gòu)進(jìn)行調(diào)整。
調(diào)整架構(gòu)
與上文中的架構(gòu)相比,這里不會(huì)引入新的服務(wù),而相比之下會(huì)讓兩個(gè)A服務(wù)的實(shí)例同時(shí)運(yùn)行。調(diào)整后的架構(gòu)如下圖所示:
整個(gè)API的調(diào)用過(guò)程如下:
A服務(wù)的兩個(gè)實(shí)例、B服務(wù)以及API網(wǎng)關(guān)在啟動(dòng)的時(shí)候均向Spring Cloud Eureka注冊(cè)自己
API用戶通過(guò)訪問(wèn)Eureka獲得API網(wǎng)關(guān)的地址
API用戶使用獲得的API網(wǎng)關(guān)地址,發(fā)送一個(gè)查詢A服務(wù)的請(qǐng)求
API網(wǎng)關(guān)根據(jù)指定的A服務(wù)的名稱,從Eureka查詢A服務(wù)所注冊(cè)的服務(wù)實(shí)例
API網(wǎng)關(guān)根據(jù)設(shè)定的負(fù)載均衡策略,向找到的服務(wù)實(shí)例發(fā)出請(qǐng)求,并將調(diào)用結(jié)果反饋給API用戶
可以看到,前面部分的調(diào)用過(guò)程與上文所述都是非常類似的,不同的僅有API網(wǎng)關(guān)在尋找A服務(wù)的實(shí)例這個(gè)部分,前面是直接獲得訪問(wèn)地址,而此處則通過(guò)負(fù)載均衡來(lái)選擇一個(gè)地址。接下來(lái),我們看看如何改變我們的代碼,來(lái)實(shí)現(xiàn)這個(gè)架構(gòu)。
代碼修改
這里的代碼修改會(huì)基于上文結(jié)尾時(shí)的代碼,也就是實(shí)現(xiàn)了Ocelot的動(dòng)態(tài)路由。首先,我們?cè)谟?jì)算服務(wù)(也就是A服務(wù))中增加一個(gè)API,用以返回當(dāng)前設(shè)置在主機(jī)上的machineName環(huán)境變量(如果設(shè)置為空,那么就直接返回主機(jī)機(jī)器名):
| 12345678910 | [Route("api/[controller]")][ApiController]public class ValuesController : ControllerBase{????[HttpGet("info")]????public ActionResult<string> Info()????????=> Environment.GetEnvironmentVariable("machineName") ?? Environment.MachineName;????// 其它代碼省略} |
然后,就是配置Ocelot,使其能夠?qū)崿F(xiàn)負(fù)載均衡:
| 1234567891011121314151617181920 | {??"ReRoutes": [??],??"GlobalConfiguration": {????"RequestIdKey": "OcRequestId",????"AdministrationPath": "/administration",????"ServiceDiscoveryProvider": {??????"Host": "localhost",??????"Port": 8761,??????"Type": "Eureka",??????"Token": null,??????"ConfigurationKey": null????},????"LoadBalancerOptions": {??????"Type": "RoundRobin"????},????"DownstreamScheme": "http"??}} |
只需注意上面的LoadBalancerOptions部分,這里我們采用了RoundRobin模式,這個(gè)配置文件的其它部分都與之前的一樣,沒(méi)有區(qū)別。
好了,代碼改好了。什么?就改好了?對(duì)的,就是這么簡(jiǎn)單!接下來(lái)讓我們測(cè)試一下。先在Eclipse里啟動(dòng)Spring Cloud Eureka:
然后,進(jìn)入CalcService的編譯輸出目錄,首先設(shè)置machineName環(huán)境變量,然后用下面的命令啟動(dòng)服務(wù):
用同樣的命令再啟動(dòng)另一個(gè)CalcService的實(shí)例:
OK,兩個(gè)CalcService的實(shí)例已經(jīng)啟動(dòng),分別偵聽(tīng)49814和49815兩個(gè)端口,接下來(lái),啟動(dòng)我們的Ocelot API網(wǎng)關(guān)。等Ocelot API網(wǎng)關(guān)啟動(dòng)之后,查看Eureka的服務(wù)注冊(cè),可以看到所有的服務(wù)已經(jīng)就緒:
請(qǐng)注意,對(duì)于CALC這個(gè)應(yīng)用程序,我們可以看到,有兩個(gè)實(shí)例已經(jīng)注冊(cè)成功。然后,我們通過(guò)訪問(wèn)API網(wǎng)關(guān)進(jìn)而訪問(wèn)剛剛新加的Info API,可以看到,服務(wù)調(diào)用成功。然后按F5刷新,可見(jiàn)返回的結(jié)果會(huì)在CalcService-1與CalcService-2之間來(lái)回切換,也就意味著我們的請(qǐng)求被依次分配到兩個(gè)不同的Calc服務(wù)的實(shí)例上執(zhí)行。動(dòng)圖為證:
由此可見(jiàn),我們已經(jīng)實(shí)現(xiàn)了基于Ocelot API網(wǎng)關(guān)的負(fù)載均衡。當(dāng)然,我們可以繼續(xù)修改ASP.NET Core MVC的前端頁(yè)面,讓它能夠直觀地顯示這個(gè)效果。這里也就不貼代碼了,大家可以按本文后面的源代碼鏈接下載源碼,自己研究。
解決方案容器化
同樣,我們可以把整個(gè)解決方案容器化,與上一篇文章所述的容器化有區(qū)別的一點(diǎn)是,對(duì)于CalcService的Dockerfile,我們要擴(kuò)充它的EXPOSE的端口范圍,原來(lái)是寫死的49814,現(xiàn)在讓它能夠曝露從49800到49899的所有端口,以便新的服務(wù)可以通過(guò)不同的端口接收請(qǐng)求。此外,還需要在docker-compose.yml中增加另一個(gè)Calc服務(wù)的配置,詳細(xì)可以仿照docker-compose.yml中已有的服務(wù)配置信息,這里也不多啰嗦了,源代碼庫(kù)中有完整的內(nèi)容供參考。
完成這些配置之后,可以直接用docker-compose一次性啟動(dòng)所有服務(wù),然后看看我們的API頁(yè)面,其中的“計(jì)算服務(wù)名稱”會(huì)隨著頁(yè)面的刷新動(dòng)態(tài)改變:
總結(jié)
本文對(duì)前文的案例做了一些簡(jiǎn)單的調(diào)整,實(shí)現(xiàn)了基于Ocelot API網(wǎng)關(guān)的負(fù)載均衡。其實(shí),負(fù)載均衡還可以實(shí)現(xiàn)在某個(gè)微服務(wù)的多個(gè)實(shí)例的層面,然后將這個(gè)層面的負(fù)載均衡器地址注冊(cè)到Eureka上,也是可以的。這樣的架構(gòu)能夠更好地控制每個(gè)服務(wù)的伸縮,并對(duì)其進(jìn)行監(jiān)控。接下來(lái)的文章中,我會(huì)繼續(xù)嘗試基于微服務(wù)的一些部署拓?fù)?#xff0c;以及在云中如何運(yùn)行我們的微服務(wù)架構(gòu)。
源代碼的使用
請(qǐng)?jiān)L問(wèn)https://github.com/daxnet/ocelot-sample/releases/tag/chapter_3下載本文相關(guān)案例的源代碼。
相關(guān)文章:
AspNetCore中使用Ocelot之 IdentityServer4
Ocelot-基于.NET Core的開(kāi)源網(wǎng)關(guān)實(shí)現(xiàn)
.NET Core微服務(wù)之基于Ocelot+IdentityServer實(shí)現(xiàn)統(tǒng)一驗(yàn)證與授權(quán)
Swagger如何訪問(wèn)Ocelot中帶權(quán)限驗(yàn)證的API
Ocelot.JwtAuthorize:一個(gè)基于網(wǎng)關(guān)的Jwt驗(yàn)證包
.NET Core微服務(wù)之基于Ocelot實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)
.NET Core微服務(wù)之基于Ocelot實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)(續(xù))
.NET微服務(wù)體系結(jié)構(gòu)中為什么使用Ocelot實(shí)現(xiàn)API網(wǎng)關(guān)
Ocelot簡(jiǎn)易教程(一)之Ocelot是什么
Ocelot簡(jiǎn)易教程(二)之快速開(kāi)始1
Ocelot簡(jiǎn)易教程(二)之快速開(kāi)始2
Ocelot簡(jiǎn)易教程(三)之主要特性及路由詳解
Ocelot簡(jiǎn)易教程(四)之請(qǐng)求聚合以及服務(wù)發(fā)現(xiàn)
Ocelot簡(jiǎn)易教程(五)之集成IdentityServer認(rèn)證以及授權(quán)
Ocelot簡(jiǎn)易教程(六)之重寫配置文件存儲(chǔ)方式并優(yōu)化響應(yīng)數(shù)據(jù)
Ocelot簡(jiǎn)易教程(七)之配置文件數(shù)據(jù)庫(kù)存儲(chǔ)插件源碼解析
ASP.NET Core中Ocelot的使用:API網(wǎng)關(guān)的應(yīng)用
ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的動(dòng)態(tài)路由
原文地址:?http://sunnycoding.cn/2018/11/06/aspnetcore-ocelot-service-discovery-load-balancing/
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ASP.NET Core中使用Graph
- 下一篇: .NET Core2使用Azure云上的