Spring Cloud Config Client超时及重试示例详解
简介
有时客户端需要在configserver无响应时进行重试,以给configserver时间进行恢复。利用spring提供的重试组件,我们可以方便的配置重试机制,包括重试间隔,重试次数等。下面话不多说了,来一起看看详细的介绍吧。
项目源码
点击下载
为web项目添加依赖
开启客户端重试功能需要两个新依赖,spring-retry和spring-boot-starter-aop,把如下代码添加到web项目的pom.xml文件中:
org.springframework.retry spring-retry 1.2.2.RELEASE org.springframework.boot spring-boot-starter-aop
然后在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,即在获取不到远程配置时,立即失败,但是用下边的配置进行重试。
spring.cloud.config.retry所有子项均为默认值:
- initial-interval:最初重试间隔为1000毫秒
- max-attempts:最多重试6次
- max-interval:最长重试间隔为2000毫秒
- multiplier: 每次重试失败后,重试间隔所增加的倍数
测试
如果使用了本教程的项目,我们需要首先启动configserver项目,然后再启动registry项目开启eureka,因为web客户端使用了eureka服务,之后关闭configserver,然后启动web项目,会看到如下log:
2018-05-1516:04:58.421 INFO2663---[ main]c.c.c.ConfigServicePropertySourceLocator:Fetchingconfigfromserverat:http://localhost:8888
重试6次失败后,客户端启动失败,如果中途开启configserver,则web客户端启动成功。
细粒度控制重试
我们可以在代码中实现更精细的控制重试机制,在web项目中创建一个新的java类cn.zxuqian.configurations.RetryConfiguration,添加如下代码:
packagecn.zxuqian.configurations; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importorg.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; importorg.springframework.context.annotation.Bean; importorg.springframework.retry.interceptor.RetryInterceptorBuilder; importorg.springframework.retry.interceptor.RetryOperationsInterceptor; publicclassRetryConfiguration{ privatestaticLoggerlog=LoggerFactory.getLogger(RetryConfiguration.class); @Bean @ConditionalOnMissingBean(name="configServerRetryInterceptor") publicRetryOperationsInterceptorconfigServerRetryInterceptor(){ log.info(String.format( "configServerRetryInterceptor:ChangingbackOffOptions"+ "toinitial:%s,multiplier:%s,maxInterval:%s", 1000,1.2,5000)); returnRetryInterceptorBuilder .stateless() .backOffOptions(1000,1.2,5000) .maxAttempts(10) .build(); } }
这里我们定义了configServerRetryInterceptor方法用于SpringRetry使用我们自定义的重试拦截器。方法使用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项目,然后就会看到重试十次之后,项目启动失败。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。