在上面的示例中,如果註冊了多個 user-service 服務,那麼在客戶端進行呼叫的時候如何來選擇服務呢?這時就需要客戶端來進行負載均衡。而在 springcloud 中,一般推薦使用ribbon 來實現負載均衡。
robbin 是 netflix 發布的乙個負載均衡器,在 springcloud 中,eureka 一般都是和 ribbon 一起使用。eureka 負責服務的註冊與發現,而 ribbon 則提供了客戶端負載均衡的功能。
加入 robbin 負載均衡之後工程架構如下圖所示:
啟動兩個 user-service 例項。分別使用埠:8080,8090。
啟動完成之後,檢視 eureka 的監控介面如下所示:
1、ribbon 依賴
在 consumer 專案中增加對 ribbon 的依賴。
<
!--增加對 ribbon 的依賴--
>
org.springframework.cloud<
/groupid>
spring-cloud-starter-netflix-ribbon<
/artifactid>
<
/dependency>
但是在 eureka 中已經包含了對 ribbon 的依賴,所以上面的依賴可以省略。
2、在 consumer 的 resttemplate 配置方法上新增註解:@loadbalanced
啟動類:
@enablediscoveryclient
public
class
public
static
void
main
(string[
] args)
}(value=
"/detail/"
public user customer
(@pathvariable
("id"
)string id)
在上面的示例中,使用 robbin 來負責負載均衡問題,但是並沒有去設定如何負載均衡的。那麼預設情況下,將使用輪詢的策略。
在 robbin 中,負責負載均衡的頂層介面為:com.netflix.loadbalancer.irule。所有的負載均衡演算法都是實現的這個介面。
1、預設負載均衡策略:
2、常用負載均衡策略:
userservice: # 配置服務的負載均衡
ribbon:
nfloadbalancerruleclassname: com.netflix.loadbalancer.randomrule
如果在系統執行過程中,服務如果掛掉乙個,那麼 eureka 並不會馬上將失效的服務剔除。那麼 consumer 也不會馬上獲取到最新的服務列表,那麼如果這個時候呼叫了失效的服務就會出現錯誤。然而這個時候還有正常的服務能夠為其提供服務。
所以,springcloud 整合了 spring retry 來增強 resttemplete 的重試能力。當一次服務呼叫失敗後,不會立即丟擲異常,而是再次重試另乙個服務。具體操作如下:
1、在 consumer 中加入 retry 的依賴
<
!-- 重試依賴 --
>
org.springframework.retry<
/groupid>
spring-retry<
/artifactid>
<
/dependency>
2、在 consumer 中加入如下配置
userservice:
ribbon:
# nfloadbalancerruleclassname: com.netflix.loadbalancer.randomrule
connecttimeout:
250 # ribbon 的連線超時時間
readtimeout:
1000 # ribbon 的資料讀取超時時間
oktoretryonalloperations:
true # 是否對所有操作都進行重試
maxautoretriesnextserver:
1 # 切換例項的重試次數
maxautoretries:
1 # 對當前例項的重試次數
logging:
level:
root: debug #方便檢視呼叫日誌
從0開始構建SpringCloud微服務 1
照例附上專案github鏈結 本專案實現的是將乙個簡單的天氣預報系統一步一步改造成乙個springcloud微服務系統的過程,第一節將介紹普通天氣預報系統的簡單實現。資料 1 深圳 資料 2 資料 3 根據返回的資料格式在vo包下面建立pojo。建立weatherdataservice在其中提供如下...
從0開始構建SpringCloud微服務 1
照例附上專案github鏈結 本專案實現的是將乙個簡單的天氣預報系統一步一步改造成乙個springcloud微服務系統的過程,第一節將介紹普通天氣預報系統的簡單實現。資料 1 深圳 資料 2 資料 3 根據返回的資料格式在vo包下面建立pojo。建立weatherdataservice在其中提供如下...
從0開始構建SpringCloud微服務 1
照例附上專案github鏈結 本專案實現的是將乙個簡單的天氣預報系統一步一步改造成乙個springcloud微服務系統的過程,第一節將介紹普通天氣預報系統的簡單實現。資料 1 深圳 資料 2 資料 3 根據返回的資料格式在vo包下面建立pojo。建立weatherdataservice在其中提供如下...