SpringCloud重试机制配置

Easter79
• 阅读 616

    首先声明一点,这里的重试并不是报错以后的重试,而是负载均衡客户端发现远程请求实例不可到达后,去重试其他实例。

Table 1. ribbon重试配置

ribbon.OkToRetryOnAllOperations

false(`是否所有操作都重试`)

ribbon.MaxAutoRetriesNextServer

2(`重试负载均衡其他的实例最大重试次数,不包括首次server`)

ribbon.MaxAutoRetries

1(`同一台实例最大重试次数,不包括首次调用`)

spring.cloud.loadbalancer.retry.enabled

true(`重试机制开关`)

 

ribbon针对http的readTimeout和connectTimeCount直接用配置 ribbon.ReadTimeout和ribbon.ConnectTimeout是无效的。配置方式参考以下代码

@Bean
@LoadBalanced
RestTemplate restTemplate() {
    HttpComponentsClientHttpRequestFactory httpRequestFactory =  new HttpComponentsClientHttpRequestFactory();
    httpRequestFactory.setReadTimeout(5000);
    httpRequestFactory.setConnectTimeout(5000);
    return new RestTemplate(httpRequestFactory);
}

Table 2. zuul重试配置

zuul.retryable

true(`重试机制开关`)

ribbon.OkToRetryOnAllOperations

false(`是否所有操作都重试`)

ribbon.MaxAutoRetriesNextServer

2(`重试负载均衡其他的实例最大重试次数,不包括首次server`)

ribbon.MaxAutoRetries

1(`同一台实例最大重试次数,不包括首次调用`)

ribbon.ConnectTimeout

6000(`http建立socket超时时间`)

ribbon.ReadTimeout

6000(`http读取响应socket超时时间`)

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds

10000(断路器线程池超时时间,这个值一定要比ribbon超时时间长)

feign重试机制

feign默认是通过自己包下的Retryer进行重试配置,默认是5次

package feign;

import static java.util.concurrent.TimeUnit.SECONDS;

/**
 * Cloned for each invocation to {@link Client#execute(Request, feign.Request.Options)}.
 * Implementations may keep state to determine if retry operations should continue or not.
 */
public interface Retryer extends Cloneable {

  /**
   * if retry is permitted, return (possibly after sleeping). Otherwise propagate the exception.
   */
  void continueOrPropagate(RetryableException e);

  Retryer clone();

  public static class Default implements Retryer {

    private final int maxAttempts;
    private final long period;
    private final long maxPeriod;
    int attempt;
    long sleptForMillis;

    public Default() {
      this(100, SECONDS.toMillis(1), 5);
    }

    public Default(long period, long maxPeriod, int maxAttempts) {
      this.period = period;
      this.maxPeriod = maxPeriod;
      this.maxAttempts = maxAttempts;
      this.attempt = 1;
    }

feign取消重试

    @Bean
    Retryer feignRetryer() {
        return Retryer.NEVER_RETRY;
    }

feign请求超时设置

@Bean
Request.Options requestOptions(ConfigurableEnvironment env){
    int ribbonReadTimeout = env.getProperty("ribbon.ReadTimeout", int.class, 6000);
    int ribbonConnectionTimeout = env.getProperty("ribbon.ConnectTimeout", int.class, 3000);

    return new Request.Options(ribbonConnectionTimeout, ribbonReadTimeout);
}

Last updated 2017-05-18 23:39:30 CST

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
springboot整合spring retry 重试机制
当我们调用一个接口可能由于网络等原因造成第一次失败,再去尝试就成功了,这就是重试机制,spring支持重试机制,并且在SpringCloud中可以与Hystaix结合使用,可以避免访问到已经不正常的实例。但是切记非幂等情况下慎用重试一 加入依赖<!重试机制<depen
Stella981 Stella981
2年前
Kafka设计
1.幂等消息为了解决重试导致的消息重复、乱序问题,kafka引入了幂等消息。幂等消息保证producer在一次会话内写入一个partition内的消息具有幂等性,可以通过重试来确保消息发布的ExactlyOnce语义。实现逻辑很简单:区分producer会话producer每次启动后,首先向broker申请一
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
2年前
Spring Cloud升级之路
针对网关非Get请求的重试在之前的系列里面SpringCloud升级之路Hoxton5.实现微服务调用重试(https://my.oschina.net/u/3747772/blog/4301365),我们针对OpenFeign和SpringCloudGateway都设置了重试。对于
Easter79 Easter79
2年前
SpringCloud:Ribbon负载均衡
1.概述SpringCloudRibbon是基于NetflixRibbon实现的一套客户端       负载均衡的工具。 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。
Stella981 Stella981
2年前
Spring RabbitMQ 消息重试机制
RabbitMQ框架提供了重试机制,只需要简单的配置即可开启,可以提升程序的健壮性。测试一:重试5次spring:rabbitmq:listener:simple:retry:enabled:true
Wesley13 Wesley13
2年前
Java之Retry重试机制详解
应用中需要实现一个功能:需要将数据上传到远程存储服务,同时在返回处理成功情况下做其他操作。这个功能不复杂,分为两个步骤:第一步调用远程的Rest服务上传数据后对返回的结果进行处理;第二步拿到第一步结果或者捕捉异常,如果出现错误或异常实现重试上传逻辑,否则继续接下来的功能业务操作。常规解决方案trycatchredo简单重试
Stella981 Stella981
2年前
RocketMQ查询死信队列中的消息内容【实战笔记】
说明RocketMQ中当重试消息超过最大重试次数(默认16次),会被发送到%DLQ%开头的死信队列,默认死信队列为只写权限。在有些情况下,想看看死信队列里的内容。1.更改死信队列权限bin/mqadminupdateTopicPermcClusterBt%DLQ%onlin
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k