SpringCloud(二) Eureka注冊(cè)中心的使用-CSDN博客
在SpringCloud(二)中學(xué)習(xí)了如何通過Eureka實(shí)現(xiàn)服務(wù)的注冊(cè)和發(fā)送,從而通過RestTemplate實(shí)現(xiàn)不同微服務(wù)之間的調(diào)用,加上@LoadBalance注解之后實(shí)現(xiàn)負(fù)載均衡,那負(fù)載均衡的原理是什么呢?
目錄
一, 負(fù)載均衡
1.1 負(fù)載均衡原理
?1.2 源碼追蹤
1, LoadBalanceInterceptor
2, LoadBalanceClient
3, 負(fù)載均衡策略?
1.3 總結(jié)負(fù)載均衡?
二, 代碼示例
三, 負(fù)載均衡策略
3.1 負(fù)載均衡策略
3.2 自定義負(fù)載均衡策略
四, 負(fù)載均衡
一, 負(fù)載均衡
1.1 負(fù)載均衡原理
SpringCloud底層其實(shí)是利用了一個(gè)名為Ribbon的組件來(lái)實(shí)現(xiàn)負(fù)載均衡功能的.
此時(shí)就可以將我們發(fā)出的http://userservice/user/1請(qǐng)求變成http://localhost:8081
?1.2 源碼追蹤
為什么我們只輸入了user-service的服務(wù)名稱就可以訪問了呢?
顯然有人幫我們根據(jù)service名稱,獲取到了實(shí)例的ip和端口號(hào),它就是LoadBalanceInterceptor,這個(gè)類會(huì)對(duì)RestTemplate的請(qǐng)求進(jìn)行攔截,然后從Eureka根據(jù)服務(wù)id獲取服務(wù)列表,隨后利用負(fù)載均衡算法得到真是的服務(wù)地址信息,替換服務(wù)id.
1, LoadBalanceInterceptor
可以看到這里的intercept方法,攔截了用戶大的HttpRequest請(qǐng)求,然后做了以下幾件事:
-
request.getURI()
:獲取請(qǐng)求uri,本例中就是http://userservice/user/1 -
originalUri.getHost()
:獲取uri路徑的主機(jī)名,其實(shí)就是服務(wù)id,user-service
-
this.loadBalancer.execute()
:處理服務(wù)id,和用戶請(qǐng)求
2, LoadBalanceClient
繼續(xù)跟入execute方法:
- getLoadBalancer(serviceId):根據(jù)服務(wù)id獲取ILoadBalancer,而ILoadBalancer會(huì)拿著服務(wù)id去eureka中獲取服務(wù)列表并保存起來(lái)
- getServer(loadBalancer):利用內(nèi)置的負(fù)載均衡算法,從服務(wù)列表中選擇一個(gè)
放行后,再次訪問并跟蹤,發(fā)現(xiàn)獲取的是8081:
3, 負(fù)載均衡策略?
在剛才的代碼中,可以看到獲取服務(wù)是通過一個(gè)getServer方法來(lái)做負(fù)載均衡:
繼續(xù)跟入:
?繼續(xù)跟蹤源碼chooseServer方法,發(fā)現(xiàn)這么一段代碼:
?看看這個(gè)rule是誰(shuí):
這里的rule默認(rèn)值是一個(gè)RoundRobinRule,
看類的介紹(意思是輪詢):
1.3 總結(jié)負(fù)載均衡?
SpringCloudRibbon的底層采用了一個(gè)攔截器,攔截了RestTemplate發(fā)出的請(qǐng)求,對(duì)地址進(jìn)行了修改,用一幅圖總結(jié)一下:
基本流程如下:
- ?攔截我們的RestTemplate請(qǐng)求http://userservice/user/1;
- RibbonLoadBalancerClient會(huì)從請(qǐng)求url中獲取服務(wù)名稱,也就是userservice;
- DynamicServerListBalance根據(jù)userservice到eureka拉取服務(wù)列表;
- eureka返回列表,localhots:8081和localhost:8082;
- IRule利用內(nèi)置負(fù)載均衡規(guī)則,從列表中選擇一個(gè),例如localhost:8081;
- RibbonLoadBalanceClient修改請(qǐng)求地址,用localhost:8081代替userservice,得到http://localhost:8081/user/1.
二, 代碼示例
現(xiàn)在我們有兩個(gè)user-service微服務(wù),使用order-service多次調(diào)用user-service查看服務(wù)落在兩個(gè)user-service的頻率
啟動(dòng)服務(wù)并清空兩個(gè)user-service服務(wù)的日志:
?在瀏覽器多次調(diào)用order-service中的queryOrderByUserId接口:
分別查看兩個(gè)user-service的日志打印結(jié)果:
user-service1:
user-service2:
從日志結(jié)果可以看出,在不改變負(fù)載均衡策略的情況下,默認(rèn)的策略是輪詢的方式.
三, 負(fù)載均衡策略
3.1 負(fù)載均衡策略
負(fù)載均衡的規(guī)則都定義在IRule接口中,而IRule有很多不同的實(shí)現(xiàn)類:
不同規(guī)則的含義如下:
內(nèi)置負(fù)載均衡規(guī)則類 | 規(guī)則描述 |
RoundRobinRule | 簡(jiǎn)單輪詢服務(wù)列表來(lái)選擇服務(wù)器。它是Ribbon默認(rèn)的負(fù)載均衡規(guī)則。 |
AvailabilityFilteringRule | 對(duì)以下兩種服務(wù)器進(jìn)行忽略: (1)在默認(rèn)情況下,這臺(tái)服務(wù)器如果3次連接失敗,這臺(tái)服務(wù)器就會(huì)被設(shè)置為“短路”狀態(tài)。短路狀態(tài)將持續(xù)30秒,如果再次連接失敗,短路的持續(xù)時(shí)間就會(huì)幾何級(jí)地增加。 (2)并發(fā)數(shù)過高的服務(wù)器。如果一個(gè)服務(wù)器的并發(fā)連接數(shù)過高,配置了AvailabilityFilteringRule規(guī)則的客戶端也會(huì)將其忽略。并發(fā)連接數(shù)的上限,可以由客戶端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit屬性進(jìn)行配置。 |
WeightedResponseTimeRule | 為每一個(gè)服務(wù)器賦予一個(gè)權(quán)重值。服務(wù)器響應(yīng)時(shí)間越長(zhǎng),這個(gè)服務(wù)器的權(quán)重就越小。這個(gè)規(guī)則會(huì)隨機(jī)選擇服務(wù)器,這個(gè)權(quán)重值會(huì)影響服務(wù)器的選擇。 |
ZoneAvoidanceRule | 以區(qū)域可用的服務(wù)器為基礎(chǔ)進(jìn)行服務(wù)器的選擇。使用Zone對(duì)服務(wù)器進(jìn)行分類,這個(gè)Zone可以理解為一個(gè)機(jī)房、一個(gè)機(jī)架等。而后再對(duì)Zone內(nèi)的多個(gè)服務(wù)做輪詢。 |
BestAvailableRule | 忽略那些短路的服務(wù)器,并選擇并發(fā)數(shù)較低的服務(wù)器。 |
RandomRule | 隨機(jī)選擇一個(gè)可用的服務(wù)器。 |
RetryRule | 重試機(jī)制的選擇邏輯。 |
默認(rèn)的實(shí)現(xiàn)就是ZoneAvoidanceRule,是一種輪詢方案.
3.2 自定義負(fù)載均衡策略
通過定義IRule實(shí)現(xiàn)可以修改負(fù)載均衡規(guī)則,有兩種方式:
1. 代碼方式:在order-service中的OrderApplication類中,定義一個(gè)新的IRule:
@Bean
public IRule randomRule(){
return new RandomRule();
}
2. 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改規(guī)則:
userservice: # 給某個(gè)微服務(wù)配置負(fù)載均衡規(guī)則,這里是userservice服務(wù)
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負(fù)載均衡規(guī)則
一般用默認(rèn)的負(fù)載均衡規(guī)則,不做修改.
四, 負(fù)載均衡
Ribbon默認(rèn)是采用懶加載,即第一次訪問時(shí)才會(huì)去創(chuàng)建LoadBalanceClient,請(qǐng)求時(shí)間會(huì)很長(zhǎng).
而饑餓加載則會(huì)在項(xiàng)目啟動(dòng)時(shí)創(chuàng)建,降低第一次訪問的耗時(shí),通過下面配置開啟饑餓加載:
ribbon:
eager-load:
enabled: true
clients: userservice
未開啟饑餓加載時(shí):
第一次訪問的時(shí)候耗時(shí)是579ms
開啟饑餓加載時(shí):
先在配置文件里進(jìn)行配置
?重啟order-service進(jìn)行訪問
可以看出開啟饑餓加載后第一次訪問的時(shí)間變少了很多,未232ms.文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-736613.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-736613.html
到了這里,關(guān)于SpringCloud(三) Ribbon負(fù)載均衡的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!