java断路器原理_Netflix Hystrix断路器原理分析
断路器原理
断路器在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断路器原理分析相关推荐
- Hystrix核心原理和断路器源码解析
Hystrix运行原理 构造一个HystrixCommand或HystrixObservableCommand对象 执行命令. 检查是否已命中缓存,如果命中直接返回. 检查断路器开关是否打开,如果打开 ...
- Hystrix断路器原理及实现(服务降级、熔断、限流)
Hystrix断路器原理及实现(服务降级.熔断.限流) 分布式系统面临的问题 Hystrix重要概念(面试常考) Hystrix案例 Hystrix 服务提供者 Hystrix 服务消费者 原因与解决 ...
- Hystrix面试 - 深入 Hystrix 断路器执行原理
Hystrix面试 - 深入 Hystrix 断路器执行原理 RequestVolumeThreshold HystrixCommandProperties.Setter().withCircuitB ...
- Hystrix断路器执行原理
深入 Hystrix 断路器执行原理 Hystrix熔断机制,用于监控微服务调用情况,当失败的情况达到预定的阈值(5秒失败20次),会打开断路器,拒绝所有请求,直到服务恢复正常为止. circuitB ...
- Netflix Hystrix断路器简介与工作原理
一.前言? 1.Netflix Hystrix断路器是什么? Netflix Hystrix是SOA/微服务架构中提供服务隔离.熔断.降级机制的工具/框架.Netflix Hystrix是断路器的一种 ...
- common-collections中Java反序列化漏洞导致的RCE原理分析
2019独角兽企业重金招聘Python工程师标准>>> common-collections中Java反序列化漏洞导致的RCE原理分析 隐形人真忙 · 2015/11/11 22:4 ...
- 并发编程五:java并发线程池底层原理详解和源码分析
文章目录 java并发线程池底层原理详解和源码分析 线程和线程池性能对比 Executors创建的三种线程池分析 自定义线程池分析 线程池源码分析 继承关系 ThreadPoolExecutor源码分 ...
- java编程实现算符优先分析法,编译原理实验三-算符优先分析法
编译原理实验3-算符优先分析法 #include #include #include #include #define SIZE 128 char priority[6][6]; //算符优先关系表数 ...
- 五、Hystrix断路器
Hystrix断路器 概述 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每一个依赖关系在某些时候将不可避免的失败. 服务雪崩 多个微服务之间调用的时候,假如微服务A调用微服务 ...
最新文章
- 搜索引擎学习资源收集
- 使用 rsync / scp 命令下载linux文件,显示网速和进度
- 小程序服务器角色,小程序在我们的生活中扮演什么角色?
- mysql5.7 xtrabackup_MySQL 5.7 基于GTID建立运行主库的从库-xtrabackup+mysqldump
- ASP.NET页面请求处理
- 傻瓜方法求集合的全部子集问题(java版)
- webapi上传示例及调用方式(netframwork)
- Hyperledger04
- 使用google.zxing制作条形码和二维码
- 不用梯子——每日领取5块钱的ChatGPT体验券
- 六十星系之01紫微独坐子午
- 2023年5种最适合网络安全工程师学习运用的编程语言
- CMake 基础用法,掌握 CMake 诀窍
- ARM8/ARM7/A9/A15
- 毕业论文怎么写才能把重复率降到最低?
- 鲲鹏生态“开花结果”,这一次是鹏城云脑Ⅱ
- Google Earth Engine(GEE)——Landsat5-9融合后区域影像的筛选获取去重后的影像数量分析
- Kalman滤波在船舶GPS导航定位系统中的应用(含MATLAB仿真)
- 火狐html页面空白页,火狐修改空白新标签页背景颜色,适应深色主题
- 如何设置计算机断电自启动,如何设置电脑断电后来电自动开机?