SpringCloud源码系列之(Ribbon、Hystrix超时正确配置)

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

这块的代码debug了一个礼拜,一开始看Fegin创建源码的时候没注意到,是基于RxJava的响应式编程。分析栈桢的时候,有很多异步栈桢。由于只是想搞清楚如下配置的生效时机、以及失效情况,期间还看了一堆与此无关的源码,真的头大
SpringCloud源码系列之(Ribbon、Hystrix超时正确配置),springcloud源码,spring cloud,ribbon,hystrix,超时设置
先贴一下正确的超时配置

ribbon:
  ReadTimeout: 3333
  ConectTimeout: 2000
feign:
  hystrix:
    enabled: true
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5555

服务降级流程:在Ribbon发送网络请求的同时,如果配置了hystrix降级,底层同时开启一个定时任务,间隔时间就是配置的hystrix超时时间,到点了,无论FeginClient有没有请求成功,都会先进行返回降级。对应的降级定时任务源码如下图。(里面的listener就是取的我们配置文件中的 timeoutInMilliseconds: 5555)。
断点位置:com.netflix.hystrix.util.HystrixTimer.addTimerListener()。
SpringCloud源码系列之(Ribbon、Hystrix超时正确配置),springcloud源码,spring cloud,ribbon,hystrix,超时设置
Ribbon超时流程:走正常的FeginClient发送请求的流程中,里面会进行读取我们配置的Ribbon超时时间(ribbon.ReadTimeout: 3333),Ribbon不配置的话默认是1s。贴一张debug的源码图如下。
断点位置:org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer.execute()

SpringCloud源码系列之(Ribbon、Hystrix超时正确配置),springcloud源码,spring cloud,ribbon,hystrix,超时设置
整个过程是异步的,具体的实现底层用的是RxJava框架(发布、订阅模式)。如果正常的请求执行时间花了5s,但是在3s的时候,就被hystrix降级了,此时Ribbo在第5s的收到了返回结果,那么就会出一个诡异的现象,客户端收到的是降级请求,但是Fegin日志里面没报错,并且成功打印了本次的Fegin的request、reponse。因此我们的ribbon超时时间一般配置的比hystrix的超时时间小一点。

看源码大前提

首先我们要知道OpenFegin默认集成了Ribbon,也就是说只要我们使用了Fegin,Ribbon就一定会生效?答案是错误的,这个在之前的Cloud源码文章里面分析过了,只有当@FeginClient是通过注册中心调用服务的情况下,Ribbon才会生效。对应的Ribbon超时配置才会生效。
SpringCloud源码系列之(Ribbon、Hystrix超时正确配置),springcloud源码,spring cloud,ribbon,hystrix,超时设置
测试Fegin接口详情如下图。手动设置了服务提供方5s的超时
SpringCloud源码系列之(Ribbon、Hystrix超时正确配置),springcloud源码,spring cloud,ribbon,hystrix,超时设置

SpringCloud源码系列之(Ribbon、Hystrix超时正确配置),springcloud源码,spring cloud,ribbon,hystrix,超时设置

hystrix与ribbon超时的关系

先来说总结Ribbon超时相当于第一层壁垒,hystrix的超时相当于第二层壁垒。只有当(接口处理时间<Ribbon超时时间 && 接口处理时间< hystrix超时时间)时,接口才能正常响应,其他情况都会进行降级。

源码分析入口

具体的源码入口如下:feign.hystrix.HystrixInvocationHandler.invoke(),里面的run方法里面执行Ribbon负载均衡,返回服务调用请求的结果。getFallBack负责返回降级的结果。当Ribbon执行还没结束但是已经hystrix已经超时了,hystrix超时定时任务就会开启,触发getFallBack中的降级逻辑,然后返回结果。getRun、getFallback方法二选一返回。SpringCloud源码系列之(Ribbon、Hystrix超时正确配置),springcloud源码,spring cloud,ribbon,hystrix,超时设置

里面的run方法走的是正常的流程,在 Spring Cloud OpenFegin(创建、发送请求)源码 一文中已经分析过了。getFallBack就是走的降级流程,看下图的栈桢SpringCloud源码系列之(Ribbon、Hystrix超时正确配置),springcloud源码,spring cloud,ribbon,hystrix,超时设置
栈桢接着往下滑,可以看到getFallback就是降级定时任务触发的,和我分析的一样。到此关键节点的源码已经全贴出来了。其他具体的流程都在我脑子里哈哈哈哈哈哈,但是也怕忘,所以只贴关键代码方便日后回忆。

SpringCloud源码系列之(Ribbon、Hystrix超时正确配置),springcloud源码,spring cloud,ribbon,hystrix,超时设置

SpringCloud源码系列之(Ribbon、Hystrix超时正确配置),springcloud源码,spring cloud,ribbon,hystrix,超时设置文章来源地址https://www.toymoban.com/news/detail-805420.html

SpringCloud源码系列持续更新

  1. Spring Cloud OpenFegin(创建、发送请求)源码
  2. SpringCloud 之HttpClient、HttpURLConnection、OkHttpClient切换源码
  3. SpringCloud 源码系列之全局 Fegin 日志收集(okHttpClient、httpClient编码配置)

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

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

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

相关文章

  • 微服务springcloud 06.feign框架,配合ribbon 负载均衡和重试,配合hystrix 降级,监控和熔断测试

    feign是ribbon +hystrix 的整合 01.新建 sp09-feign 项目 第一步: 第二步:选择依赖: pom.xml 需要添加 sp01-commons 依赖: 第三步:修改sp09-feign项目的application.yml 第四步:sp09-feign的主程序添加 @EnableDiscoveryClient 和 @EnableFeignClients 02.feign 声明式客户端 第一步:声明三个代理接口 这里的

    2024年02月10日
    浏览(55)
  • SpringCloud-Hystrix服务熔断与降级工作原理&源码

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这

    2024年02月14日
    浏览(52)
  • SpringCloud系列:负载均衡组件-Ribbon

    作者平台: | CSDN:blog.csdn.net/qq_41153943 | 掘金:juejin.cn/user/651387… | 知乎:www.zhihu.com/people/1024… | GitHub:github.com/JiangXia-10… 本文一共4529字,预计阅读12分钟 前面几篇文章介绍了微服务相关的内容,比如什么是微服务,常见的一些服务注册中心组件,以及微服务之间是如何进

    2024年02月17日
    浏览(44)
  • SpringCloud 微服务系列——【服务间的通信方式、OpenFeign、Hystrix组件使用】

    ✅作者简介:2022年 博客新星 第八 。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:SpringCloud 微服务学习专栏 ✨特色专栏:国学周更-心性养成之路 🥭本文内容:SpringCloud 微服

    2023年04月24日
    浏览(41)
  • SpringCloud-Hystrix服务熔断与降级工作原理&源码 | 京东物流技术团队

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这

    2024年02月14日
    浏览(38)
  • springcloud3 hystrix实现服务降级的案例配置2

    \\\"服务器忙,请稍后在试\\\"不让客户达等待,立即返回一个友好的提示。 1.程序运行异常; 2.超时; 3.服务熔断触发服务降级; 4.线程池/信号量打满也会导致服务降级 2.1.1 pom文件 2.1.2 设置降级规则 代码  2.1.3 开启hystrix熔断 添加:@EnableHystrix 注解 2.2.1 pom文件 2.2.2 设置降级规

    2024年02月12日
    浏览(37)
  • 【SpringCloud】-OpenFeign实战及源码解析、与Ribbon结合

    OpenFeign(简称Feign)是一个声明式的Web服务客户端,用于简化服务之间的HTTP通信。与Nacos和Ribbon等组件协同,以支持在微服务体系结构中方便地进行服务间的通信; OpenFeign在默认情况下集成了Hystrix,提供了服务容错和服务降级的功能。 按照单一职责,也为了满足可复用、可

    2024年02月04日
    浏览(40)
  • 【SpringCloud】Ribbon定制化配置

    添加负载均衡算法Configuration 注意: 官方文档明确给出了 警告 : 这个自定义配置类不能放在@ComponentScan所扫描的当前包下以及子包下, 否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,达不到特殊化定制的目的了。 RestTemplate使用上面负载均衡算法 负载均衡算

    2024年02月12日
    浏览(37)
  • 基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】

    目录 一、前言 二、源码分析 三、负载均衡策略 如下图,我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求,在服务拉取的时候,主机名 localhost 是用服务名 userserver 代替的,那么该 url 是一个可访问的网络地址吗?   我们在浏览器中访问一下这个地址,果然不可用

    2024年02月03日
    浏览(46)
  • springcloud 中RestTemplate 是怎么和 ribbon整合,实现负载均衡的?源码分析

    RestTemplate 内置了一个 ClientHttpRequestInterceptor ,这个是一个拦截器操作,我们可以在请求的前后做一些事情。然后我们看一下这个类,这个类里面 有一个 intercept 方法。我们看下这个实现类,里面有一个 LoadBalancerInterceptor 实现类。 我们来看 LoadBalancerInterceptor 实现类。 然后我

    2024年02月09日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包