断路器原理

断路器在HystrixCommand和HystrixObservableCommand执行过程中起到至关重要的作用。查看一下核心组件HystrixCircuitBreaker

package com.netflix.hystrix;

import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.atomic.AtomicLong;

import java.util.concurrent.atomic.AtomicReference;

import com.netflix.hystrix.HystrixCommandMetrics.HealthCounts;

import rx.Subscriber;

import rx.Subscription;

public interface HystrixCircuitBreaker {

boolean allowRequest();

boolean isOpen();

void markSuccess();

void markNonSuccess();

boolean attemptExecution();

class Factory {

// String is HystrixCommandKey.name() (we can't use HystrixCommandKey directly as we can't guarantee it implements hashcode/equals correctly)

private static ConcurrentHashMap circuitBreakersByCommand = new ConcurrentHashMap();

}

class HystrixCircuitBreakerImpl implements HystrixCircuitBreaker {

}

static class NoOpCircuitBreaker implements HystrixCircuitBreaker {

}

}

下面先看一下该接口的抽象方法:

allowRequest(): 每个Hystrix命令的请求都通过它判断是否被执行(已经不再使用,使用attemptExecution()方法进行判断)

attemptExecution(): 每个Hystrix命令的请求都通过它判断是否被执行

isOpen(): 返回当前断路器是否打开

markSuccess(): 用来关闭断路器

markNonSuccess: 用来打开断路器

下面看一下该接口中的类:

Factory: 维护了一个Hystrix命令和HystrixCircuitBreaker的关系的集合ConcurrentHashMap circuitBreakersByCommand。其中key通过HystrixCommandKey来定义,每一个Hystrix命令都需要有一个Key来标识,同时根据这个Key可以找到对应的断路器实例。

NoOpCircuitBreaker: 一个啥都不做的断路器,它允许所有请求通过,并且断路器始终处于闭合状态

HystrixCircuitBreakerImpl:断路器的另一个实现类。

HystrixCircuitBreakerImpl介绍

在该类中定义了断路器的五个核心对象:

HystrixCommandProperties properties:断路器对应实例的属性集合对象

HystrixCommandMetrics metrics:用来让HystrixCommand记录各类度量指标的对象

AtomicReference status: 用来记录断路器的状态,默认是关闭状态

AtomicLong circuitOpened:断路器打开的时间戳,默认-1,表示断路器未打开

AtomicReference activeSubscription: 记录HystrixCommand

isOpen方法介绍

@Override

public boolean isOpen() {

if (properties.circuitBreakerForceOpen().get()) {

return true;

}

if (properties.circuitBreakerForceClosed().get()) {

return false;

}

return circuitOpened.get() >= 0;

}

用来判断断路器是否打开或关闭。主要步骤有:

如果断路器强制打开,返回true

如果断路器强制关闭,返回false

判断circuitOpened的值,如果大于等于0,返回true, 否则返回false

attemptExecution方法介绍

private boolean isAfterSleepWindow() {

final long circuitOpenTime = circuitOpened.get();

final long currentTime = System.currentTimeMillis();

final long sleepWindowTime = properties.circuitBreakerSleepWindowInMilliseconds().get();

return currentTime > circuitOpenTime + sleepWindowTime;

}

@Override

public boolean attemptExecution() {

if (properties.circuitBreakerForceOpen().get()) {

return false;

}

if (properties.circuitBreakerForceClosed().get()) {

return true;

}

if (circuitOpened.get() == -1) {

return true;

} else {

if (isAfterSleepWindow()) {

if (status.compareAndSet(Status.OPEN, Status.HALF_OPEN)) {

//only the first request after sleep window should execute

return true;

} else {

return false;

}

} else {

return false;

}

}

}

该方法的主要逻辑有以下几步:

如果断路器强制打开,返回false,不允许放过请求

如果断路器强制关闭,返回true,允许放过请求

如果断路器是关闭状态,返回true,允许放过请求

判断当前时间是否超过断路器打开的时间加上滑动窗口的时间,如果没有超过,返回false,不允许放过请求

如果没有超过,如果断路器是打开状态,并且设置断路器状态为半开状态成功时,返回true,允许放过请求

如果失败,则返回false,不允许放过请求

markSuccess方法

@Override

public void markSuccess() {

if (status.compareAndSet(Status.HALF_OPEN, Status.CLOSED)) {

//This thread wins the race to close the circuit - it resets the stream to start it over from 0

metrics.resetStream();

Subscription previousSubscription = activeSubscription.get();

if (previousSubscription != null) {

previousSubscription.unsubscribe();

}

Subscription newSubscription = subscribeToStream();

activeSubscription.set(newSubscription);

circuitOpened.set(-1L);

}

}

该方法主要用来关闭断路器,主要逻辑有以下几步:

如果断路器状态是半开并且成功设置为关闭状态时,执行以下步骤。

重置度量指标对象

取消之前的订阅,发起新的订阅

设置断路器的打开时间为-1

代码地址

java断路器原理_Netflix Hystrix断路器原理分析相关推荐

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

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

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

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

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

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

  4. Hystrix断路器执行原理

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

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

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

  6. common-collections中Java反序列化漏洞导致的RCE原理分析

    2019独角兽企业重金招聘Python工程师标准>>> common-collections中Java反序列化漏洞导致的RCE原理分析 隐形人真忙 · 2015/11/11 22:4 ...

  7. 并发编程五:java并发线程池底层原理详解和源码分析

    文章目录 java并发线程池底层原理详解和源码分析 线程和线程池性能对比 Executors创建的三种线程池分析 自定义线程池分析 线程池源码分析 继承关系 ThreadPoolExecutor源码分 ...

  8. java编程实现算符优先分析法,编译原理实验三-算符优先分析法

    编译原理实验3-算符优先分析法 #include #include #include #include #define SIZE 128 char priority[6][6]; //算符优先关系表数 ...

  9. 五、Hystrix断路器

    Hystrix断路器 概述 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每一个依赖关系在某些时候将不可避免的失败. 服务雪崩 多个微服务之间调用的时候,假如微服务A调用微服务 ...

最新文章

  1. 搜索引擎学习资源收集
  2. 使用 rsync / scp 命令下载linux文件,显示网速和进度
  3. 小程序服务器角色,小程序在我们的生活中扮演什么角色?
  4. mysql5.7 xtrabackup_MySQL 5.7 基于GTID建立运行主库的从库-xtrabackup+mysqldump
  5. ASP.NET页面请求处理
  6. 傻瓜方法求集合的全部子集问题(java版)
  7. webapi上传示例及调用方式(netframwork)
  8. Hyperledger04
  9. 使用google.zxing制作条形码和二维码
  10. 不用梯子——每日领取5块钱的ChatGPT体验券
  11. 六十星系之01紫微独坐子午
  12. 2023年5种最适合网络安全工程师学习运用的编程语言
  13. CMake 基础用法,掌握 CMake 诀窍
  14. ARM8/ARM7/A9/A15
  15. 毕业论文怎么写才能把重复率降到最低?
  16. 鲲鹏生态“开花结果”,这一次是鹏城云脑Ⅱ
  17. Google Earth Engine(GEE)——Landsat5-9融合后区域影像的筛选获取去重后的影像数量分析
  18. Kalman滤波在船舶GPS导航定位系统中的应用(含MATLAB仿真)
  19. 火狐html页面空白页,火狐修改空白新标签页背景颜色,适应深色主题
  20. 如何设置计算机断电自启动,如何设置电脑断电后来电自动开机?

热门文章

  1. 回顾《JavaScript高级程序设计》目录篇
  2. JavaScript模拟实现先进先出、先进后出效果
  3. html中怎样写css路径,CSS 书写位置
  4. 反论文抄袭检查,吼吼,终于找到了
  5. 微信小程序如何调用后台接口
  6. 数学建模——评价算法
  7. 网站导航栏SEO优化方法
  8. 奋斗吧,程序员——第四十五章 柔情似水,佳期如梦
  9. webstorm注册码
  10. 自治区计算机考试试题,2014新疆维吾尔自治区计算机等级考试试题 二级C试题试题及答案...