Hystrix 源码解读

转载请注明出处:

1.引入依赖:

2. 查看自动配置类HystrixCircuitBreakerConfiguration

查看 org.springframework.cloud.spring-cloud-starter-netflix-hystrix 包中的自动配置类,Hystrix 的断路器的自动配置类在 org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration 类中

3.查看 HystrixCircuitBreakerConfiguration 类的实现

Hystrix 的熔断开启与实现时通过 上面中的 HystrixCommandAspect 类实现的

4.查看 HystrixCommandAspect 类的实现

该切面类中的实现为:

通过代码看出hystrix 通过封装一个切面,在切面中 拦截 对使用了 @HystrixCommand 与 @HystrixCollapser注解的方法进行增强;

重点看这行代码:

是如何创建HystrixCommand对象的。

分析的是HystrixCommand注解,所以走else里的分析。整体构造过程是 GenericCommand -> AbstractHystrixCommand -> HystrixCommand -> AbstractCommand, 构建GenericCommand的过程,我们主要还是看AbstractCommand的构造方法。

5.查看 切面方法实现细节

hystrix 执行的流程图:

6.核心实现

HystrixCommandAspect.methodsAnnotatedWithHystrixCommand 中的execute方法,execute 方法为 hystrix 实现的核心:

判断是否为同步,还是异步,还是观察着模式,异步方式是通过 Future 封装,用Future 对象的get方法,阻塞等待返回结果,以达到同步效果。

在这里只查看同步的方式: 调用链路是:HystrixCommand.execute() -> queue() -> toObservable()

1.是否使用缓存

如果开启缓存,请求首先会返回缓存中的结果。

2.是否开启熔断

当运行hystrix命令时,会判断是否熔断,如果已经熔断,hystrix将不会执行命令,而是直接执行fallback。等熔断关闭了,在执行命令。

熔断器关闭或打开的判断,

接着分析 this.circuitBreaker.allowRequest()

https://www.iocoder.cn/Hystrix/command-execute-mode/

Original: https://www.cnblogs.com/zjdxr-up/p/16339325.html
Author: 香吧香
Title: Hystrix 源码解读

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611479/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 运维故障收集-考勤机无法连接考勤机网关系统故障验证流程

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/linuxshare/p/16474967.htmlAu…

    Linux 2023年6月6日
    0102
  • nacos集群部署

    使用外置数据源-mysql 如果是使用外部数据源,只能是mysql数据库。这样的话需要在mysql数据库里面创建一个数据库,初始化语句在conf目录下,再分配一个可以读写该库的账号…

    Linux 2023年6月8日
    0102
  • jquery ui实现文字下拉联想

    效果图:输入”伤寒”两个字,会自动联想下拉展示带有”伤寒”两个字的内容 前端用的是jquery ui做展示,后端数据接口是json数…

    Linux 2023年6月7日
    087
  • 我叫Mongo,干了「查询终结篇」,值得您拥有

    这是mongo第三篇”查终结篇”,后续会连续更新5篇 mongodb的文章总结上会有一系列的文章,顺序是先学会怎么用,在学会怎么用好,戒急戒躁,循序渐进,跟…

    Linux 2023年6月14日
    0134
  • 用 shell 脚本做自动化测试

    项目中有一个功能,需要监控本地文件系统的变更,例如文件的增、删、改名、文件数据变动等等。之前只在 windows 上有实现,采用的是 iocp + ReadDirectoryCha…

    Linux 2023年6月6日
    087
  • SHELL编程-牛客网题目(持续更新..)

    SHELL编程题目及solution (牛客网) 描述:写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数示例:假设 nowcoder.txt 内容如下: #…

    Linux 2023年6月7日
    096
  • Log4j 日志框架

    Log4j(Log for java)是 Apache 的一个开源项目,通过使用 Log4j,可以控制日志信息输送的目的地是控制台或文件等,也可以控制每一条日志的输出格式。通过定义…

    Linux 2023年6月8日
    0142
  • SQL查询语句–统计

    — 1、日统计查询填补 i->为时间差的天数 2022-05-10为终止时间 SET @i :=- 1; SELECT date_format( DATE_SUB( ’20…

    Linux 2023年6月14日
    088
  • c++的bind使用方法

    c++的bind使用方法 除了容器有适配器之外,其实函数也提供了适配器,适配器的特点就是将一个类型改装成为拥有子集功能的新的类型。其中函数的适配器典型的就是通过 std::bind…

    Linux 2023年6月14日
    095
  • shell脚本 -d 是目录文件,那么-e,-f分别是什么?还有”! -e”这又是什么意思呢?

    -e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则…

    Linux 2023年5月28日
    0184
  • Docker镜像构建之Dockerfile

    在 Docker 中构建镜像最常用的方式就是使用 Dockerfile。Dockerfile 是一个用来构建镜像的文本文件。 官方文档:https://docs.docker.co…

    Linux 2023年5月27日
    0140
  • sed与awk命令

    1.1 sed命令语法 在看单个命令以前,需要回顾一下关于所有sed命令的两点语法。在上一个章中,我们介绍了其大部分内容。行地址对于任何命令都是可选的。它可以使一个模式,被描述为由…

    Linux 2023年6月7日
    0114
  • Linux下侦听端口被占用,怎么解决?

    不知道你有没有遇到过这种问题:在同一台物理机器上,服务A 启动时侦听 端口1 ,同时它也作为客户端去连接 服务B,连接服务B时候会随机一个端口号,假如随机的是 端口2 ,这个时候 …

    Linux 2023年6月13日
    0101
  • 不同网段之间实现GDB远程调试功能

    在开发过程中,使用gdb远程调试时,会碰到 Linux 服务器的网段和板载设备的网段不是一样的,不能正常使用 gbd 远程调试功能。 板载设备和电脑连接路由器,属于同一个网段,如1…

    Linux 2023年6月7日
    097
  • 客观的聊一聊,裁员这件糟心事

    时间在走,环境在变,互联网有点卷不动了; 捋一捋最近互联网上关于职场的热点:裁员,优化,毕业,向社会输送人才,求职;你方唱罢他方登场,持续横跳热搜; 年初到现在五月底,身边已经有好…

    Linux 2023年6月14日
    082
  • docker-compose安装,yml文件配置

    1、离线安装 https://github.com/docker/compose/releases 移动文件 mv docker-compose-linux-x86_64 /usr…

    Linux 2023年5月27日
    0111
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球