Ribbon進行服務呼叫/負載均衡以及請求重試配置
阿新 • • 發佈:2020-03-03
Ribbon負載均衡
經過對Eureka的認識,及Eureka叢集的搭建,已經基本可以入門Eureka的使用。之前對於服務呼叫者我們是直接獲取註冊列表後通過 get(0) 的方式來獲取第一個註冊資訊。而當我們服務提供者也搭建了叢集之後。這種方式是不可取的。那麼如何選擇一個合適的提供者來提供服務呢?
首先排除我們自己通過硬編碼的方式選。
之前接觸過Zookeeper的朋友應該對負載均衡這個詞不陌生,而Ribbon是另外的一種負載均衡程式,和Eureka同為NetFlix公司開發,且在Eureka客戶端中集成了Ribbon。一般搭配使用。
Ribbon的主要作用
服務呼叫
基礎Ribbon實現的服務呼叫,是通過拉取到所有的服務列表組成(服務名+請求路徑)對映關係,藉助RestTemplate實現呼叫。
注意:
在使用 Ribbon 進行服務呼叫的時候,應用的名稱只能使用 - 中劃線連線,不能使用下劃線。否則服務將無法識別。
- 在注入RestTemplate的同時加上 @LoadBalanced 註解
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
- 服務呼叫的時候,不用再去手動的從列表中獲取服務的請求url,直接使用服務名稱替代之
@GetMapping("teacher/users") public List getAllUser(){ return restTemplate.getForObject("http://SERVICE-PROVIDER/api/v1/users", List.class); }
負載均衡
根據其內建的負載均衡演算法,在有多個服務提供方時,選擇合適的一個。Ribbon提供的負載均衡演算法有:
可通過配置直接修改:
# 可以通過 服務名:ribbon:NFLoadBalancerRuleClassName: 對應的策略全類名
SERVICE-PROVIDER:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
重試機制
除了服務呼叫和負載均衡,Ribbon家族還提供了允許介面呼叫時重試。使用方法如下:
- 匯入重試座標
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
- 在配置檔案中配置相應的引數
spring:
cloud:
loadbalancer:
retry:
enabled: true # 重試功能的開關 預設 true
SERVICE-PROVIDER:
ribbon:
ConnectTimeout: 250 # 與服務提供方建立Http連線的超時時間
ReadTimeout: 1000 # 接收返回資料的超時時間
OkToRetryOnAllOperations: true # 是否對所有操作都進行重試
MaxAutoRetriesNextServer: 1 # 切換例項的重試次數
MaxAutoRetries: 1 # 對當前例項的重試次數(包含第一次請求,即配置1相當於請求超時就切換)
如果按照上面的配置,當消費方向提供方嘗試建立連線後250ms未能成功,就會直接切換至下一個服務方嘗試連線(autoRetries = MaxAutoRetries = 1)。此時如果還失敗(autoRetriesNextServer = MaxAutoRetriesNextServer = 1),則請求失敗。可以根據業務需求進行實際的配