在微服务场景下,服务间调用链路加长,有时候一个部分出现问题可能会引起整个链路的崩溃,为此微服务中提出了如下两个概念:
- 服务熔断
- 服务降级
服务熔断
熔断来源于电路中断路器的概念,服务熔断指的是 当下游服务因为某种原因不可用或响应慢时,上游服务为了保证自己整体服务的可用性,不在调用下游服务而是直接返回,快速释放资源,直到下游服务恢复才继续调用
服务降级
当服务器压力剧增的时候,根据当前业务情况以及流量,对一些服务和页面有策略的降级,以此缓解服务器资源的压力以保障核心任务的正常运行,同时也保证了大部分客户能得到正常的响应。
服务熔断一般是针对调用的下游服务,而降级一般是从系统的整体考虑的
从官网找的Hystrix工作流图:

整体执行流程如下:
- 构造一个
HystrixCommand或HystrixObservableCommand - 执行上面构造的command,会涉及到如下四个方法:
K value = command.execute();
Future<K> fValue = command.queue();
Observable<K> ohValue = command.observe(); //hot observable
Observable<K> ocValue = command.toObservable(); //cold observable
- 如果调用允许缓存,判断请求的响应是否有缓存,如果有缓存,直接返回缓存内容
- 判断断路器是否打开,如果断路器打开那么执行步骤8,断路器没有打开,执行步骤5
- 如果线程池和队列或者信号量是否已经满了,如果已经满了,执行步骤8,没有达到阈值执行步骤6
- 执行
HystrixObservableCommand.construct()或HystrixCommand.run() - 统计计算断路器的状态,Hystrix会将请求的结果:成功、失败、拒绝、超时信息汇报给断路器,断路器根据这些信息是否打开断路器或关闭断路器
- 当command执行失败的时候,执行
Fallback - 当command执行成功,返回相应给调用者
断路器逻辑:

Hystrix是Netflix实现的服务限流、降级功能,可以完成隔离、限流、熔断、降级这些常用保护功能。Hystrix的隔离主要是基于线程隔离或者信号量隔离来实现的,服务隔离保证了不同服务之间的调用不会受其他服务影响。Hystrix的执行都是基于线程池异步调度执行的,而在方法调用上,同步方法实际也是异步执行的,只不过同步方法会阻塞等待,直到方法完成才返回。
基于Spring框架下,Hystrix基于AOP实现对方法的切面代理HystrixCommandAspect,获取方法是否有HystrixCollapser或HystrixCommand注解,如果方法上有这两个注解的话,那么Hystrix将在实际方法执行前执行Hystrix的逻辑。
Hystrix中通过HystrixCircuitBreaker来定义了断路器的相关逻辑,主要有两个实现:
- NoOpCircuitBreaker 不进行任何处理
- HystrixCircuitBreakerImpl Hystrix默认断路器实现
HystrixCircuitBreakerImpl主要就是基于HystrixCommandMetrics统计信息来设置当前断路器的状态:
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()) {

本文深入探讨了 Hystrix 中的服务熔断和服务降级机制,包括断路器的工作原理、配置参数及其在微服务架构中的应用。同时介绍了 Hystrix 的线程池隔离和信号量隔离策略。
最低0.47元/天 解锁文章
167万+

被折叠的 条评论
为什么被折叠?



