1、背景

调用链路:A》B》C,如果C不可用,将影响B,进而影响A,形成雪崩效应。

2、熔断机制

Hystrix Command请求后端服务失败数量超过一定比例(默认50%)且10秒内超过20个请求, 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒,每隔5s允许一个请求通过), 自动切换到半开路状态(HALF-OPEN). 这时会判断下一次请求的返回情况, 如果请求成功(请求都是健康的(RT<250ms)), 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力.
熔断针对方法级别,A服务调用B服务的B1接口熔断,此时A服务依旧能调用B服务的B2接口。虽不直接影响调用B2接口,但由于熔断被触发,必然请求频率及错误比例会较高,这将导致单实例性能受到影响,从而间接影响A服务调用B服务的B2接口,表现通常为超时。

Note:测试发现,服务抛出的异常也会引发熔断。
HystrixBadRequestException异常将不会触发熔断。

Hystrix如何解决依赖隔离
  1. Hystrix使用命令模式HystrixCommand(Command)包装依赖调用逻辑,每个命令在单独线程中/信号授权下执行。
  2. 可配置依赖调用超时时间,超时时间一般设为比99.5%平均时间略高即可.当调用超时时,直接返回或执行fallback逻辑。
  3. 为每个依赖提供一个小的线程池(或信号),如果线程池已满调用将被立即拒绝,默认不采用排队,加速失败判定时间。
  4. 依赖调用结果分:成功,失败(抛出异常),超时,线程拒绝,短路。 请求失败(异常,拒绝,超时,短路)时执行fallback(降级)逻辑。
  5. 提供熔断器组件,可以自动运行或手动调用,停止当前依赖一段时间(10秒),熔断器默认错误率阈值为50%,超过将自动运行。
  6. 提供近实时依赖的统计和监控。

3、添加熔断机制

Note:
以demo中提到的SpringCloudConsumer项目为例,该服务将通过SpringCloudProducerFeignClient接口调用SpringCloudProducer服务。

3.1、application.properties配置
#开启熔断机制
feign.hystrix.enabled=true
# 设置hystrix超时时间,默认1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=60000
# 是否开启超时,默认false,不建议开启
# hystrix.command.default.execution.isolation.thread.interruptOnTimeout=false
# 最大线程数量,默认10,Fast Fail 应用,建议使用默认值。
# hystrix.threadpool.default.coreSize=20
# 允许在队列中的等待的任务数量,默认5,Fast Fail 应用,建议使用默认值。
# hystrix.threadpool.default.queueSizeRejectionThreshold=10# queueSizeRejectionThreshold默认值是5,允许在队列中的等待的任务数量。maxQueueSize默认值是-1,队列大小。如果是Fast Fail 应用,建议使用默认值。线程池饱满后直接拒绝后续的任务,不再进行等待。即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求也会被拒绝。
3.2、创建熔断回调类

在feignClient同级目录创建目录fallback,在hystrix目录新建回调类。回调类分为含异常信息的回调类(以FallbackFactory为后缀),以及不含异常信息的回调类(以Fallback为后缀),二选一即可。

3.2.1、创建含异常信息的回调类
@Component
public class SpringCloudProducerFallbackFactory implements FallbackFactory<SpringCloudProducerFeignClient> {/*** 可获取熔断异常,重写接口中的各个方法分别返回带异常信息的熔断信息.** @param cause 异常信息(可用于记录日志)* @return FeignClient*/@Overridepublic SpringCloudProducerFeignClient create(Throwable cause) {return new SpringCloudProducerFeignClient() {@Overridepublic String testTrackID(String param) {return "testTrackID:" + cause.getMessage();}@Overridepublic RoomRelationBo getRoomRelationByKeyID(String KeyID) {return null;}};}
}
3.2.2、创建不含异常信息的回调类
@Component
public class SpringCloudProducer2Fallback implements SpringCloudProducerFeignClient {@Overridepublic String testTrackID(String param) {return "[Hystrix]testTrackID"; // 自定义熔断返回信息}@Overridepublic RoomRelationBo getRoomRelationByKeyID(String KeyID) {return null;}
}
3.3、为FeignClient指定fallback或fallbackFactory
//@FeignClient(name = "spring-cloud-producer",fallback= SpringCloudProducerFallback.class)
@FeignClient(name = "spring-cloud-producer",fallbackFactory= SpringCloudProducerFallbackFactory.class)
public interface SpringCloudProducerFeignClient {@PostMapping(value = "/api/testTrackID")public String testTrackID(@RequestParam(value = "param") String param);@GetMapping(value = "/api/getRoomRelationByKeyID")public RoomRelationBo getRoomRelationByKeyID(@RequestParam("keyID") String KeyID);
}
3.4、依赖配置

引入依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

注解:
应用主类Application上加上@EnableCircuitBreaker或@EnableHystrix注解开启Hystrix的使用。


4、Hystrix配置说明

  1. 统计滚动的时间窗口 default 10000 ten seconds
    withMetricsRollingStatisticalWindowInMilliseconds(10000)
  2. 滚动时间窗口 bucket 数量 default
    withMetricsRollingStatisticalWindowBuckets(10)
  3. 采样时间间隔 default 500
    withMetricsHealthSnapshotIntervalInMilliseconds(1)
  4. 熔断器在整个统计时间内是否开启的阀值,默认20。也就是10秒钟内至少请求20次,熔断器才发挥起作用
    withCircuitBreakerRequestVolumeThreshold(20)
  5. 默认:50。当出错率超过50%后熔断器启动.
    withCircuitBreakerErrorThresholdPercentage(30)
  6. 熔断器默认工作时间,默认:5秒.熔断器中断请求5秒后会关闭重试,如果请求仍然失败,继续打开熔断器5秒,如此循环
    withCircuitBreakerSleepWindowInMilliseconds(1000)
  7. 隔离策略
    withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
  8. 信号量隔离时最大并发请求数
    withExecutionIsolationSemaphoreMaxConcurrentRequests(2)
  9. 命令组名,该命令属于哪一个组,可以帮助我们更好的组织命令。
    withGroupKey(HystrixCommandGroupKey.Factory.asKey(“HelloGroup”))
  10. 命令名称,每个CommandKey代表一个依赖抽象,相同的依赖要使用相同的CommandKey名称。依赖隔离的根本就是对相同CommandKey的依赖做隔离。
    andCommandKey(HystrixCommandKey.Factory.asKey(“Hello”)
  11. 所属线程池的名称,同样配置的命令会共享同一线程池,若不配置,会默认使用GroupKey作为线程池名称。
    andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey(“HelloThreadPool”))
  12. 命令属性,设置包括断路器的配置,隔离策略,降级设置,以及一些监控指标等。
  13. 线程池属性,配置包括线程池大小,排队队列的大小等。

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000
超时时间,默认1000ms
execution.timeout.enabled
是否开启超时,默认true
execution.isolation.thread.interruptOnTimeout
当超时的时候是否中断(interrupt) HystrixCommand.run()执行

配置说明官方文档:https://github.com/Netflix/Hystrix/wiki/Configuration

熔断器Hystrix配置及使用相关推荐

  1. 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)

    在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用.springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使 ...

  2. 《深入理解 Spring Cloud 与微服务构建》第九章 熔断器 Hystrix

    <深入理解 Spring Cloud 与微服务构建>第九章 熔断器 Hystrix 文章目录 <深入理解 Spring Cloud 与微服务构建>第九章 熔断器 Hystrix ...

  3. springcloud 熔断器Hystrix的具体使用

    springcloud 熔断器Hystrix的具体使用 说起springcloud熔断让我想起了去年股市中的熔断,多次痛的领悟,随意实施的熔断对整个系统的影响是灾难性的,好了接下来我们还是说正事. 熔 ...

  4. 【微服务】微服务熔断器--Hystrix

    微服务熔断器--Hystrix 前言 什么是熔断? 什么是降级? 熔断和降级的区别 Hystrix的隔离机制? 什么是Fallback? 熔断器的使用 导入依赖 启动类开启Hystrix配置 声明服务 ...

  5. 关于熔断器Hystrix替代方案的调研报告

    关于熔断器Hystrix替代方案的调研报告 一.背景 Netflix宣布停止Hystrix熔断器的开发,目前进入了维护模式.同时,也指出了Hystrix 1.5.18版本足够满足现阶段的应用(详细请参 ...

  6. 第六章 服务熔断器Hystrix

    6-1.Hystrix是什么? ​   在微服务的框架中,我们是将一个单体应用拆分成多个服务单元,各个服务单元之间通过注册中心彼此发现和消费对方提供的服务,每个服务器单元都是单独部署,在各自服务的运行 ...

  7. SpringCloud使用熔断器Hystrix

    文章目录 1. 配置 1.1 远程调用配置 1.2 测试远程调用 1.3 使用熔断器Hystrix 1.4 测试熔断器 1. 配置 Feign是简化Java HTTP客户端开发的工具(java-to- ...

  8. 微服务-熔断器Hystrix

    1. 雪崩效应 复杂的分布式体系结构中的应用程序很多都有依赖调用关系, 每个依赖关系有些时候会出现不可避免的失败(异常,超时,网络故障等). 这种多个服务层调用,基础服务的故障可能会导致级联故障,进而 ...

  9. 熔断器-hystrix使用

    更多好文 v. golang技术实验室 熔断器 常见业务场景 如图,个人订单查看和商品详情的展示 当前服务系统都是微服务,模块之间的调用联系紧密. 商品模块是做了限流的操作,可以扛住一定的压力,但是拒 ...

最新文章

  1. 15 年工龄的资深技术专家职场历程自述
  2. 论文写作思路_2018年的16个写作思路
  3. rxtx串口事件不触发_一种串口高效收发思路及方案
  4. Spark TopN
  5. WebPack配置文件抽离存放
  6. vue项目基本环境的配置与初始化
  7. python安装pandas太慢_pytorch 安装缓慢 或者报错问题 pandas 安装
  8. gtj2018如何生成工程量报表_工程量清单计价规范2018
  9. 数据采集卡的模拟输入信号到底应该怎么接线
  10. Problem A: 小勇学分数
  11. 利用Chrome浏览器的开发者工具控制网速
  12. 求知方面无妨多一点,生活方面无妨省一点
  13. word模板中添加图片
  14. 安卓使用服务完成音乐播放器
  15. 光学雨量计对比翻斗式雨量计的优势
  16. PhotoMOS输出光电耦合器的概要
  17. 星际战甲堕落轰击者结合目标_星际战甲牺牲任务流程
  18. python agg
  19. Long Way To Go 之 Python 2
  20. PhotoShop CS6 安装及破解

热门文章

  1. 网站建设(1)——域名的类型、选择和购买
  2. Altium Designer16 软件汉化步骤
  3. 腾讯免费企业邮箱服务器,如何免费申请腾讯企业邮箱?
  4. 表情包组件(vue)
  5. mysql数据库技术与项目李锡辉_《MySQL数据库技术与项目应用教程 李锡辉 ,王樱 9787115474100 人》李锡辉,王樱著【摘要 书评 在线阅读】-苏宁易购图书...
  6. python控制软件操作流程_python入门篇之介绍和流程控制(一)
  7. 嵌入式计算机是专用计算机吗,什么是嵌入式计算机?
  8. Spring Cloud 链路追踪
  9. 本地安装nginx部署项目
  10. 通过 汇编了解C语言 指针 悬垂指针概念