Ribbon

在springcloud中,引入Ribbon來(lái)作為客戶(hù)端時(shí)蚊丐,負(fù)載均衡使用的是被@LoadBalanced修飾的RestTemplate對(duì)象诈泼。

RestTemplate詳細(xì)的用法

  • GET請(qǐng)求

第一種方式
返回ResponseEntity膝迎,該對(duì)象是Spring對(duì)HTTP請(qǐng)求響應(yīng)的封裝攘须,其中主要存儲(chǔ)了HTTP的幾個(gè)重要元素,HttpStatus代表了錯(cuò)誤碼如404,500等圣贸。以及HttpHeaders代表了請(qǐng)求頭挚歧,body代表了接收到的對(duì)象,其類(lèi)型是根據(jù)第二個(gè)參數(shù)決定的吁峻。第一個(gè)url為請(qǐng)求地址昼激,可以使用{1}占位符庇绽,而參數(shù)的值在該方法的最后的可變參數(shù)。

ResponseEntity<String> forEntity = restTemplate.getForEntity("http://eureka-client/hello",String.class);
String body = forEntity.getBody();
HttpHeaders headers = forEntity.getHeaders();
HttpStatus statusCode = forEntity.getStatusCode();

三個(gè)重載方法:

getForEntity(String url,Class responseType,Object... urlVariables);
getForEntity(String url,Class responseType,Map urlVariables);
getForEntity(URI url,Class responseType);

第二種方式

String forObject = restTemplate.getForObject("http://eureka-client/hello", String.class);

第二種方式與第一種方式唯一的不同就是getForObject的返回值類(lèi)型直接就是參數(shù)列表的第二個(gè)參數(shù)指定的類(lèi)型橙困,所以這種方式?jīng)]法獲取錯(cuò)誤碼和請(qǐng)求頭等信息瞧掺。

RestTemplate本來(lái)是Spring提供的發(fā)送REST請(qǐng)求的工具類(lèi),但是當(dāng)其被@LoadBalanced注解修飾后凡傅,通過(guò)其發(fā)送REST請(qǐng)求辟狈,會(huì)被LoadBalanceInterceptor類(lèi)的inteceptor攔截,然后進(jìn)行一些負(fù)載均衡和請(qǐng)求地址的轉(zhuǎn)換夏跷。

負(fù)載均衡策略

通過(guò)繼承AbstractLoadBalancerRule抽象類(lèi)來(lái)具體實(shí)現(xiàn)負(fù)載均衡策略哼转。
RandomRule
通過(guò)隨機(jī)服務(wù)實(shí)例的數(shù)量來(lái)產(chǎn)生一個(gè)隨機(jī)數(shù),通過(guò)索引獲取該服務(wù)實(shí)例

RoundRobinRule
按照線(xiàn)性輪詢(xún)的方式依次選擇每個(gè)服務(wù)實(shí)例的功能
RetryRule
該策略實(shí)現(xiàn)了一個(gè)具備重試機(jī)制的實(shí)例選擇功能槽华。其內(nèi)部還定義了一個(gè)IRule對(duì)象壹蔓,默認(rèn)使用RoundRobinRule實(shí)例。在choose方法中則實(shí)現(xiàn)了對(duì)內(nèi)部定義的策略進(jìn)行反復(fù)嘗試的策略猫态,若期間能夠選擇到具體的服務(wù)實(shí)例就返回佣蓉,若選擇不到就根據(jù)設(shè)置的嘗試結(jié)束時(shí)間為閥值(maxRetryMillis參數(shù)定義的值+choose方法開(kāi)始執(zhí)行是的時(shí)間戳),當(dāng)超過(guò)該值后就返回null
WeightedResponseTimeRule
該策略是對(duì)RoundRobinRule的擴(kuò)展亲雪,增加了根據(jù)實(shí)例的運(yùn)行情況來(lái)計(jì)數(shù)權(quán)重勇凭,并根據(jù)權(quán)重來(lái)挑選實(shí)例。該策略實(shí)例化的時(shí)候在內(nèi)部創(chuàng)建了一個(gè)定時(shí)任務(wù)义辕,每過(guò)30s便去統(tǒng)計(jì)一下各個(gè)實(shí)例的權(quán)重虾标。
ClientConfigEnableRoundRobinRule
該策略較為特殊,一般不直接使用它灌砖。該策略?xún)?nèi)部定義了一個(gè)RoundRobinRule策略璧函,choose函數(shù)的實(shí)現(xiàn)也是使用了RoundRobinRule的線(xiàn)下輪詢(xún)機(jī)制。一般使用方法:繼承該策略基显,默認(rèn)的choose方法實(shí)現(xiàn)了線(xiàn)性輪詢(xún)機(jī)制柳譬,在子類(lèi)中做一些高級(jí)策略時(shí)通常可能會(huì)存在一些無(wú)法實(shí)施的情況续镇,那么就可以用父類(lèi)的實(shí)現(xiàn)作為備選。
BestAvailableRule
該策略繼承ClientConfigEnableRoundRobinRule销部,在實(shí)現(xiàn)中它注入了負(fù)載均衡器的統(tǒng)計(jì)對(duì)象LoadBalancerStats摸航,同時(shí)在具體的choose算法中利用LoadBalancerStats保存的實(shí)例統(tǒng)計(jì)信息來(lái)滿(mǎn)足要求的實(shí)例。它通過(guò)遍歷負(fù)載均衡器中維護(hù)的所有服務(wù)實(shí)例舅桩,會(huì)過(guò)濾掉故障的實(shí)例酱虎,并找出并發(fā)請(qǐng)求數(shù)最少的一個(gè),所以該策略的特性是可選出最空閑的實(shí)例擂涛。
PredicateBasedRule
抽象策略读串,繼承了ClientConfigEnableRoundRobinRule,基于Predicate實(shí)現(xiàn)的策略,Predicate是Google Guava Collection工具對(duì)集合進(jìn)行過(guò)濾的條件接口恢暖,策略:先過(guò)濾清單排监,在輪詢(xún)選擇

AvailableFilteringRule
繼承自PredicationBasedRule

ZoneAvoidanceRule
繼承自PredicationBasedRule

重試

spring cloud eureka比較注重可用性,所以在極端情況下杰捂,它寧愿接收故障實(shí)例也不會(huì)丟掉“健康”實(shí)例舆床,比如當(dāng)服務(wù)注冊(cè)中心的網(wǎng)絡(luò)發(fā)生故障斷開(kāi)時(shí),由于所有的服務(wù)實(shí)例無(wú)法持續(xù)維持心跳嫁佳,一般的服務(wù)治理會(huì)將所有的服務(wù)實(shí)例剔除挨队,但是eureka則會(huì)因?yàn)槌^(guò)85%的實(shí)例丟失心跳而觸發(fā)保護(hù)機(jī)制,注冊(cè)中心將會(huì)保留此時(shí)的所有節(jié)點(diǎn)蒿往,以實(shí)現(xiàn)服務(wù)間依然可以進(jìn)行互相調(diào)用的場(chǎng)景盛垦,即使其中有部分故障節(jié)點(diǎn),但這樣做可以繼續(xù)保障大多數(shù)的服務(wù)正常消費(fèi)瓤漏。
由于spring cloud eureka咋可用性與一致性上的取舍腾夯,所以我們?cè)趯?shí)現(xiàn)服務(wù)調(diào)用的時(shí)候通常會(huì)加入一些重試機(jī)制。spring cloud 整合了spring retry來(lái)增強(qiáng)RestTemplate的重試能力赌蔑,只需通過(guò)簡(jiǎn)單的配置俯在,原來(lái)那些通過(guò)RestTemplate實(shí)現(xiàn)的服務(wù)訪問(wèn)就會(huì)自動(dòng)根據(jù)配置來(lái)實(shí)現(xiàn)重試策略。

spring.cloud.loadbalancer.retry.enabled=true
#開(kāi)啟重試機(jī)制
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
#斷路器的超時(shí)時(shí)間需要大于Ribbon的超時(shí)時(shí)間娃惯,不然不會(huì)觸發(fā)重試
eureka-consumer.ribbon.ConnectTimeout=250
#請(qǐng)求連接的超時(shí)時(shí)間
eureka-consumer.ribbon.ReadTimeout=1000
#請(qǐng)求處理的超時(shí)時(shí)間
eureka-consumer.ribbon.OkToRetryOnAllOperations=true
#對(duì)所有操作請(qǐng)求都進(jìn)行重試
eureka-consumer.ribbon.MaxAutoRetriesNextServer=2
#切換實(shí)例的重試次數(shù)
eureka-consumer.ribbon.MaxAutoRetries=1
#對(duì)當(dāng)前實(shí)例的重試次數(shù)

當(dāng)訪問(wèn)到故障請(qǐng)求的時(shí)候跷乐,它會(huì)在嘗試訪問(wèn)一次當(dāng)前實(shí)例(次數(shù)由MaxAutoRetries配置),如果不行趾浅,就換一個(gè)實(shí)例進(jìn)行訪問(wèn)愕提,如果還是不行,在換一次實(shí)例訪問(wèn)(更換次數(shù)由MaxAutoRetriesNextServer配置)皿哨,如果依然不行浅侨,在返回失敗信息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末证膨,一起剝皮案震驚了整個(gè)濱河市如输,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌央勒,老刑警劉巖不见,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異崔步,居然都是意外死亡稳吮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)井濒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)灶似,“玉大人列林,你說(shuō)我怎么就攤上這事±也眩” “怎么了希痴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)撞蚕。 經(jīng)常有香客問(wèn)我润梯,道長(zhǎng),這世上最難降的妖魔是什么甥厦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任纺铭,我火速辦了婚禮,結(jié)果婚禮上刀疙,老公的妹妹穿的比我還像新娘舶赔。我一直安慰自己,他們只是感情好谦秧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布竟纳。 她就那樣靜靜地躺著,像睡著了一般疚鲤。 火紅的嫁衣襯著肌膚如雪锥累。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天集歇,我揣著相機(jī)與錄音桶略,去河邊找鬼。 笑死诲宇,一個(gè)胖子當(dāng)著我的面吹牛际歼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播姑蓝,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鹅心,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了纺荧?” 一聲冷哼從身側(cè)響起旭愧,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宙暇,沒(méi)想到半個(gè)月后输枯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡客给,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肢簿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靶剑。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜻拨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桩引,到底是詐尸還是另有隱情缎讼,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布坑匠,位于F島的核電站血崭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏厘灼。R本人自食惡果不足惜夹纫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望设凹。 院中可真熱鬧舰讹,春花似錦、人聲如沸闪朱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奋姿。三九已至锄开,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間称诗,已是汗流浹背萍悴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粪狼,地道東北人退腥。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像再榄,于是被迫代替她去往敵國(guó)和親狡刘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容