歡迎來到SpringCloud的江湖,在本章中,我們將向大家傳授如何創建SpringCloud的父子項目架構。
知識無止境,故事有好壞,文章純屬虛構,歡迎大家吐槽。
行走江湖,沒點伎倆傍身怎麼能行。本章牽扯到的技術以及工具如下:
Intellij Idea 2018.1
JDK 8
MAVEN 3.2.2
SpringBoot 1.5.13.RELEASE
Spring-Cloud Edgware.SR3
Fegin聲明式調用
Ribbon負載均衡
Hystrix熔斷器
前面我們分別介紹了Fegin服務間調用、Ribbon負載均衡、Hystrix斷路器。這裏我們說一下超時和重試機制
各組件超時
RestTemplate超時時間控制
/**
* RestTemplate超時設置
* 註釋:@LoadBalanced配置啓用Ribbon負載均衡,有無此註解不影響超時配置
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
//單位爲ms
factory.setReadTimeout(5000);
//單位爲ms
factory.setConnectTimeout(5000);
return new RestTemplate(factory);
}
Ribbon的超時配置
- 全局配置
# 設置ribbon超時時間
# SpringCloud feign 默認開啓ribbon支持
ribbon:
### 指的是建立連接所用的時間,適用於網絡狀況正常的情況下,兩端連接所用的時間。
ReadTimeout: 3000
### 指的是建立連接後從服務器讀取到可用資源所用的時間。
ConnectTimeout: 3000
- 局部設置
# 設置ribbon客戶端超時時間
# service-id是Ribbon所使用的虛擬主機名,一般和註冊到Eureka Server的服務名一致,即與spring.application.name一致
service-id:
ribbon:
### 指的是建立連接所用的時間,適用於網絡狀況正常的情況下,兩端連接所用的時間。
ReadTimeout: 3000
### 指的是建立連接後從服務器讀取到可用資源所用的時間。
ConnectTimeout: 3000
Fegin的超時配置
### 設置fegin的超時
feign:
client:
config:
# 如果使用通用配置,攜程default
feginName:
connectTimeout: 5000
readTimeout: 5000 # 單位ms
Hystrix的超時配置
# 配置hystrix超時時間
hystrix:
command:
default:
execution:
timeout:
# 默認開啓,如需關閉,將enabled改爲false即可
enabled: true
isolation:
thread:
timeoutInMilliseconds: 10000
各組件重試機制
Ribbon重試
# 注意Feign和Ribbon不要重複重試,否則會產生笛卡爾積次數
# <client>爲Ribbon Client名稱,表示對指定的Ribbon Client進行重試。省略代表全局配置
<client>:
ribbon:
MaxAutoRetries: 1 # 同一臺實例最大重試次數,不包括首次調用
MaxAutoRetriesNextServer: 2 # 重試負載均衡其他的實例最大重試次數,不包括首次調用
OkToRetryOnAllOperations: false # 是否所有操作都重試
基於HTTP請求響應碼進行重試
<clickName>:
ribbon:
retryableStatusCodes: 404,502
OpenFegin Click的Retryer重試
/**
* 開啓Fegin重試機制
*/
@Bean
Retryer feignRetryer() {
return new Retryer.Default(1L, 5L, 3);
}
- Retryer繼承了Cloneable接口,它定義了continueOrPropagate、clone方法;它內置了一個名爲Default以及名爲NEVER_RETRY的實現
- Default有period、maxPeriod、maxAttempts參數可以設置,默認構造器使用的period爲100,maxPeriod爲1000,maxAttempts爲5;continueOrPropagate方法首先判斷attempt是否達到閾值,達到則拋出異常,否則進一步計算interval,然後進行sleep
- NEVER_RETRY的continueOrPropagate直接拋出異常,而clone方法直接返回當前實例
注意事項
- 建議講Hystrix的超時時間設置爲大於多次重試所用時間的和。
- 一般不建議將ribbon.OkToRetryOnAllOperations設爲true。一旦啓用,post請求時,由於緩存了請求題,此時可能會影響服務器的資源。
- Ribbon重試不要和Retryer重試同時啓用,會產生笛卡爾積的重試結果。
本章到此結束。後續文章會陸續更新,文檔會同步在CSDN和GitHub保持同步更新。
CSDN:https://blog.csdn.net/qq_34988304/category_8820134.html
Github文檔:https://github.com/hack-feng/Java-Notes/tree/master/src/note/SpringCloud
GitHub源碼:https://github.com/hack-feng/Spring-Cloud-Edgware.git