0. 前言

  • SpringBoot版本:2.1.9.RELEASE
  • SpringCloud版本:Greenwich.SR4

1. HystrixCircuitBreaker

public interface HystrixCircuitBreaker {// 是否允许请求public boolean allowRequest();// 断路器是否开启public boolean isOpen();// 关闭断路器void markSuccess();}

2. HystrixCircuitBreakerImpl

static class HystrixCircuitBreakerImpl implements HystrixCircuitBreaker {// 熔断配置信息private final HystrixCommandProperties properties;// 熔断指标信息private final HystrixCommandMetrics metrics;// 断路器是否开启private AtomicBoolean circuitOpen = new AtomicBoolean(false);// 记录断路器开启或最近测试请求时间private AtomicLong circuitOpenedOrLastTestedTime = new AtomicLong();protected HystrixCircuitBreakerImpl(HystrixCommandKey key, HystrixCommandGroupKey commandGroup, HystrixCommandProperties properties, HystrixCommandMetrics metrics) {this.properties = properties;this.metrics = metrics;}public void markSuccess() {if (circuitOpen.get()) {// 如果断路器开启,则关闭if (circuitOpen.compareAndSet(true, false)) {// 重置熔断指标信息metrics.resetStream();}}}@Overridepublic boolean allowRequest() {if (properties.circuitBreakerForceOpen().get()) {// 如果配置了断路器强制开启,返回 false 不允许发起请求return false;}if (properties.circuitBreakerForceClosed().get()) {// 如果配置了断路器强制关闭,返回 true 允许发起请求// 但是还是要调用 isOpen() 方法处理断路器相关信息isOpen();return true;}// 两个条件满足其一则允许请求://     1. 断路器认为是关闭的//     2. 允许尝试一次请求return !isOpen() || allowSingleTest();}public boolean allowSingleTest() {long timeCircuitOpenedOrWasLastTested = circuitOpenedOrLastTestedTime.get();if (circuitOpen.get() && System.currentTimeMillis() > timeCircuitOpenedOrWasLastTested + properties.circuitBreakerSleepWindowInMilliseconds().get()) {if (circuitOpenedOrLastTestedTime.compareAndSet(timeCircuitOpenedOrWasLastTested, System.currentTimeMillis())) {// 断路器开启后,每隔一定时间(默认5s)允许尝试一次请求return true;}}return false;}@Overridepublic boolean isOpen() {if (circuitOpen.get()) {// 断路器开启,返回 truereturn true;}// 获取健康指标信息HealthCounts health = metrics.getHealthCounts();if (health.getTotalRequests() < properties.circuitBreakerRequestVolumeThreshold().get()) {// 如果在最近10s(默认)请求总数小于20次(默认)// 则认为断路器是关闭的return false;}if (health.getErrorPercentage() < properties.circuitBreakerErrorThresholdPercentage().get()) {// 如果在最近10s(默认)请求失败率小于50%(默认)// 则认为断路器是关闭的 return false;} else {// 记录断路器状态为开启if (circuitOpen.compareAndSet(false, true)) {circuitOpenedOrLastTestedTime.set(System.currentTimeMillis());return true;} else {return true;}}}}

3. 总结

  • 断路规则:

  • 断路器开启后,单位时间内允许尝试一次请求:

    学习参考:掘金小册《SpringCloudNetflix 源码解读与原理分析》

Hystrix-断路器核心原理相关推荐

  1. Hystrix面试 - 深入 Hystrix 断路器执行原理

    Hystrix面试 - 深入 Hystrix 断路器执行原理 RequestVolumeThreshold HystrixCommandProperties.Setter().withCircuitB ...

  2. Hystrix断路器执行原理

    深入 Hystrix 断路器执行原理 Hystrix熔断机制,用于监控微服务调用情况,当失败的情况达到预定的阈值(5秒失败20次),会打开断路器,拒绝所有请求,直到服务恢复正常为止. circuitB ...

  3. 深入 Hystrix 断路器执行原理

    本系列内容转载自git项目advancejava RequestVolumeThreshold HystrixCommandProperties.Setter().withCircuitBreaker ...

  4. Hystrix核心原理和断路器源码解析

    Hystrix运行原理 构造一个HystrixCommand或HystrixObservableCommand对象 执行命令. 检查是否已命中缓存,如果命中直接返回. 检查断路器开关是否打开,如果打开 ...

  5. Hystrix断路器原理

    断路器 作用 断路器的作用在于当一个请求无法进行或者需要暂时屏蔽时,我们可以在请求执行前将这个请求打断,从而达到暂时屏蔽请求的目的.在我们的工作过程中,这样的场景通常表现为一个请求的提供端由于某种原因 ...

  6. Hystrix断路器原理及实现(服务降级、熔断、限流)

    Hystrix断路器原理及实现(服务降级.熔断.限流) 分布式系统面临的问题 Hystrix重要概念(面试常考) Hystrix案例 Hystrix 服务提供者 Hystrix 服务消费者 原因与解决 ...

  7. Hystrix流程分析及断路器工作原理

    上一篇转载的文章主要讲了Hystrix的应用场景.基础组件概念以及从源码的角度阐述了基本应用.本篇文章主要借鉴官方文档介绍Hystrix的工作流程及断路器的原理,最后说一下与SpringCloud的简 ...

  8. Netflix Hystrix断路器简介与工作原理

    一.前言? 1.Netflix Hystrix断路器是什么? Netflix Hystrix是SOA/微服务架构中提供服务隔离.熔断.降级机制的工具/框架.Netflix Hystrix是断路器的一种 ...

  9. Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)【Dalston版】

    前言 在前两篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>和<Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)&g ...

  10. RPC 实战与核心原理分析

    RPC 实战与核心原理分析 RPCX是一个分布式的Go语言的 RPC 框架,支持Zookepper.etcd.consul多种服务发现方式,多种服务路由方式, 例子 服务端 package maini ...

最新文章

  1. CIO成功转型为战略性业务领导者的五个要领
  2. 2018-1-20:左移和右移运算以及和(无符号右移)的区别以及位运算的小题目...
  3. 【论文解读】无需额外数据、Tricks、架构调整,CMU开源首个将ResNet50精度提升至80%+新方法...
  4. How-to: Use the ShareLib in Apache Oozie
  5. secureCrT夜间模式
  6. XGBoost入门及实战
  7. leetcode448. 找到所有数组中消失的数字 天秀记录法
  8. 腾讯视频与中国电信签署战略合作协议 共同成立5G联合实验室
  9. 【机器学习系列】变分推断第三讲:基于随机梯度上升法SGD的变分推断解法
  10. openwrt udp服务器_开启tftp服务器 tftp服务器的含义
  11. win7计算机usb解除禁用,win7
  12. 【教你快速让基本磁盘转换成动态磁盘】
  13. 重置计算机的本地策略,Win10怎样重置组策略/安全策略|Win10重置组策略/安全策略教程...
  14. Intel 80286工作模式
  15. Android性能优化系列:内存优化
  16. unity 官方案例之刚体控制人物移动
  17. (转)WAVE PCM 声音文件格式
  18. OLAP和OLTP的介绍
  19. 在线编辑php文件的代码
  20. 微信登陆接收不到onResp回调

热门文章

  1. 数据分析实战-15 一次学会python数据可视化的10种技能
  2. RabbitMq死信队列介绍
  3. 麻省理工公开课:微积分,中文字幕视频+PDF
  4. 智能优化算法:热交换优化算法 - 附代码
  5. 关于vue ant design vue 与谷歌浏览器最新版table表格超出长度错位的问题
  6. 证券交易系统显示服务器关闭,各位大师:晚上河北证券交易软件打不开怎么回 – 手机爱问...
  7. python每隔5秒执行一次
  8. 彻底卸载360安全卫士,遇到360文件无法删除的,需要提供管理员权限才能操作的,我就用cmd命令符带领来卸载它
  9. php.bbs模板,Xiuno BBS 模板风格开发参考
  10. 如何预防服务器数据丢失及丢失处理