简介

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

项目源码

Gitee码云

为 web 项目添加依赖

开启客户端重试功能需要两个新依赖,spring-retryspring-boot-starter-aop,把如下代码添加到 web 项目的 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,即在获取不到远程配置时,立即失败,但是用下边的配置进行重试。

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

欢迎访问我的博客:张旭乾的博客

Spring Cloud Config Client 超时与重试的更多相关文章

  1. Spring cloud config client获取不到配置中心的配置

    Spring cloud client在配置的时候,配置文件要用 bootstrap.properties 贴几个说明的链接.但是觉得说的依然不够详细,得空详查. 链接1 链接2 链接3 原文地址:h ...

  2. Spring Cloud config之一:分布式配置中心入门介绍

    Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持.配置服务器为各应用的所有环境提供了一个中心化的外部配置.它实现了对服务端和客户端对Spring Environm ...

  3. spring cloud连载第二篇之Spring Cloud Config

    Spring Cloud Config Spring Cloud Config为分布式服务提供了服务侧和客户侧的外部配置支持.通过Spring Cloud Config你可以有一个统一的地方来管理所有 ...

  4. Spring Cloud Config(配置中心)

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一.简介 Spring Cloud Config为分布式系统中的外部配置提供服务器和客 ...

  5. Spring Cloud Config中文文档

    https://springcloud.cc/spring-cloud-config.html 目录 快速开始 客户端使用 Spring Cloud Config服务器 环境库 健康指标 安全 加密和 ...

  6. Spring Cloud搭建手册(2)——Spring Cloud Config

    ※在Dalston.SR2版本以后,均不能正常加密,如果必须使用此功能,需要降级到SR1或Camden SR7. 1.首先需要创建一个config-server工程,作为配置中心的服务器,用来与git ...

  7. Spring Cloud Config(一):聊聊分布式配置中心 Spring Cloud Config

    目录 Spring Cloud Config(一):聊聊分布式配置中心 Spring Cloud Config Spring Cloud Config(二):基于Git搭建配置中心 Spring Cl ...

  8. Spring Boot + Spring Cloud 构建微服务系统(九):配置中心(Spring Cloud Config)

    技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每个项目都散落着各种配置文件,且随着服务的增加而不断增多.此时,往往某一个基础服务信息变更,都会导致一系列服务的更新和重启, ...

  9. Spring Cloud Config 配置中心 自动加解密功能 jasypt方式

    使用此种方式会存在一种问题:如果我配置了自动配置刷新,则刷新过后,加密过后的密文无法被解密.具体原因分析,看 SpringCloud 详解配置刷新的原理 使用  jasypt-spring-boot- ...

随机推荐

  1. p71_文件传送协议FTP

    一.FTP服务器和用户端 FTP是基于客户/服务器(C/S) 的协议. 用户通过一一个客户机程序连接至在远程计算机上运行的服务器程序. 依照FTP协议提供服务,进行文件传送的计算机就是FTP服务器. ...

  2. 设计模式:singleton模式

    目的:限制类的实例个数只能是一个 例子: #define AGT_DECLARE_SINGLETON(ClassName) \ public: \ static ClassName *Instance ...

  3. NCRE-Python考点

    NCRE-Python考点 作者:封亚飞本文不含 文件处理.面向对象程序设计.公共基础.计算生态希望各位可以批评指正Qq 64761294 由于图片上传不方便,需要真题的朋友可以加我的qq找我要pdf ...

  4. WARNING: 'aclocal-1.14' is missing on your system.问题解决记录

    在编译LXC时,遇到一个问题,提示 'aclocal-1.14'缺失.如下:WARNING: 'aclocal-1.14' is missing on your system. You should ...

  5. MySQL之高级操作

     新增数据: 基本语法: insert into 表名 [(字段列表)] values(列表值) 在数据插入的时候,假设主键对应的值已经存在,插入一定会失败 主键冲突: 当主键存在冲突的时候(Dupl ...

  6. spring学习(七)spring整合JDBC

    Spring中封装了一个可操作数据库的对象,该对象封装了JDBC技术 使用数据库 一.导包(IDEA的maven工程,在pom.xml文件中导入依赖,必须注意依赖,不然会报各种异常) <?xml ...

  7. springboot+quartz以持久化的方式实现定时任务

    springboot+queue以持久化的方式实现定时任务 篇幅较长,耐心的人总能得到最后的答案 小生第一次用quartz做定时任务,不足之处多多谅解. 首先 在springboot项目里做定时任务是 ...

  8. 第二章 Java基础知识(下)

    2.1.分支结构(if.switch) 2.1.1.if语句 格式一: if (关系表达式) { 语句体; } 流程一: ①首先计算关系表达式的值 ②如果关系表达式的值为true就执行语句体 ③如果关 ...

  9. Excel绘制动态图表 之 极品offset、多种控件动态动图

    1.案例1:辅助区域动态图 动态按钮“投资金额”的制作: "数据"菜单下"数据工作”组中的“数据验证”,选择"序列". 2. OFFSET ——函数中 ...

  10. PHP abs() 函数

    实例 返回不同数的绝对值: <?phpecho(abs(6.7) . "<br>");echo(abs(-6.7) . "<br>" ...