javascript
SpringCloud集成LoadBalance,负载均衡
前言
前一篇文章《SpringCloud集成OpenFeign,輕松RPC》給大家介紹了,如何在SpringCloud的開發(fā)中集成OpenFeign,去實現(xiàn)RPC的調(diào)用, 這個知識點是作為SpringCloud的開發(fā)中最常用的技巧,作為使用SpringCloud進行微服務(wù)開發(fā)的朋友一定要熟練的操作;同時,通過SpringCloud的OpenFeign調(diào)用也就真正拉開了微服務(wù)開發(fā)的序幕,通過OpenFeign就可以把我們多個不同的SpringBoot的微服務(wù)實現(xiàn),集成在一個微服務(wù)的云環(huán)境里面了; 是能說簡單的實現(xiàn)和部署;但是作為一個高可用的微服務(wù)云,我們必須還要考慮到更多更高級的話題,比如負載均衡,服務(wù)熔斷降級,服務(wù)自動發(fā)現(xiàn)等; 今天咱們這個文章就接著上一文,進一步深入來介紹一下咱們的SpringCloud的微服務(wù)云體系里,如何去實現(xiàn)負載均衡這個功能。同樣的,咱們不談以前已經(jīng)不被支持的SpringCloud地鐵站命名的版本,而是討論SpringCloud的最新版本2021.0.X
LoadBalance
翻遍CSDN或者很多的SpringCloud的技術(shù)論壇,甚至很多在論壇里加精的TOP流量的有關(guān)介紹和應(yīng)用SpringCloud的LoadBalance的文章; 都是非常過期的版本,里面使用的都是Netflix的ribbon,作為LoadBalance的實現(xiàn);看到這就是舊版本,因為首先Netflix的Ribbon項目,已經(jīng)不再維護,所以不會再有更新;其次,從SpringCloud2020.0.X版本開始,SpringCloud官方就已經(jīng)宣布不在對Netflix的幾個關(guān)鍵組件進行支持,其中就包括這個Ribbon; SpringCloud官方已經(jīng)公布了自己的loadbalance的組件并進行了開源;所以新的使用SpringCloud的小伙伴們,如何還是用以前的這些文章介紹的方法只為越錯越遠。
LoadBalance和OpenFeign的關(guān)系
如同在上一篇文章發(fā)布以后,一些熱心的朋友的探究一樣; 為什么你介紹OpenFeign的RPC沒有介紹到LoadBalance呀? 有不少的熱心朋友看過上文后,都有這樣的疑問。
這就要給大家叨叨一下了, OpenFeign的定位是annotation化的RESTFUL Client; 認識其本質(zhì)其實OpenFeign是SpringCloud里的RestTemplate更高階的一個升級組件,實現(xiàn)的是Restful Client,但是通過openFeign的一些annotation可以實現(xiàn)的比較簡單化而已;
而LoadBalanace是SpringCloud里的一個Common組件,是可以給其他組件提供服務(wù)的基礎(chǔ)組件; 我們可以看看SpringCloud里產(chǎn)品Map圖里的關(guān)系,就一目了然了。
使用LoadBalance無需OpenFeign的集成, 打開LoadBalance的支持功能,有關(guān)RestTemplate的地方就可以實現(xiàn)客戶端的負載均衡了, OpenFeign是RestTemplate的擴展,當(dāng)然也就同樣可以支持到負載均衡。
細心的朋友可以發(fā)現(xiàn),咱們下面介紹的有關(guān)Loadbalance的使用,基本上都是和OpenFeign沒有任何聯(lián)系的; OpenFeign只是我們后來進行驗證效果的方式;
引入LoadBalance包
引入SpringCloud官方推薦的LoadBalance包
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId> </dependency>加上這段即可開啟RestTemplate的LoadBalance的功能;
使用OpenFeign驗證
驗證OpenFeign的Loadbalance是否啟動;
// after Hystrix is removed from SpringCloud2021.0.1, the fallback is ineffective @FeignClient(name = "${codeman.service.name:codeman}", url = "${codeman.service.address:}", fallback = CodeManFallbackImpl.class) public interface CodeManFeign extends CodeManService {@RequestLine("GET /codeman/info/version")public String getVersion();@RequestLine("GET /codeman/info/author")public String getAuthor();@RequestLine("GET /codeman/info/request/{userid}") //對應(yīng)請求方式和路徑public String requestLine(@Param("userid") String userid);}這里特別注意,要OpenFeign真正的使用到LoadBalance,這個FeignClient的Annotation的Url是不能設(shè)置值的,如果設(shè)置了值,Feign里的LoadBalance將不會生效;即使你的LoadBalance已經(jīng)開啟; 這里不要自做聰明的以為URL就是一個http的連接,url可以是http://xxxx這樣鏈接,也可以是servicename; 在feign某個版本中http://servicename等同于Name=servicename的效果,但是現(xiàn)在沒有這樣的用法了。
為什么URL設(shè)置了不生效, 看OpenFeign的源代碼可知道
沒有Nacos或者Ereuka
上面FeignClient的Name應(yīng)該是微服務(wù)對應(yīng)的serviceName;比如筆者使用的Nacos作為服務(wù)發(fā)現(xiàn)和注冊
但是如果沒有使用Nacos或者Eeruka或者其他的服務(wù)注冊和發(fā)現(xiàn);如何來進行測試或者使用叻;
題外話
在K8s里,很簡單,因為云原生,K8s自帶CoreDns,直接域名基本去做負載均衡實現(xiàn),根本就不在SpringCloud/SpringBoot這層實現(xiàn),故不使用FeignClient的name的annotation,直接使用url對應(yīng)于K8s里的service的域名,即支持了負載均衡,所以這就是為什么說SpringCloud就是玩玩而已,正在的微服務(wù),云原生壓根就不是在springcloud里玩的;
如何解決上面的問題;
Loadbalance提供了SimpleDiscoveryClient實現(xiàn),可以通過yaml配置將IP方式轉(zhuǎn)換為Servicename方式,
spring:cloud:discovery:client:simple:instances:codeman01:- uri: http://localhost:7500- uri: http://localhost:7400如上配置,實際上就產(chǎn)出了一個SimpleDiscoveryClient的實現(xiàn), servicename為codeman01; 兩個地址分別為 http://localhost:7500和 http://localhost:7400
LoadBalance策略配置
默認情況下; LoadBalance的算法策略是RoundRobinLoadBalancer; 可以通過配置或者自行實現(xiàn)的方式,切換成不同的策略; 這里不進行詳細的深入,可以自行查看SpringCloud Load Balance的文檔和代碼樣例。
最后效果
使用Knife4j來進行測試,效果如下
此時,Feign調(diào)用失敗; 調(diào)用的http://localhost:7500; Fallback的效果就是顯示SpringCloud
再次點擊;調(diào)用的http://localhost:7400; 訪問成功; 顯現(xiàn)如下效果
成功調(diào)用,沒有Fallback的調(diào)用
結(jié)束語
本文主要給大家介紹了SpringCloud里的LoadBalance這個組件; OpenFeign通過對LoadBalance的內(nèi)部的集成及調(diào)用;可以使用到LoadBalance的功能, 不過大家要注意的是,新項目一定要進行升級; 就的Netflix的不再支持; 要使用咱們這里的介紹的LoadBalance; 本文僅僅是介紹了LoadBalance, OpenFeign在代碼功能上是如何進行LoadBalance的調(diào)用的,其實還是比較好進行研究的,大家可以自行閱讀OpenFeign的源代碼,幾行代碼即可了解其內(nèi)部實現(xiàn)機理;有興趣的可以回復(fù)中交流; 負載均衡只是實現(xiàn)微服務(wù)體系中的多個高級話題之一,有關(guān)其他的高級應(yīng)用和話題,我們將繼續(xù)在后面的文章中給大家介紹;還請各位朋友積極留言;持續(xù)關(guān)注;
想知悉哪些相關(guān)的技術(shù)點;咱們將進一步用文字來進行探究;
謝謝大家的關(guān)注!!!
總結(jié)
以上是生活随笔為你收集整理的SpringCloud集成LoadBalance,负载均衡的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hbase balance命令相关
- 下一篇: hbase中balance机制