有时客户端须要在 config server 无响应时进行重试,以给 config server 时间进行恢复。利用 spring 提供的重试组件,咱们能够方便的配置重试机制,包括重试间隔,重试次数等。java
Gitee码云git
开启客户端重试功能须要两个新依赖,spring-retry
和 spring-boot-starter-aop
,把以下代码添加到 web 项目的 pom.xml 文件中:web
<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
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,即在获取不到远程配置时,当即失败,可是用下边的配置进行重试。bootstrap
spring.cloud.config.retry
全部子项均为默认值:bash
若是使用了本教程的项目,咱们须要首先启动 configserver 项目,而后再启动 registry 项目开启 eureka,由于 web 客户端使用了 eureka 服务,以后关闭 configserver,而后启动 web 项目,会看到以下 log:app
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 客户端启动成功。less
咱们能够在代码中实现更精细的控制重试机制,在 web 项目中建立一个新的 java 类 cn.zxuqian.configurations.RetryConfiguration
,添加以下代码:spring-boot
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
文件,指定咱们刚建立类为启动时的配置,以在获取远程配置以前生效:
org.springframework.cloud.bootstrap.BootstrapConfiguration=cn.zxuqian.configurations.RetryConfiguration
复制代码
最后在关闭 configserver 的条件下启动 web 项目,而后就会看到重试十次以后,项目启动失败。
欢迎访问个人博客:张旭乾的博客