Springcloud之Feign、Hystrix、Ribbon如何设置超时时间

这篇具有很好参考价值的文章主要介绍了Springcloud之Feign、Hystrix、Ribbon如何设置超时时间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一,概述

我们在微服务调用服务的时候,会使用hystrix、feign和ribbon,比如有一个实例发生了故障而该情况还没有被服务治理机制及时的发现和摘除,这时候客户端访问该节点的时候自然会失败。

所以,为了构建更为健壮的应用系统,我们希望当请求失败的时候能够有一定策略的重试机制,而不是直接返回失败。

这里还会设计一些其他的配置参数,降级和熔断的概念不再赘述。

先看这几个组件的关系

Springcloud之Feign、Hystrix、Ribbon如何设置超时时间

hystrix+ribbon。hystrix在最外层,然后再到Ribbon,最后里面的是http请求。所以说。hystrix的熔断时间必须大于ribbon的 ( ConnectTimeout + ReadTimeout )。而如果ribbon开启了重试机制,还需要乘以对应的重试次数(注意这里的重试可以是ribbon的重试也可能是feign的重试),保证在Ribbon里的请求还没结束时,Hystrix的熔断时间不会超时。

二,配置

1,hystrix降级配置

该降级配置会在请求发出30秒未返回或者异常的时候触发降级策略。并中断正在执行的线程。

#开启Feign下面的Hystrix功能
feign.hystrix.enabled=true
#是否开启服务降级
hystrix.command.default.fallback.enabled=true
#全局超时
hystrix.command.default.execution.timeout.enabled=true
#超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=30000
#超时以后终止线程
hystrix.command.default.execution.isolation.thread.interruptOnTimeout=true
#取消的时候终止线程
hystrix.command.default.execution.isolation.thread.interruptOnFutureCancel=true

2,hystrix熔断配置

该熔断配置的效果是如果时间窗口20秒内,请求超过5个,且失败率到达50%,也就是一般会进行熔断,比如20秒内6个请求,有三个成功,三个失败,在发送第六个请求结束后,会对下游服务进行熔断。从熔断的时刻开始,15秒后进入半开状态,尝试放过一个请求,如果成功也关闭熔断,否则等下一个15秒。

#熔断的前提条件(请求的数量),在一定的时间窗口内,请求达到5个以后,才开始进行熔断判断
hystrix.command.default.circuitBreaker.requestVolumeThreshold=5
#超过50%的失败请求,则熔断开关开启
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
#当熔断开启以后,经过多少秒再进入半开状态
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=15000
#配置时间窗口
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=20000

#开启熔断功能
hystrix.command.default.circuitBreaker.enabled=true
#强制开启熔断开关
hystrix.command.default.circuitBreaker.forceOpen=false
#强制关闭熔断开关
hystrix.command.default.circuitBreaker.forceClosed=false

3,ribbon配置

该配置会在发生网络异常后进行请求重试,发生网络异常后,重试次数为(1 + MaxAutoRetries) * (1 + MaxAutoRetriesNextServer)因为包含自己的一次正常请求所以要 +1(失败次数和保存到本地的所以服务之间不能互相感知,每次每一个服务都要+1)

所以hystrix的超时时间(timeoutInMilliseconds)应该配置为

timeoutInMilliseconds > (1 + MaxAutoRetries) * (1 + MaxAutoRetriesNextServer)*  (ConnectTimeout + ReadTimeout)

也就是timeoutInMilliseconds >= (1+2)*(1+2)*(1+2) 

#全局配置

#每台机器最大重试次数
ribbon.MaxAutoRetries=2
#可以再重试几台机器
ribbon.MaxAutoRetriesNextServer=2
#连接超时
ribbon.ConnectTimeout=1000
#业务处理超时
ribbon.ReadTimeout=2000
#在所有HTTP Method进行重试,默认只是在GET请求的地方重试
ribbon.OkToRetryOnAllOperations=true

#单个服务配置配置,该设置会覆盖掉全局配置,servicename为调用服务在注册中心注册服务名称

#每台机器最大重试次数
servicename.ribbon.MaxAutoRetries=2
#可以再重试几台机器
servicename.ribbon.MaxAutoRetriesNextServer=2
#连接超时
servicename.ribbon.ConnectTimeout=1000
#业务处理超时
servicename.ribbon.ReadTimeout=2000
#在所有HTTP Method进行重试,默认只是在GET请求的地方重试
servicename.ribbon.OkToRetryOnAllOperations=true

1,ribbon的重试机制

ribbon默认不开启重试,开启后默认只有GET请求进行重试

ribbon 调用重试需要引入此包

<dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
            <version>1.3.0</version>
        </dependency> 

4,feign配置

在项目中,使用feignClient进行http 服务调用,feignClient的默认连接方式为HttpURLConnection,因为HttpURLConnection没有连接池,并发高的时候,会有一定的网络开销,在做项目优化的时候,替换改为okHttp以便复用其连接池(也可以使用apache的httpclient)。

如果没有设置过 feign 超时,也就是等于默认值的时候,就会读取 ribbon 的配置,使用 ribbon 的超时时间和重试设置。否则使用 feign 自身的设置。两者是二选一的,且 feign 优先。

 <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-okhttp</artifactId>
            <version>11.0</version>
        </dependency>
feign:
  #okhttp3的时候压缩不生效
  #  compression:
  #    request:
  #      enabled: true
  #      mime-types:
  #        - text/xml
  #        - application/xml
  #        - application/json
  #      min-request-size: 2048
  okhttp:
    enabled: true
  client:
    config:
      #设置的全局超时时间
      #如果没有设置过 feign 超时,也就是等于默认值的时候,就会读取 ribbon 的配置,
      #使用 ribbon 的超时时间和重试设置【默认连接和读取时间各1秒】。否则使用 feign 自身的设置。
      #两者是二选一的,且 feign 优先。
      default:
        #请求连接的超时时间
        #connectTimeout: 10000
        #请求处理的超时时间
        #readTimeout: 60000
        #不打印请求日志
        loggerLevel: NONE
        #配置请求拦截器
#        request-interceptors:
#          - feign.auth.BasicAuthRequestInterceptor
#        decoder: org.springframework.cloud.openfeign.support.SpringDecoder
#        encoder: org.springframework.cloud.openfeign.support.SpringEncoder

1,feign的重试机制

因为ribbon的重试机制和feign的重试机制有冲突,所以源码中默认关闭feign的重试机制。

这里以使用feign的默认实现Default为例配置,这里使用bean的方式配置,这里配置最大重试次次数是5次,最大重试时间1s,每次重试间隔100ms

注意使用feign重试的时候,不需要开启ribbon重试,且需要配置feign的超时时间。文章来源地址https://www.toymoban.com/news/detail-479938.html

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import feign.Retryer;
 
import static java.util.concurrent.TimeUnit.SECONDS;
 
@Configuration
public class AppConfig {
 
    @Bean
    public Retryer feignRetryer(){
        return new Retryer.Default(1,SECONDS.toMillis(1), 5);
    }
}

到了这里,关于Springcloud之Feign、Hystrix、Ribbon如何设置超时时间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【java】Spring Cloud --Feign Client超时时间配置以及单独给某接口设置超时时间方法

    FeignClient面对服务级有三种超时时间配置 feign配置是在ribbon配置的基础上做了扩展,可以支持服务级超时时间配置,所以,feign配置和ribbon配置的效果应该是一样的。 SpringCloud对这两种配置的优先级顺序如下: Feign局部配置 Feign全局配置 Ribbon局部配置 Ribbon全局配置 在feign-co

    2024年02月12日
    浏览(45)
  • springCloud的ribbon和feign

    就是将原来的具体地址,改为了通过服务名去调用。注册中心中有多个服务,相同服务名,就会算作可以调用的服务。 首先得有一个注册中心,然后各种服务注册进去,然后利用ribbon或者feign去调用。   ribbon是直接用地址拼接,然后调用。 feign通过对外编写接口,然后实现

    2024年01月22日
    浏览(37)
  • 微服务 springcloud 08.zuul框架,API网关,整合ribbon和hystrix框架

    01.zuul是作为springcloud中的一个网关框架来使用的。 zuul API 网关,为微服务应用提供统一的对外访问接口。 zuul 还提供过滤器,对所有微服务提供统一的请求校验。 在项目中的位置: 02.新建 sp11-zuul 项目 03.pom.xml 需要添加 sp01-commons 依赖 04.application.yml zuul 路由配置可以省略,

    2024年02月09日
    浏览(38)
  • springcloud微服务架构(eureka、nacos、ribbon、feign、gateway等组件的详细介绍和使用)

    目录 一、微服务演变 1、单体架构(Monolithic Architecture) 2、分布式架构  3、微服务 4、 总结 5、微服务架构 5.1、 微服务技术对比 5.2、企业需求 二、spring cloud  springCloud与SpringBoot的版本兼容关系 1、服务拆分及远程调用 1.1、服务拆分 1.1.1、服务拆分注意事项 1.1.2、项目实战

    2024年02月08日
    浏览(42)
  • springboot小知识:配置feign服务超时时间

    背景:当前项目通过feign服务调用了其他两个项目的接口,但是由于特殊需求,需要调整某一个项目的feign服务的默认超时时间: 默认连接超时10秒,默认读取超时时间 60秒 1.找到定义的FeignClient 2.根据FeignClient定义的名称test-center修改配置文件,如下: 注意:配置中间的test

    2024年02月06日
    浏览(52)
  • springcloud五大组件:Eureka:注册中心、Zuul:服务网关、Ribbon:负载均衡、Feign:服务调用、Hystix:熔断器

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。 SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 Eureka包含两个组件:Eureka Server和Eure

    2024年04月10日
    浏览(43)
  • 设置RabbitMQ超时时间

    RabbitMQ默认的超时时间是30分钟,在消息消费超过30分钟后,rabbitMQ会发生错误,导致整个channel被销毁,无法继续消费 在RabbitMQ安装的终端执行 命令,将超时时间延长。 使用 可以查看设置的超时值。 值得注意的是,这个事临时更改,永久更改需要进入 rabbitmq.con f 文件里修改

    2024年02月04日
    浏览(38)
  • axios设置超时时间

    方式一: 方式二: 3.创建实例 可以使用自定义配置新建一个 axios 实例 : axios.create([config]) 4.判断超时

    2024年02月12日
    浏览(47)
  • 前端页面超时时间设置

    有志者,事竟成 文章持续更新,可以关注【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。 在项目中我们经常会有超时的情况发生,例如点击某一个查询按钮,然后

    2024年02月11日
    浏览(47)
  • axios 设置超时时间 timeout

    在项目中,所有请求都是走统一封装过的axios,统一设置了超时时间: 但是有一个接口耗费时间巨长,网络不好时经常会超时,改统一设置的超时时间感觉不太好,所以想针对这个请求单独设置超时时间。 以下是普通请求: 单独设置请求超时时间:

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包