Spring Cloud Ribbon (二)

客戶端負載均衡 Spring Cloud Ribbon

Spring Cloud Ribbon是一個基于HTTP和TCP的客戶端負載均衡工具,它基于Netflix Ribbon實現(xiàn)逊拍,可以將面向服務(wù)的REST模板請求自動轉(zhuǎn)換為客戶端負載均衡的服務(wù)調(diào)用交胚。

1. 客戶端負載均衡

負載均衡在系統(tǒng)架構(gòu)中是一個非常重要且不得不去實施的內(nèi)容。負載均衡是對系統(tǒng)的高可用绊起,網(wǎng)絡(luò)壓力的緩解和處理能力的擴容的重要手段之一精拟。通常所說的負載均衡是指服務(wù)端負載均衡,而客戶端負載均衡和服務(wù)端負載均衡最大的不同點在于服務(wù)清單所存儲的位置虱歪。在客戶端負載均衡中蜂绎,所有的客戶端節(jié)點都維護著自己要訪問的服務(wù)端清單,也需要心跳去維護服務(wù)端清單的健康性实蔽,只是需要與注冊中心配合完成荡碾。

1.1 使用客戶端負載均衡調(diào)用

  • 服務(wù)提供者啟動多個服務(wù)實例并注冊到一個或多個相關(guān)聯(lián)的服務(wù)注冊中心
@Bean
@LoadBelanced
RestTemplate restTemplate() {
  return new RestTemplate();
}
  • 服務(wù)消費者通過調(diào)用被@LoadBalanced注解修飾的RestTemplate來實現(xiàn)面向服務(wù)的接口調(diào)用
@Autowired
private RestTemplate restTemplate;

@RequestMapping(value = "/ribbon-consumer", method = RequestMethod.GET)
public String helloConsumer() {
  return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();
}

1.2 RestTemplate詳解

RestTemplate對象會使用Ribbon的自動化配置,同時通過配置@LoadBalanced開啟客戶端的負載均衡局装。

RestTemplate針對不同請求類型和參數(shù)類型的服務(wù)調(diào)用實現(xiàn)請參見JDK文檔坛吁。

2. 負載均衡策略及配置

2.1 負載均衡策略

在Ribbon中實現(xiàn)了非常多的選擇策略(IRule接口的各個實現(xiàn))

  • RandomRule:隨機選擇策略
    該策略實現(xiàn)了從服務(wù)實例清單中隨機選擇一個服務(wù)實例,具體的選擇邏輯在一個while(server == null)循環(huán)之內(nèi)铐尚,若出現(xiàn)死循環(huán)獲取不到服務(wù)實例時拨脉,很有可能存在并發(fā)的bug。
  • RoundRobinRule:線性輪詢選擇策略
    該策略實現(xiàn)了按照線性輪詢的方式依次選擇每個服務(wù)實例宣增,與隨機策略除獲取實例邏輯不同外玫膀,在循環(huán)條件中新增一個計數(shù)器,當一直獲取不到實例超過10次就會結(jié)束嘗試爹脾。而線性輪詢的實現(xiàn)是通過AtomicInteger nextServerCyclicCounter對象實現(xiàn)帖旨,每次進行實例選擇時調(diào)用incrementAndGetModulo函數(shù)實現(xiàn)遞增箕昭。
  • RetryRule:具備重試機制的選擇策略
    該策略實現(xiàn)了一個具備重試機制的實例選擇,在其內(nèi)部定義了一個IRule對象解阅,默認使用了RoundRobinRule選擇策略落竹。實現(xiàn)了對內(nèi)部選擇策略進行反復嘗試的策略,若期間能選擇到具體服務(wù)實例就返回货抄,否則根據(jù)根據(jù)設(shè)置的嘗試結(jié)束時間為閾值(maxRetryMills參數(shù)定義的值 + choose方法開始執(zhí)行的時間戳)述召,當超過該閾值返回null。
  • WeightResponseTimeRule:加權(quán)選擇策略
    該策略是對RoundRobinRule的擴展蟹地,增加了根據(jù)實例的運行情況來計算權(quán)重积暖,并根據(jù)權(quán)重來挑選實例,它的實現(xiàn)主要有三個核心內(nèi)容怪与。
    1. 定時任務(wù):WeightResponseTimeRule策略在初始化的時候會啟動一個定時任務(wù)夺刑,用來為每個服務(wù)實例計算權(quán)重,該任務(wù)默認每30秒執(zhí)行一次
    2. 權(quán)重計算:通過maintainWeights函數(shù)實現(xiàn)琼梆。先根據(jù)LoadBalancerStats記錄每個實例的統(tǒng)計信息性誉,累加所有實例的平均響應(yīng)時間得到總平均響應(yīng)時間totalResponseTime,再為實例清單逐個計算權(quán)重茎杂,規(guī)則為 weightSoFar + totalResponseTime - 實例平均響應(yīng)時間错览,其中weightSoFar初始化為0,且每計算好幾個權(quán)重需要累加到weightSoFar上供下一次計算使用煌往。需要注意的是權(quán)重值只是表示各實例的權(quán)重區(qū)間倾哺,并非每個實例的優(yōu)先級,因此不是數(shù)值越大選中概率越大刽脖。
    3. 實例選擇:生成[0, 最大權(quán)重值)區(qū)間的隨機數(shù)羞海,遍歷權(quán)重列表,若權(quán)重值大于等于隨機數(shù)則用當前權(quán)重列表的索引獲取服務(wù)實例曲管。
  • BestAvailableRule:最空閑連接
    該策略利用LoadBalancerStats中保存的實例統(tǒng)計信息却邓,通過遍歷負載均衡器中維護的所有服務(wù)實例,過濾故障的實例并找出請求數(shù)最小的實例院水。

2.2 負載均衡配置

2.2.1 自動化配置

? 在引入Spring Cloud Ribbon依賴后腊徙,構(gòu)建以下接口的實現(xiàn)

interface description default
IClientConfig Ribbon客戶端配置 com.netflix.client.config.DefaultClientConfigImpl
IRule Ribbon負載均衡策略 com.netflix.loadbalancer.ZoneAvoidanceRule
IPing Ribbon實例檢查策略 com.netflix.loadbalancer.NoOpPing
ServerList<Server> 服務(wù)實例清單維護機制 com.netflixloadbalancer.ConfigurationBasedServerList
ServerListFilter<Server> 服務(wù)實例清單過濾機制 org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter
ILoadBalancer 負載均衡器 com.netflix.loadbalancer.ZoneAwareLoadBalancer

修改Ribbon實例檢查策略示例

@Configuration
public class MyRibbonConfiguration {

  @Bean
  public IPing ribbonPing(IClientConfig config) {
    return new PingUrl();
  }
}

2.2.2 Camden版本對RibbonClient配置優(yōu)化

在Camden版本中,Spring Cloud Ribbon對RibbonClient定義個性化配置的方法做了進一步優(yōu)化檬某∏颂冢可以直接通過<clientName>.ribbon.<key>=<value>的形式進行配置(<clientName>.可省略表示全局配置)。配置名配置的對應(yīng)接口

key description
NFLoadBalancerPingClassName 配置IPing接口的實現(xiàn)
NFLoadBalancerClassName 配置ILoadBalancer接口的實現(xiàn)
NFLoadBalancerRuleClassName 配置IRule接口的實現(xiàn)
NIWSServerListClassName 配置ServerList接口的實現(xiàn)
NIWSServerListFilterClassName 配置ServerListFilter接口的實現(xiàn)

修改Ribbon實例檢查策略示例
服務(wù)名.ribbon.NFLoadBalancerPingClassName=com.netflix.loadbalancer.PingUrl

2.2.3 與Eureka結(jié)合

當在Spring Cloud的應(yīng)用中同時引入Spring Cloud Ribbon和Spring Cloud Eureka依賴時恢恼,會觸發(fā)Eureka中實現(xiàn)的對Ribbon的自動化配置民傻。在與Spring Cloud Eureka結(jié)合使用時,配置將更加簡單,不在需要需要通過類似<clientName>.ribbon.<key>=<value>的參數(shù)指定具體的服務(wù)實例清單漓踢。而對于Ribbon的參數(shù)配置牵署,依然可使用2.2.2中的兩種配置方式,對于客戶端的配置方式可直接使用Eureka中的服務(wù)名作為<client>完成針對某個微服務(wù)的個性配置喧半。

Spring Cloud Ribbon默認實現(xiàn)了區(qū)域親和策略碟刺,可以通過Eureka實例的元數(shù)據(jù)配置來實現(xiàn)區(qū)域化的實例配置方案。
如:eureka.instance.metadataMap.zone=shanghai

在Spring Cloud Ribbon和Spring Cloud Eureka結(jié)合的工程中,可以通過參數(shù)配置的方式禁用Eureka對Ribbon服務(wù)實例的維護實現(xiàn)薯酝。
如:ribbon.eureka.enabled=false

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爽柒,隨后出現(xiàn)的幾起案子吴菠,更是在濱河造成了極大的恐慌,老刑警劉巖浩村,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件做葵,死亡現(xiàn)場離奇詭異,居然都是意外死亡心墅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲁沥,“玉大人堤魁,你說我怎么就攤上這事☆硪Γ” “怎么了策肝?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長隐绵。 經(jīng)常有香客問我之众,道長,這世上最難降的妖魔是什么依许? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任棺禾,我火速辦了婚禮,結(jié)果婚禮上峭跳,老公的妹妹穿的比我還像新娘膘婶。我一直安慰自己,他們只是感情好坦康,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布竣付。 她就那樣靜靜地躺著,像睡著了一般滞欠。 火紅的嫁衣襯著肌膚如雪古胆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音逸绎,去河邊找鬼惹恃。 笑死,一個胖子當著我的面吹牛棺牧,可吹牛的內(nèi)容都是我干的巫糙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颊乘,長吁一口氣:“原來是場噩夢啊……” “哼参淹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乏悄,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浙值,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后檩小,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體开呐,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年规求,在試婚紗的時候發(fā)現(xiàn)自己被綠了筐付。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡阻肿,死狀恐怖瓦戚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冕茅,我是刑警寧澤伤极,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站姨伤,受9級特大地震影響哨坪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乍楚,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一当编、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧徒溪,春花似錦忿偷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渠概,卻和暖如春茶凳,著一層夾襖步出監(jiān)牢的瞬間嫂拴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工贮喧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留筒狠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓箱沦,卻偏偏與公主長得像辩恼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谓形,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355