资讯专栏INFORMATION COLUMN

断路器HystrixCircuitBreaker

Integ / 3448人阅读

摘要:一个啥都不做的断路器,它允许所有请求通过,并且断路器始终处于闭合状态断路器的另一个实现类。主要步骤有如果断路器强制打开,返回如果断路器强制关闭,返回判断的值,如果大于等于,返回否则返回

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:断路器对应实例的属性集合对象/断路器对应HystrixCommand实例的属性对象
HystrixCommandMetrics metrics:用来让HystrixCommand记录各类度量指标的对象
AtomicReference status: 用来记录断路器的状态,默认是关闭状态
AtomicLong circuitOpened:断路器打开的时间戳,默认-1,表示断路器未打开
AtomicReference activeSubscription: 记录HystrixCommand

对接口的实现如下:

        @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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77428.html

相关文章

  • Netflix Hystrix路器原理分析

    摘要:断路器原理断路器在和执行过程中起到至关重要的作用。其中通过来定义,每一个命令都需要有一个来标识,同时根据这个可以找到对应的断路器实例。一个啥都不做的断路器,它允许所有请求通过,并且断路器始终处于闭合状态断路器的另一个实现类。 断路器原理 断路器在HystrixCommand和HystrixObservableCommand执行过程中起到至关重要的作用。查看一下核心组件HystrixCi...

    Lemon_95 评论0 收藏0
  • 云计算模型- 路器模式

    摘要:断路器模式也使系统能够检测出错误是否已被修复。断路器模式的目的和重试模式有所不同。断路器模式为在从错误中恢复的系统提供稳定性,同时降低对性能的影响。 断路器模式 当连接到远程服务或资源到时候,处理那些需要一段时间才能修复的系统缺陷。这能优化应用对稳定性和可靠性。 上下文和问题 在分布式环境中,对远端服务或资源的请求可能会由于诸如以下临时性错误而失败:缓慢的网络请求,连接超时,资源被过度...

    KoreyLee 评论0 收藏0
  • SpringCloud升级之路2020.0.x版-36. 验证路器正确性

    摘要:本系列代码地址上一节我们通过单元测试验证了线程隔离的正确性,这一节我们来验证我们断路器的正确性,主要包括验证配置正确加载即我们在配置例如中的加入的的配置被正确加载应用了。本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent上一节我们通过单元测试验证了线程隔离的正确性,这一节我们来验证我们断路器的正确性,主要包括:验证配置正确加载:即我们...

    NotFound 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<