Spring Cloud Config Client超時及重試示例詳解
簡介
有時客戶端需要在 config server 無響應(yīng)時進(jìn)行重試,以給 config server 時間進(jìn)行恢復(fù)。利用 spring 提供的重試組件,我們可以方便的配置重試機(jī)制,包括重試間隔,重試次數(shù)等。下面話不多說了,來一起看看詳細(xì)的介紹吧。
項(xiàng)目源碼
為 web 項(xiàng)目添加依賴
開啟客戶端重試功能需要兩個新依賴,spring-retry 和 spring-boot-starter-aop,把如下代碼添加到 web 項(xiàng)目的 pom.xml 文件中:
<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 文件中添加如下配置:
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,即在獲取不到遠(yuǎn)程配置時,立即失敗,但是用下邊的配置進(jìn)行重試。
spring.cloud.config.retry 所有子項(xiàng)均為默認(rèn)值:
- initial-interval: 最初重試間隔為 1000 毫秒
- max-attempts: 最多重試 6 次
- max-interval: 最長重試間隔為 2000 毫秒
- multiplier: 每次重試失敗后,重試間隔所增加的倍數(shù)
測試
如果使用了本教程的項(xiàng)目,我們需要首先啟動 configserver 項(xiàng)目,然后再啟動 registry 項(xiàng)目開啟 eureka,因?yàn)?web 客戶端使用了 eureka 服務(wù),之后關(guān)閉 configserver,然后啟動 web 項(xiàng)目,會看到如下 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 客戶端啟動成功。
細(xì)粒度控制重試
我們可以在代碼中實(shí)現(xiàn)更精細(xì)的控制重試機(jī)制,在 web 項(xiàng)目中創(chuàng)建一個新的 java 類 cn.zxuqian.configurations.RetryConfiguration,添加如下代碼:
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 按要求創(chuàng)建了一個 stateless 的 RetryOperationsInterceptor,并設(shè)置了初始重試間隔為 1000 毫秒,增加倍數(shù)為 1.2 倍,最大重試間隔為 5000 毫秒,最大重試次數(shù)為 10 次,builder 還提供了諸如配置重試機(jī)制之類的接口,有興趣的讀者可自行研究。
@ConditionalOnMissingBean 標(biāo)明當(dāng) BeanFactory 中沒有名為 configServerRetryInterceptor 的 bean 時才匹配此 Bean。
最后在 src/main/resources/META-INF/ (沒有可創(chuàng)建此文件夾) 新建一個 spring.factories 文件,指定我們剛創(chuàng)建類為啟動時的配置,以在獲取遠(yuǎn)程配置之前生效:
org.springframework.cloud.bootstrap.BootstrapConfiguration=cn.zxuqian.configurations.RetryConfiguration
測試
最后在關(guān)閉 configserver 的條件下啟動 web 項(xiàng)目,然后就會看到重試十次之后,項(xiàng)目啟動失敗。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Jpa 實(shí)現(xiàn)自動更新表中的創(chuàng)建日期和修改時間
這篇文章主要介紹了Jpa 實(shí)現(xiàn)自動更新表中的創(chuàng)建日期和修改時間,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
SpringBoot-JWT生成Token和攔截器的使用(訪問受限資源)
本文主要介紹了SpringBoot-JWT生成Token和攔截器的使用(訪問受限資源),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
解決IntelliJ IDEA中鼠標(biāo)拖動選擇為矩形區(qū)域問題
這篇文章主要介紹了解決IntelliJ IDEA中鼠標(biāo)拖動選擇為矩形區(qū)域問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
簡單易懂的java8新特性之lambda表達(dá)式知識總結(jié)
一直想針對lambda表達(dá)式作一個總結(jié),借助于這次公司安排的考試作一個入門式的總結(jié),對正在學(xué)習(xí)java的小伙伴們非常有幫助,需要的朋友可以參考下2021-05-05
Springboot應(yīng)用中Mybatis輸出SQL日志的3種方法代碼示例
在前臺請求數(shù)據(jù)的時候,sql語句一直都是打印到控制臺的,有一個想法就是想讓它打印到日志里,該如何做呢?這篇文章主要給大家介紹了關(guān)于Springboot應(yīng)用中Mybatis輸出SQL日志的3種方法,需要的朋友可以參考下2024-01-01
MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach
這篇文章主要介紹了MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10

