博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Cloud Config Client 超时与重试
阅读量:6232 次
发布时间:2019-06-21

本文共 3029 字,大约阅读时间需要 10 分钟。

hot3.png

简介

有时客户端需要在 config server 无响应时进行重试,以给 config server 时间进行恢复。利用 spring 提供的重试组件,我们可以方便的配置重试机制,包括重试间隔,重试次数等。

项目源码

为 web 项目添加依赖

开启客户端重试功能需要两个新依赖,spring-retryspring-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-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,添加如下代码:

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 项目,然后就会看到重试十次之后,项目启动失败。

欢迎访问我的博客:

转载于:https://my.oschina.net/u/3819492/blog/1812959

你可能感兴趣的文章
【实用技巧】 修改度娘的提取码
查看>>
linux光驱挂到本地目录
查看>>
jQuery Ajax实例 ($.ajax_$.post_$.get)
查看>>
第一课JAVA开发环境配置
查看>>
linux的NFS详细配置方法
查看>>
Eclipse中Spring插件的安装及使用
查看>>
git 出现错误 Could not resolve host: github.com 或者 gitlab.com 或者gerrit相关( 自有服务 )...
查看>>
eclipse中启动项目报内存溢出问题通过修改配置解决
查看>>
垃圾桶丁
查看>>
Windows环境下python2.7安装mysql-python
查看>>
InnoDB的三个关键特性
查看>>
请教一个问题:关于 webrtc 通信的问题
查看>>
SDE里修改要素的已有字段的长度
查看>>
openStack高可用性和灾备方案
查看>>
svn完整搭建
查看>>
programData
查看>>
python正则表达式二[转]
查看>>
Easyui datagrid
查看>>
win11.2.0.4lsnrctl status hang
查看>>
黑盒测试实践作业进度报告(周四)
查看>>