SpringCloud Feign 之 超时重试次数探究

SpringCloud Feign 之 超时重试次数探究

上篇文章,我们对Feign的fallback有一个初步的体验,在这里我们回顾一下,Fallback主要是用来解决依赖的服务不可用或者调用服务失败或超时,使用默认的返回值。实际应用中, 在Fallback之前,需要对服务配置重试机制,当多次重试服务,还是服务不可用的情况下,就触发Fallback。

这里,我们对重试机制配置以及重试次数进行一次探究。

Feign的超时

Feign接口调用分两层,Ribbon(负载均衡)和Hystrix(熔断器)的调用,因此Feign的超时时间就是

ribbon的超时时间和Hystrix的超时时间的结合(不是简单相加)。

##hystrix的超时时间
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 60000
##Ribbon超时
ribbon:
  ConnectTimeout: 20000  #毫秒    连接超时时间
  ReadTimeout: 20000     #毫秒      逻辑处理超时时间

正常情况下,因为Ribbon有重试机制,所以Ribb的超时时间是 < Hystrix熔断的超时。

Feign的重试

Feign的重试机制在源码中默认关闭的,因为Ribbon的重试机制和Fiegn原来的重试机制冲突,所以在一般情况下,Feign的重试机制指的就是Ribbon的重试机制,本文也是如此。

Ribbon超时重试
##Ribbon超时重试配置
ribbon:
  ConnectTimeout: 20000  #毫秒    连接超时时间
  ReadTimeout: 20000     #毫秒      逻辑处理超时时间
  OkToRetryOnAllOperations: true    # 是否对所有操作都进行重试
  MaxAutoRetries: 2     # 对当前实例的最大重试次数(请求服务超时6s则会再请求一次)
  MaxAutoRetriesNextServer: 1     # 切换实例的最大重试次数(如果还失败就切换下

Ribbon超时重试次数(总的请求次数):**(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1)**

如果Ribbon没有配置重试时间和次数,默认1S超时,默认重试1次

重试次数验证
  • 设置超时时间2S,在demo中sleep 3S,会发现请求了6次。

  • 不配置重试时间和次数,sleep 3S,重试1次,一共请求2次。

    根据测试结果,可看出结论正确。总的请求次数):**(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1)**

其他
  • 如果重试期间,调用时间超过了 Hystrix熔断的超时时间,便会立即熔断,进行FallBack。

    根据上面描述可大致计算出Hystrix可以参考的超时时间,来保持可以使用到重试机制。

    hystrix超时时间的计算:(MaxAutoRetries+1)(MaxAutoRetriesNextServer+1) (ConnectTimeout+ReadTimeout) 。

  • 当ribbon超时后且hystrix没有超时,就会使用到重试机制。
  • 默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试,非GET方式请求,只有连接异常时,才会进行重试(从其他博文学习到,暂未验证)
  • demo地址:https://github.com/lanxuan826/sample-library/tree/master/feigndemo-fallback

原文地址:https://www.cnblogs.com/lanxuan826/p/11617903.html

时间: 2024-10-08 20:51:53

SpringCloud Feign 之 超时重试次数探究的相关文章

SpringCloud Fegin超时重试源码

springCloud中最重要的就是微服务之间的调用,因为网络延迟或者调用超时会直接导致程序异常,因此超时的配置及处理就至关重要. 在开发过程中被调用的微服务打断点发现会又多次重试的情况,测试环境有的请求响应时间过长也会出现多次请求,网上查询了配置试了一下无果,决定自己看看源码.本人使用的SpringCloud版本是Camden.SR3. 微服务间调用其实走的是http请求,debug了一下默认的ReadTimeout时间为5s,ConnectTimeout时间为2s,我使用的是Fegin进行微

SpringCloud | FeignClient和Ribbon重试机制区别与联系

在spring cloud体系项目中,引入的重试机制保证了高可用的同时,也会带来一些其它的问题,如幂等操作或一些没必要的重试. 今天就来分别分析一下 FeignClient 和 Ribbon 重试机制的实现原理和区别,主要分为三点: 1)FeignClient重试机制分析 2)Ribbon重试机制分析 3)FeignClient和Ribbon重试机制的区别于联系 1)FeignClient 重试机制分析: FeignClient 重试机制的实现原理相对简单.首先看一下feignClient处理请

Volley超时重试机制详解

Volley超时重试机制 基础用法 Volley为开发者提供了可配置的超时重试机制,我们在使用时只需要为我们的Request设置自定义的RetryPolicy即可. 参考设置代码如下: int DEFAULT_TIMEOUT_MS = 10000; int DEFAULT_MAX_RETRIES = 3; StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<S

dubbo超时重试和异常处理

参考: https://www.cnblogs.com/ASPNET2008/p/7292472.html https://www.tuicool.com/articles/YfA3Ub https://www.cnblogs.com/binyue/p/5380322.html https://blog.csdn.net/mj158518/article/details/51228649 本篇主要记录dubbo中关于超时的常见问题,实现原理,解决的问题以及如何在服务降级中体现作用等. 超时问题

Dubbo重试次数

服务超时后重试次数[retries],不包含第一次调用,0代表不重试 *我们应该在幂等方法上设置重试次数[查询.删除.修改],在非幂等方法上禁止设置重试次数. ★幂等:指多次运行方法所产生的最终效果是一致的 1 <!--3.声明需要调用的远程服务接口,生成远程服务代理,可以和本地Bean一样使用--> 2 <dubbo:reference id="userService" interface="cn.coreqi.service.UserService&qu

SpringCloud Feign 之 Fallback初体验

SpringCloud Feign 之 Fallback初体验 在微服务框架SpringCloud中,Feign是其中非常重要且常用的组件.Feign是声明式,模板化的HTTP客户端,可以帮助我们更方便快捷调用HTTP API.本文主要针对Feign的熔断机制Fallback进行简单介绍.Fallback主要是用来解决依赖的服务不可用或者调用服务失败或超时,使用默认的返回值. 1.引入Feign pom依赖包 <dependency> <groupId>org.springfram

一个带重试次数的curl 函数

<?php/** * [curl 带重试次数] * @param [type] $url [访问的url] * @param [type] $post [$POST参数] * @param integer $retries [curl重试次数] * @return [type] [description] */function curl($url, $post = null, $retries = 3,$sleep=1 ){ $curl = curl_init($url); if(is_reso

jedis超时重试机制注意事项

最近使用redis集群进行incr操作,总是发现计数不准确,后来经过检查发现redis在执行incr超时会执行重试机制,造成计数不准确,测试代码: /** * incrf: * 将 key 中储存的数字值增一. 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作. 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误. 本操作的值限制在 64 位(bit)有符号数字表示之内. 这是一个针对字符串的操作,因为 Redis 没有专用的整数类型,

SpringCloud+Feign环境下文件上传与form-data同时存在的解决办法(2)

书接上文. 上文中描述了如何在 SpringCloud+Feign环境下上传文件与form-data同时存在的解决办法,实践证明基本可行,但却会引入其他问题. 主要导致的后果是: 1. 无法与普通Feign方法并存 2. 几率性(不确定条件下)导致其他form-data类型参数无法识别,无法正常工作,错误信息大致如下: org.springframework.web.multipart.support.MissingServletRequestPartException: Required re