首页 > 其他分享 >Feign Hystrix Ribbon 超时配置原理解析

Feign Hystrix Ribbon 超时配置原理解析

时间:2024-05-26 17:01:16浏览次数:22  
标签:feign 请求 Hystrix 配置 Feign 重试 ribbon 超时 Ribbon

超时配置

我们发现feign、ribbon、hystrix中都有超时时间配置,每个组件中超时的具体含义是什么?在三者结合协作后,又应该如何配置?

Feign

超时配置

feign中的超时配置,针对的是一次请求时的连接时间和读取时间。

  • 执行一次请求的最长时间 = feign连接超时+feign读取超时

超时配置由Feign实例中的Options对象设置

private Options options = new Options();

默认配置下,连接超时时间是10S,读取超时时间是60S。

public Options() {
  this(10, TimeUnit.SECONDS, 60, TimeUnit.SECONDS, true);
}

重试机制

feign中还存在重试机制,重试里有一个间隔时间。在没有启用重试时,一个请求就只执行一次,完成一个请求的最长时间就是执行一次请求的最长时间。在重试策略启用时,一个请求可以经重试策略执行多次,完成一个请求的最长时间如下

  • 完成一个请求的最长时间 = (feign连接超时+feign读取超时)+ feign重试次数 * (feign重试间隔时间 + feign连接超时+feign读取超时)

重试配置由Feign实例中的Retryer对象设置

private Retryer retryer = new Retryer.Default();

默认配置下,最小间隔时间为100ms,最大间隔时间1s,最多执行5次(即失败后最多再重试4次)。

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

Ribbon

我们在feign中,Client用于请求发送,而ribbon则继承、扩展了Client,提供了一个新的实现LoadBalancerFeignClient,所以请求的发送执行其实是交由ribbon完成了。

超时配置

ribbon中的超时配置,同样针对的是一次请求时的连接时间和读取时间。但其配置逻辑不同,具体来说,

  • 如果feign中没有进行超时配置,那么使用Ribbon的超时配置。

    • 如果ribbon没有进行超时配置,那就使用默认的配置。默认配置下,连超超时时间是1000ms,读取超时时间是1000ms。
    public class RibbonClientConfiguration {
    
       /**
        * Ribbon client default connect timeout.
        */
    public static final int DEFAULT_CONNECT_TIMEOUT= 1000;
    
       /**
        * Ribbon client default read timeout.
        */
    public static final int DEFAULT_READ_TIMEOUT= 1000;   
    }
    
  • 如果feign中进行了超时配置,那么就使用feign的配置。

详细的逻辑见LoadBalancerFeignClient.getClientConfig()方法。

IClientConfig getClientConfig(Request.Options options, String clientName) {
   IClientConfig requestConfig;
   // DEFAULT_OPTIONS是一个静态对象
   if (options == DEFAULT_OPTIONS) {
      // 使用ribbon的超时配置
      requestConfig = this.clientFactory.getClientConfig(clientName);
   }
   else {
      // 使用feign的超时配置
      requestConfig = new FeignOptionsClientConfig(options);
   }
   return requestConfig;
}

DEFAULT_OPTIONS对象在FeignRibbonClientAutoConfiguration中进行了注入

@Bean
@ConditionalOnMissingBean
public Request.Options feignRequestOptions() {
   return LoadBalancerFeignClient.DEFAULT_OPTIONS;
}

使用feign配置的情况下,ribbon执行一次请求的最长时间如下

  • 执行一次请求的最长时间 = (feign连接超时+feign读取超时)

重试机制

ribbon中也存在重试机制,只是默认未启用,其重试时没有间隔时间,因为可以配置策略,在其它实例上进行重试。如果启用重试的话,ribbon中一次请求也可以多次执行,完成一次请求的最长时间如下

  • 完成一次请求的最长时间 = 重试次数 *(feign连接超时+feign读取超时)

ribbon中的重试,在网络连接失败、读取超时时才会进行,详见DefaultLoadBalancerRetryHandler。

public class DefaultLoadBalancerRetryHandler implements RetryHandler {

    @SuppressWarnings("unchecked")
    private List<Class<? extends Throwable>> retriable = 
            Lists.<Class<? extends Throwable>>newArrayList(ConnectException.class, SocketTimeoutException.class);
    
    @SuppressWarnings("unchecked")
    private List<Class<? extends Throwable>> circuitRelated = 
            Lists.<Class<? extends Throwable>>newArrayList(SocketException.class, SocketTimeoutException.class);
}

如果feign和ribbon都开启了重试机制,在发生可重试异常时,两个部分的重试机制都会生效,流程如下

  • feign第一次请求执行 -> ribbon负责具体的请求发送 -> 如果发生网络异常,ribbon进行重试,如果重试次数用完还是网络异常,则抛出异常 ->feign捕获异常后进行重试,再次请求执行

在都启用重试的情况下,以feign和ribbon中都只进行一次为例,一个请求最大的执行次数如下

  • 执行次数 = 1*(1+1)+ 1 *(1+1)= 2 + 2 =4

完成一个请求的最长时间为

  • 完成一个请求的最长时间 = 2 * (readTimeout + connectTimeout) + feign一次重试间隔时间 + 2 * (readTimeout + connectTimeout)

实际中,启用一个重试机制就可以了。

Hystrix

hystrix中的超时时间,指的是Hystrix命令在执行远程服务调用时的最大等待时间,针对的是一个请求。请求的执行由feign和ribbon完成,hystrix不关心其中的连接超时、读取超时和重试次数,只关注于这个请求执行耗时。

在进行配置时,大于feign和ribbon中完成一个请求的最长时间即可。feign和ribbon中完成一个请求的最长时间需要根据配置来进行计算,以使用feign的超时配置举例说明

  • feign和ribbon都不进行重试时,完成一个请求的最长时间 = feign连接超时+feign读取超时
  • feign进行重试,ribbon不进行重试时,完成一个请求的最长时间 = (feign连接超时+feign读取超时)+ feign重试次数 * (feign重试间隔时间 + feign连接超时+feign读取超时)

默认配置下,超时时间为1000ms,自定义配置hystrix全局执行超时时间。

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2000# 设置超时时间

标签:feign,请求,Hystrix,配置,Feign,重试,ribbon,超时,Ribbon
From: https://www.cnblogs.com/cd-along/p/18213939

相关文章

  • 微服务容错实战之openfeign
    Netflix开源软件套件(NetflixOpenSourceSoftware,简称NetflixOSS)是Netflix公司开源的一系列优秀的软件工具和框架,用于构建高性能、可扩展、弹性和可靠的分布式系统。提供了丰富的工具和解决方案,如Eureka、Feign、Ribbon、Hystrix、Zuul等。这里我们借助Feign、Ribbon和Hystrix......
  • Openfeign集成Ribbon、Hystrix原理解析
    本篇内容为解析SpringCloudOpenfeign在如下场景中的运行原理Openfeign单独使用集成负载均衡器,这里选择Ribbon,也可以选择SpringLoadBalancer集成断路器,这里选择Hystrix,也可以选择Sentinel相关依赖如下,使用的SpringCloud版本为Hoxton.SR3<dependency><groupId>org.s......
  • 自定义Feign配置
    java代码的方式写一个配置类publicclassFeignConfig{/***将契约改为feign原生的默认契约。这样就可以使用feign自带的注解了。*@return默认的原生契约*/@BeanpublicContractfeignContract(){returnnewContract.Default......
  • Feign的介绍与使用
    什么是Feign?Feign是声明式WebService客户端,它让微服务之间的调用变得更简单。为什么使用Feign?Feign旨在使编写JavaHttp客户端变得更容易;之前在使用Ribbon+RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对......
  • Ribbon负载均衡
    SpringCloudRibbon是一套基于NetflixRibbon实现的客户端负载均衡和服务调用工具。负载均衡是系统处理高并发、缓解网络压力和服务端扩容的重要手段之一。通过Ribbon,以将面向服务的REST模板(RestTemplate)请求转换为客户端负载均衡的服务调用,SpringCloud微服务之间的......
  • 【Springboot】复杂单元测试启动类-只测试OpenFeign
    复杂单元测试启动类-只测试OpenFeign背景随着springboot应用工程规模越来越大,集成了较多的自动配置的程序,例如SpringDataJPA,SpringCloudOpenFeign,ApacheDubbo有时会需要在本地运行测试,但要么因为数据库无法在办公网络环境连接,要么注册中心无法连接,这就导致本地完全无......
  • SpringCloud(3)-OpenFeign相关配置
    OpenFeign是个声明式WebService客户端,使用OpenFeign让编写WebService客户端更简单。SpringCloud对OpenFeign进行了封装使其支持了SpringMVC标准注解和HttpMessageConverters。OpenFeign可以与Eureka和Ribbon组合使用以支持负载均衡。1.配......
  • SpringCloud(2)-Ribbon相关配置
    Ribbon是一套提供客户端负载均衡的工具Ribbon=负载均衡+RestTemplateRibbon属于进程内LoadBalance,含义是将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些服务地址可用,然后再从这些地址中选择出一个合适的服务地址。Ribbon常见负载算法:我们接下来以随机负载......
  • SpringCloud解决feign调用token丢失问题
    背景讨论feign请求在微服务环境中,完成一个http请求,经常需要调用其他好几个服务才可以完成其功能,这种情况非常普遍,无法避免。那么就需要服务之间的通过feignClient发起请求,获取需要的资源。认证和鉴权一般而言,微服务项目部署环境中,各个微服务都是运行在内网环境,网关服务负责请......
  • 整合Spring Cloud + Nacos(服务注册与服务发现) + OpenFeign
    一、事前准备1、本文章不包含Nacos的安装教程,请参考其他文章安装并启动Nacos2、创建一个SpringBoot项目先创建一个简单的SpringBoot项目,引入普通项目中需要用到的相关依赖<dependencies><!--web--><dependency><groupId>org.springframework.boot</groupId......