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