天天看點

用戶端負載均衡Ribbon

一、Ribbon是什麼

二、Ribbon實作用戶端負載均衡

三、Ribbon負載均衡政策

四、Rest請求模闆類解讀

4.1 RestTemplate的GET請求

第一種:getForEntity(..)

第二種:getForObject(..)

4.2 RestTemplate的POST請求

4.3 RestTemplate的PUT請求

4.4 RestTemplate的DELETE請求

相關内容原文位址:

CSDN:Coding Farmer:Spring Cloud快速開發入門第四篇—用戶端負載均衡Ribbon

Ribbon是一個基于HTTP和TCP的用戶端負載均衡器,當使用Ribbon對服務進行通路的時候,他會擴充Eureka用戶端的服務發現功能,實作從Eureka注冊中心擷取服務端清單,并通過Eureka用戶端來确定服務端是否已經啟動。Ribbon在Eureka用戶端服務發現的基礎上,實作對服務執行個體的選擇政策,進而實作對服務的負載均衡消費。負載均衡在系統架構中是一個非常重要的内容,因為負載均衡是對系統的高可用、網絡的壓力的緩沖和處理能力擴容的重要手段之一,我們通常說的負載均衡都是指的是服務端的負載均衡,其中分為硬體負載均衡和軟體負載均衡。

硬體負載均衡:主要通過伺服器節點之間安裝專門用于負載均衡的裝置,比如F5,深信服,Array等。

軟體負載均衡:則是通過伺服器上安裝一些具有負載功能或子產品的軟體來完成請求分發工作,比如Nginx、LVS、HAProxy等。

硬體負載均衡的裝置或是軟體負載均衡的軟體子產品都會維護一個下挂可用的服務端清單,通過心跳檢測來剔除故障的服務端節點保證清單中都是可以正常通路的服務端節點。當用戶端發送請求到負載均衡的裝置時候,該裝置按某種算法(比如線性輪詢、按權重負載、按流量負載等)從維護的可用服務端清單中取出一台服務端位址,然後進行轉發。

Ribbon是Netflix釋出的開源項目,主要功能是提供用戶端的軟體負載均衡算法,是一個基于HTTP和TCP的用戶端負載均衡工具。Spring Cloud對Ribbon做了二次封裝,可以讓我們使用 RestTemplate的服務請求,自動轉換成用戶端負載均衡的服務調用。Ribbon支援多種負載均衡算法,還支援自定義的負載均衡算法。Ribbon隻是一個工具類架構,比較小巧, Spring Cloud對它封裝後使用也非 常友善,它不像服務注冊中心、配置中心、AP網關那樣需要獨立部署, Ribbon 隻需要在代碼直接使用即可。

Ribbon與 Nginx的差別:

都是軟負載

Ribbon是用戶端負載均衡

Nginx是伺服器段負載均衡

服務清單所存儲的位置不同,在用戶端負載均衡中,所有用戶端節點下的服務端清單,需要自己從服務注冊中心上擷取,比如Eureka服務注冊中心。同服務端負載均衡的架構類似,在用戶端負載均衡中也需要心跳去維護服務端清單的健康性,隻是這個步驟需要與服務注冊中心配合完成,在SpringCloud實作的服務治理架構中,預設會建立針對各個服務治理架構到的Ribbon自動化整合配置,比如Eureka中的org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,在實際使用的時候,我們可以通過檢視這個類的實作,以找到他們的配置詳情來幫助我們更好的使用它。

通過Spring Cloud Ribbon的封裝,我們在微服務架構中使用用戶端負載均衡調用非常的簡單,隻需要如下兩步:

服務提供者隻需要啟動多個服務執行個體并注冊到一個注冊中心或是多個相關聯的服務注冊中心上

服務消費者直接通過調用被@LoadBalanced注解修飾過的RestTemplate來實作面向服務的接口調用。

服務端的負載均衡是提前配置好的:Nginx

用戶端的負載均衡是從注冊中心找的:Ribbon

在SpringCloud中,Ribbon主要與RestTemplate對象配合使用,Ribbon會自動化配置RestTemplate對象,通過@LoadBalance開啟RestTemplate對象調用時的負載均衡,Ribbon所處的作用如圖:

在微服務架構中使用用戶端負載均衡調用:

複制服務提供者(springcloud-service-provider)并且命名為springcloud-service-provider-02,修改controlle響應結果内容,差別一服務提供者(springcloud-service-provider)内容。修改服務提供者(springcloud-service-provider-02)端口為8081

在消費者的RestTemplate中添加如下代碼:

檢視Eureka的web頁面顯示提供者兩個執行個體:

啟動消費者,進行通路如圖:

用戶端負載均衡Ribbon

provider-01和provider-02交替出現,可以看出預設是輪詢政策。

Ribbon的負載均衡政策是由IRule接口定義,該接口由如下實作:

用戶端負載均衡Ribbon

IRule實作類的負載政策含義

屬性

含義

RandomRule

随機

RoundRobinRule

輪詢

AvailabilityFilteringRule

先過濾掉由于多次通路故障的服務,以及并發連接配接數超過閥值的服務,然後對剩下的服務按照輪詢政策進行通路

WeightedResponseTimeRule

根據平均響應時間計算所有服務的權重,響應時間越快服務權重就越大被選中的機率即越高,如果服務剛啟動時間統計資訊不足,,則使用RoundRobinRule政策,待統計資訊足夠,會切換到該WeightedResponseTimeRule政策

RetryRule

先按照RoundRobinRule政策分發,如果分發到的服務不能通路,則在指定的時間内重試,如果不行的話,則分發到其他可用的服務

BestAvailableRule

先過濾掉由于多次通路的故障的服務,然後選擇一個并發量最小的服務

ZoneAvoidanceRule

綜合判斷服務節點所在區域的性能和服務節點的可用性,來決定選擇哪個服務

結合Ribbon負載均衡,預設的是輪詢,重新注入IRule可以實作負載均衡的其他政策。

用戶端負載均衡Ribbon

當我們從服務消費端去調用服務提供者的服務的時候,使用了一個極其友善的對 象叫 RestTemplate,當時我們隻使用了 Rest Template中最簡單的一個功能 getForEntity發起了一個get請求去調用服務端的資料,同時,我們還通過配置@ Loadbalanced注解開啟用戶端負載均衡, RestTemplate的功能非常強大, 那麼接下來就來詳細的看一下 RestTemplate中幾種常見請求方法的使用。 在日常操作中,基于Rest的方式通常是四種情況,它們分表是

GET請求-查詢資料

POST請求-添加資料

PUT請求-修改資料

DELETE-删除資料

Get請求可以有兩種方式:

該方法傳回一個ResponseEntity對象,ResponseEntity是Spring對HTTP請求響應的封裝,包括了幾個重要的元素,比如響應碼,contentType,contentLength,響應消息體等。

getForEntity方法第—個參數為要調用的服務的位址,即服務提供者提供的http://SPRINGCLOUD-SERVICE-PROVIDER/provider/hello接口位址,注意這裡是通過服務名調用而不是服務位址,如果改為服務位址就無法使用 Ribbon實作用戶端負載均衡了。 getForEntity方法第二個參數 String.class表示希望傳回的body類型是 String 類型,如果希望傳回一個對象,也是可以的,比如User對象。

另外兩個重載方法:

第一個重載方法:

比如:

可以用一個數字做占位符,最後是一個可變長度的參數,來來替換前面的占位符

也可以前面使用name={name}這種形式,最後一個參數是一個map,map的key即為前邊占位符的名字,map的value為參數值

與 getForEntity使用類似,隻不過 getForobject是在 getForEntity基礎上進行了再次封裝,可以将http的響應體body 資訊轉化成指定的對象,友善我們的代碼開發: 當你不需要傳回響應中的其他資訊,隻需要body體資訊的時候,可以使用這個更友善; 它也有兩個重載的方法,和 getForEntity相似。

繼續閱讀