zoukankan      html  css  js  c++  java
  • Spring Cloud 系列之Hystrix、Ribbon、Feign 源码剖析(一)引子

    系列目录

    Spring Cloud 系列之Hystrix、Ribbon、Feign 源码剖析(一)引子

    Spring Cloud 系列之Hystrix、Ribbon、Feign 源码剖析(二)原理概括

    Spring Cloud 系列之Hystrix、Ribbon、Feign 源码剖析(三)源码详解

    Spring Cloud 系列之Hystrix、Ribbon、Feign 源码剖析(四)总结提高

    一、引子

    前几天线上服务出现调用失败,架构是spring cloud Greenwich.SR4版本。线上日志排查后发现:feign client调用微服务一秒就自动超时失败。上网搜了一下,说hystrix默认超时配置就是1秒,加了如下配置,问题解决:

    #Feign
    #使用apahce httpclient 连接池
    feign:
      httpclient:
        enabled: true
      hystrix:
        enabled: true
    
    #超时处理
    hystrix:
      command:
        default:
          execution:
            isolation:
              strategy: SEMAPHORE
              thread:
                timeoutInMilliseconds: 30000
    
    
    # 全局ribbion超时配置
    ribbon:
      ConnectTimeout: 10000
      ReadTimeout: 10000

     如上图所示:

    1.feign.hystrix.enabled=true 代表开启熔断器

    2.hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=30000 熔断器超时毫秒数,30秒(默认1000)

    公式如下:

    Hystrix的超时时间=Ribbon的重试次数(包含首次) * (ribbon.ReadTimeout + ribbon.ConnectTimeout)

    这个超时,有什么官方佐证呢?

    查询 spring cloud官网后,找到如下一段:

    翻译如下:

    hystrix超时>ribbon超时(包含潜在的重试时间),例如ribbon连接超时1秒,重试3次,所以Hystrix超时必须>3秒

    至此,我们知道:

    1.hystrix默认超时1秒。

    2.hystrix超时>ribbon超时

    问题来了:怎么得知是1秒的???

    二、解决步骤

    揭露一下我的解决问题步骤,希望能给大家带来一点解决问题的思路。

    咱们采用三步骤:发现问题、分析问题、解决问题

    2.1 发现问题

    这里无非2个重点:

    • 使用spring cloud 全家桶,hystrix、ribbon、feign调用的原理清晰吗?
    • yml中的配置有哪些?使用的默认配置了解么?

    2.2 分析问题

    • 原理可以通过官方文档+源码(代码都是开源的)。没看懂?懒得看?现在源码级别的博客越来越少,大家浮躁的连博客都是抄袭的了...
    • 怎么得知具体有哪些配置?无头绪!!!

    结束了吗?

    经过阅读官方文档,发现Spring boot所有的jar包,yml自动补全配置在:spring-configuration-metadata.json或者additional-spring-configuration-metadata.json。前者是编译时自动生成的,后者是手动自定义的。后者可覆盖前者。(但是这也只是部分配置!!!大量细节配置在源码中!!!聊胜于无吧!!!

    如下图:

    具体看一下additional-spring-configuration-metadata.json内容如下:

    如上图:

    feign.hysgtrix.enabled 如果为true,开启hystrix熔断器。默认为false,不开启。

    feign.httpclient.enabled 开启使用apache http client 连接池,默认开启。

    问题来了,并没发现第一节的配置。

    老老实实地阅读源码后:

    在hysyrix-core-1.5.18.jar(在spring-cloud-starter-netflix-hystrix:2.1.4.RELEASE中 )中终于发现了配置类HystrixCommandProperties,中有一段默认配置  key=hystrix(propertyPrefix配置key前缀)+execution.isolation.thread.timeoutInMilliseconds 

     

    default_executionTimeoutInMilliseconds默认超时时间毫秒数=1000ms=1S

    果然是默认1秒,终于实锤了。我们来看一下这个配置的注释,彻底解密一下,如下图:

    如上图,实际业务执行时,取超时时间,就是取的executionTimeoutInMilliseconds这个属性。并且从1.4.0开始,超时不仅支持thread-isolated线程隔离,也支持semaphore-isolated信号量隔离。关于Hystrix的2种模式,Thread和Semaphore,后续章节会慢慢分析。

    2.3 解决问题

    本系列文章就是一次解决问题的实践。通过阅读官方文档+源码,彻底摸清Spring Cloud Hystrix+Ribbon+Feign的老底儿。后续章节,就是我们一步步解决问题的过程。

    再次重申,技术容不得偷懒!!!

  • 相关阅读:
    Liferay安装maven
    html之pre标签
    a标签使用注意事项
    AngularJS学习记录
    页面不能访问,抛出 spring java.lang.IllegalArgumentException: Name for argument type [java.lang.String] 异常
    ant编译的时候,报错文件不存在,以及版本不一致
    Eclipse 更改Java 版本的方法
    总结一下本次准备环境时遇到的问题,以供下次参考
    数据上下文中的AddOrUpdate方法
    推荐一款github管理神器SourceTree
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/12418927.html
Copyright © 2011-2022 走看看