日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringCloud Ribbon源码探索学习

發布時間:2025/4/5 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringCloud Ribbon源码探索学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Ribbon使用

在平時使用Ribbon時,更多的是將Ribbon與RestTemplate相結合:

@Bean@LoadBalancedRestTemplate restTemplate(){return new RestTemplate();} 復制代碼

首先定義一個RestTemplate,通過注解注入,同時注解也完成了負載均衡。

同時去使用restTemplate進行Rest調用

@Overridepublic String hiService(String name){return restTemplate.getForObject("http://SERVER-HI/hi?name="+name,String.class);} 復制代碼

那么在我們在輸入http://localhost:8770/hi?name=lixin后,到底做了什么

一、封裝

首先,在進行getForObject方法后,會將帶入的url進行封裝,封裝成http請求request,然后被攔截器LoadBalancerInterceptor進行攔截,代碼分別是:

@Override@Nullablepublic <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);HttpMessageConverterExtractor<T> responseExtractor =new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);return execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);} 復制代碼

二、攔截

以及攔截部分:將request攔截下,截取其中URL及服務名,用于之后調用負載均衡方法時,選擇合適的服務實例

@Overridepublic ClientHttpResponse intercept(final HttpRequest request, final byte[] body,final ClientHttpRequestExecution execution) throws IOException {final URI originalUri = request.getURI();String serviceName = originalUri.getHost();Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);return this.loadBalancer.execute(serviceName, requestFactory.createRequest(request, body, execution));} 復制代碼

三、根據負載均衡器調用服務實例

至此,調用RibbonLoadBalancerClient中的execute方法,先查看一下RibbonLoadBalancerClient類:

其中LoadBalancerClient接口,有如下三個方法,其中excute()為執行請求,reconstructURI()用來重構url。

ServiceInstanceChooser接口,主要有一個方法,用來根據serviceId來獲取ServiceInstance。

它繼承了ServiceInstanceChooser及LoadBalancerClient類,最終的負載均衡的請求處理,由它來執行

首先,去獲取需要加載的負載均衡策略,通過getLoadBalancer方法執行,默認是輪詢RoundRobbinRule方式:

在獲取到負載均衡策略之后,通過getServer()方法去獲取實例,點擊進入getServer方法,發現是ILoadBalancer類去選擇服務實例。

在ILoadBalancer接口中,addServers()方法是添加一個Server集合;chooseServer()方法是根據key去獲取Server;markServerDown()方法用來標記某個服務下線;getReachableServers()獲取可用的Server集合;getAllServers()獲取所有的Server集合。

chooseServer則是由BaseLoadBalancer類進行實現:

根據代碼可以看出,具體choose方法是根據不同的負載均衡策略,會有不同的選擇方法,返回具體根據策略得到的服務實例。

最后根據服務實例,進行請求的調用。

負載均衡策略

IRule用于復雜均衡的策略,它有三個方法,其中choose()是根據key 來獲取server,setLoadBalancer()和getLoadBalancer()是用來設置和獲取ILoadBalancer的

IRule有很多默認的實現類,這些實現類根據不同的算法和邏輯來處理負載均衡。Ribbon實現的IRule有以下幾個。在大多數情況下,這些默認的實現類是可以滿足需求的,如果有特性的需求,可以自己實現。

  • BestAvailableRule 選擇最小請求數
  • ClientConfigEnabledRoundRobinRule 輪詢
  • RandomRule 隨機選擇一個server
  • RoundRobinRule 輪詢選擇server
  • RetryRule 根據輪詢的方式重試
  • WeightedResponseTimeRule 根據響應時間去分配一個weight ,weight越低,被選擇的可能性就越低
  • ZoneAvoidanceRule 根據server的zone區域和可用性來輪詢選擇

RoundRobbinRule

那我們就先看看RoundRobbinRule類中的輪詢策略:

①首先獲取所有存活的服務列表reachableServers及所有服務列表allServers,判斷兩個list是否為空。 ②incrementAndGetModulo中則是對一個原子性變量進行+1操作,并同時進行一個CAS操作,去修改nextServerIndex值,保證輪詢的可靠性。
③最后判斷服務是否可用,如果不可用,則重新進入循環。
④如果在10次循環后,仍然沒有可用的服務,則退出循環并進行警告。最后返回服務實例

RetryRule

可重試的輪詢策略如下:

可見此處多了兩行代碼:

long requestTime = System.currentTimeMillis(); long deadline = requestTime + maxRetryMillis; 復制代碼

定義了500ms的總重試時間,如果服務實例獲取不到,則進入循環,在循環中每次需要判斷一下是否超過總時間

if判斷中,嵌套了一個定時任務,去判斷是否達到預定時間,如果達到了,則對當前線程進行interrupt()操作

while循環中,每次都會去獲取一下服務實例,然后進行判斷,如果實例仍然沒有獲取到,則對當前線程進行Thread.yield()操作,此操作的意義是:讓出當前線程時間分片,重新爭奪時間片,讓定時任務去執行,看是否達到規定時間,如到時間,則執行interrupt()操作,退出循環

這即是可重試的策略

總體流程

Ribbon + RestTemplate 的負載平衡,流程是: 通過注解后,對url進行封裝request,攔截器對request進行攔截,然后根據負載均衡器去調用服務實例,完成負載平衡和服務調用

總結

以上是生活随笔為你收集整理的SpringCloud Ribbon源码探索学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩a级在线观看 | 777久久久 | 韩国三级av | 奇米影视色| 天堂成人 | 亚洲成人黄色网 | 国产色综合视频 | 俄罗斯毛片基地 | 精品免费国产一区二区三区四区 | 国产视频在线看 | 天堂激情网| 天天搞天天 | 欧美顶级黄色大片免费 | 亚洲午夜久久久久 | 成人自拍视频网站 | 操操插插| 午夜在线观看视频 | 欧美videossex极品 | 91精彩视频 | 91看片淫黄大片 | 色婷婷av一区二区三区大白胸 | 欧美一级免费黄色片 | 欧美不卡一区 | 四虎4hu永久免费网站影院 | 欧美性做爰毛片 | 欧美一区二区 | 日韩中文在线观看 | 亚洲精品www久久久久久 | 亚洲高清网 | 男女男精品视频 | 老师上课夹震蛋高潮了 | 国产一区二区在线免费观看 | 亚洲精品日韩在线 | 国产精品色综合 | 高潮一区二区 | 日日干夜夜艹 | 51热门大瓜今日大瓜 | 又色又爽又高潮免费视频国产 | 久久婷婷五月综合色国产香蕉 | 国产精品久久久免费 | 夜色导航 | 亚洲在线免费 | 黄色三级带 | 青青草免费观看视频 | 日韩在线导航 | 精品人妻aV中文字幕乱码色欲 | 黄色一级视频网站 | 成人片免费视频 | 免费福利小视频 | 国产福利在线播放 | 天堂在线免费观看视频 | 久久精品无码专区免费 | 久久日本精品字幕区二区 | 动漫精品一区二区三区 | 手机av中文字幕 | 91久久精品一区二区 | 亚洲精品色图 | 美女扒开尿口让男人爽 | 久久久久久久久久久久久女国产乱 | 又色又爽又黄18网站 | 操欧美美女 | 精品一区二区三区免费观看 | 日韩网站视频 | 天天操天天操天天操天天操天天操 | 影音先锋亚洲资源 | 亚洲搞av | 狠狠婷婷 | 国产不卡在线 | 国产精品国产三级国产播12软件 | 91小视频| 成人片黄网站色大片免费毛片 | 天天色棕合合合合合合合 | 国产嫩草影视 | 四川丰满妇女毛片四川话 | 精品国产亚洲一区二区麻豆 | 成人av播放 | 国产一区二区三区色淫影院 | 久久久久久久久久久网 | 成年人在线观看视频免费 | www.99av| 国产精品久久无码一三区 | 欧美国产高潮xxxx1819 | 亚洲tv在线观看 | 国产热99| 午夜一区二区三区免费观看 | 亚洲天堂午夜 | 97视频久久 | 亚洲清纯唯美 | 日韩天堂在线观看 | 欧美xxxxbbb| 精品国产一区二区三区久久久久久 | 中文字幕一区二区人妻 | 午夜天堂在线 | 日韩精品一区二区电影 | 又黄又骚又爽 | 一区二区三区四区国产 | 成人在线视频一区二区三区 | 色多多入口 | 黄色网www |