簡介
有時客戶端需要在 config server 無響應時進行重試,以給 config server 時間進行恢復。利用 spring 提供的重試組件,我們可以方便的配置重試機制,包括重試間隔,重試次數等。下面話不多說了,來一起看看詳細的介紹吧。
項目源碼
為 web 項目添加依賴
開啟客戶端重試功能需要兩個新依賴,spring-retry 和 spring-boot-starter-aop,把如下代碼添加到 web 項目的 pom.xml 文件中:
1
2
3
4
5
6
7
8
9
|
<dependency> <groupid>org.springframework.retry</groupid> <artifactid>spring-retry</artifactid> <version> 1.2 . 2 .release</version> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-aop</artifactid> </dependency> |
然后在 bootstrap.yml 文件中添加如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
|
spring: application: name: web-client cloud: config: uri: http: //localhost:8888 fail-fast: true retry: initial-interval: 1000 max-attempts: 6 max-interval: 2000 multiplier: 1.1 |
首先把 spring.cloud.config.fail-fast 為true,即在獲取不到遠程配置時,立即失敗,但是用下邊的配置進行重試。
spring.cloud.config.retry 所有子項均為默認值:
- initial-interval: 最初重試間隔為 1000 毫秒
- max-attempts: 最多重試 6 次
- max-interval: 最長重試間隔為 2000 毫秒
- multiplier: 每次重試失敗后,重試間隔所增加的倍數
測試
如果使用了本教程的項目,我們需要首先啟動 configserver 項目,然后再啟動 registry 項目開啟 eureka,因為 web 客戶端使用了 eureka 服務,之后關閉 configserver,然后啟動 web 項目,會看到如下 log:
2018-05-15 16:04:58.421 info 2663 --- [ main] c.c.c.configservicepropertysourcelocator : fetching config from server at: http://localhost:8888
重試 6 次失敗后,客戶端啟動失敗,如果中途開啟 configserver,則 web 客戶端啟動成功。
細粒度控制重試
我們可以在代碼中實現更精細的控制重試機制,在 web 項目中創建一個新的 java 類 cn.zxuqian.configurations.retryconfiguration,添加如下代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package cn.zxuqian.configurations; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.boot.autoconfigure.condition.conditionalonmissingbean; import org.springframework.context.annotation.bean; import org.springframework.retry.interceptor.retryinterceptorbuilder; import org.springframework.retry.interceptor.retryoperationsinterceptor; public class retryconfiguration { private static logger log = loggerfactory.getlogger(retryconfiguration. class ); @bean @conditionalonmissingbean (name = "configserverretryinterceptor" ) public retryoperationsinterceptor configserverretryinterceptor() { log.info(string.format( "configserverretryinterceptor: changing backoffoptions " + "to initial: %s, multiplier: %s, maxinterval: %s" , 1000 , 1.2 , 5000 )); return retryinterceptorbuilder .stateless() .backoffoptions( 1000 , 1.2 , 5000 ) .maxattempts( 10 ) .build(); } } |
這里我們定義了configserverretryinterceptor方法用于 spring retry 使用我們自定義的重試攔截器。方法使用 retryinterceptorbuilder 按要求創建了一個 stateless 的 retryoperationsinterceptor,并設置了初始重試間隔為 1000 毫秒,增加倍數為 1.2 倍,最大重試間隔為 5000 毫秒,最大重試次數為 10 次,builder 還提供了諸如配置重試機制之類的接口,有興趣的讀者可自行研究。
@conditionalonmissingbean 標明當 beanfactory 中沒有名為 configserverretryinterceptor 的 bean 時才匹配此 bean。
最后在 src/main/resources/meta-inf/ (沒有可創建此文件夾) 新建一個 spring.factories 文件,指定我們剛創建類為啟動時的配置,以在獲取遠程配置之前生效:
1
|
org.springframework.cloud.bootstrap.bootstrapconfiguration=cn.zxuqian.configurations.retryconfiguration |
測試
最后在關閉 configserver 的條件下啟動 web 項目,然后就會看到重試十次之后,項目啟動失敗。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://zxuqian.cn/spring-cloud-config-retry/