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的老底儿。后续章节,就是我们一步步解决问题的过程。

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

  • 相关阅读:
    HBase with MapReduce (MultiTable Read)
    HBase with MapReduce (SummaryToFile)
    HBase with MapReduce (Summary)
    HBase with MapReduce (Read and Write)
    HBase with MapReduce (Only Read)
    Hbase中的BloomFilter(布隆过滤器)
    HBase的快照技术
    How To Use Hbase Bulk Loading
    Cloudera-Manager修改集群的IP
    Java中的HashSet和TreeSet
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/12418927.html
Copyright © 2011-2022 走看看