系列目录

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

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

Spring Cloud 系列之Hystrix、Ribbon、Feign 源码剖析(一)引子的更多相关文章

  1. 微服务架构 | *2.3 Spring Cloud 启动及加载配置文件源码分析(以 Nacos 为例)

    目录 前言 1. Spring Cloud 什么时候加载配置文件 2. 准备 Environment 配置环境 2.1 配置 Environment 环境 SpringApplication.prep ...

  2. spring cloud 系列第4篇 —— feign 声明式服务调用 (F版本)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.feign 简介 在上一个用例中,我们使用ribbon+restTem ...

  3. 架构师入门:Spring Cloud系列,Hystrix与Eureka的整合

    和Ribbon等组件一样,在项目中,Hystrix一般不会单独出现,而是会和Eureka等组件配套出现.在Hystrix和Eureka整合后的框架里,一般会用到Hystrix的断路器以及合并请求等特性 ...

  4. SpringCloud学习笔记(14)----Spring Cloud Netflix之Hystrix对Feign的支持

    1. Hystrix对Feign的支持 添加Feign中IUserBiz的实现类HystrixFallBack: package com.wangx.cloud.springcloud02consum ...

  5. Spring Cloud系列文,Feign整合Ribbon和Hysrix

    在本博客之前的Spring Cloud系列里,我们讲述了Feign的基本用法,这里我们将讲述下Feign整合Ribbon实现负载均衡以及整合Hystrix实现断路保护效果的方式. 1 准备Eureka ...

  6. drf源码剖析系列(系列目录)

    drf源码剖析系列(系列目录) 01 drf源码剖析之restful规范 02 drf源码剖析之快速了解drf 03 drf源码剖析之视图 04 drf源码剖析之版本 05 drf源码剖析之认证 06 ...

  7. flask源码剖析系列(系列目录)

    flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...

  8. spring cloud 2.x版本 Ribbon服务发现教程(内含集成Hystrix熔断机制)

    本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 前言 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...

  9. Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?

    Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题? Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解 ...

  10. Spring Cloud系列(三):Eureka源码解析之服务端

    一.自动装配 1.根据自动装配原理(详见:Spring Boot系列(二):Spring Boot自动装配原理解析),找到spring-cloud-starter-netflix-eureka-ser ...

随机推荐

  1. Keepalive-Haproxy高可用介绍

    假设我们现在开发了一个应用应用的端口号为 8080,这个应用我们想让它去实现一个负载均衡的访问,就是说我们有两台服务器都部署了我们的 8080 应用,我们想让它一会访问 ip 为: 192.168.0 ...

  2. 希捷推出IronWolf Pro 24TB硬盘:CMR构建、285MB/s传输速率

    希捷推出了全新IronWolf Pro 24TB硬盘,采用3.5寸规格,满足中小企业和NAS环境需求. 据了解,新款硬盘采用了希捷AgileArray技术,针对NAS系统进行了优化.其通过双平面平衡和 ...

  3. 关于Docker容器中的DNS配置

    Docker: 1.启动时指定: docker run --dns 8.8.8.8 busybox:latest 2.全局配置: vi /etc/docker/daemon.json { " ...

  4. C++遴选出特定类型的文件或文件名符合要求的文件

      本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法.   首先,我们来明确一下本文所需实现的需求.现在有一个文件夹,其中包含了很多文件,如下图所示:我们如果想获取其中所 ...

  5. [Java]ArrayList源码解析

    ArrayList源码解析 1. 核心源码解读 package java.util; import java.util.function.Consumer; import java.util.func ...

  6. C# 二十年语法变迁之 C# 7参考

    C# 二十年语法变迁之 C# 7参考 https://benbowen.blog/post/two_decades_of_csharp_iii/ 自从 C# 于 2000 年推出以来,该语言的规模已经 ...

  7. HDFS文件目录与LiveNodes 数量关系

  8. NC24870 [USACO 2009 Dec G]Video Game Troubles

    题目链接 题目 题目描述 Farmer John's cows love their video games! FJ noticed that after playing these games th ...

  9. java 从零开始手写 RPC (06) reflect 反射实现通用调用之客户端

    通用调用 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 java 从零开始手写 RPC (03) 如何 ...

  10. DOM和BOM的区别

    DOM和BOM的区别 在浏览器中运行的JavaScript可以认为由三部分组成:ECMAScript描述了该语言的语法和基本对象,DOM文档对象模型描述了处理网页内容的方法和接口,BOM浏览器对象模型 ...