简介
有时客户端需要在 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/