断路器HystrixCircuitBreaker

断路器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<String, HystrixCircuitBreaker> circuitBreakersByCommand = new ConcurrentHashMap<String, HystrixCircuitBreaker>();
    }


    class HystrixCircuitBreakerImpl implements HystrixCircuitBreaker {
    }

    static class NoOpCircuitBreaker implements HystrixCircuitBreaker {
    }

}

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

allowRequest(): 每个Hystrix命令的请求都通过它判断是否被执行(已经不再使用,使用attemptExecution()方法进行判断)
attemptExecution(): 每个Hystrix命令的请求都通过它判断是否被执行
isOpen(): 返回当前断路器是否打开
markSuccess(): 用来关闭断路器
markNonSuccess: 用来打开断路器

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

Factory: 维护了一个Hystrix命令和HystrixCircuitBreaker的关系的集合ConcurrentHashMap<String, HystrixCircuitBreaker> circuitBreakersByCommand。其中key通过HystrixCommandKey来定义,每一个Hystrix命令都需要有一个Key来标识,同时根据这个Key可以找到对应的断路器实例。
NoOpCircuitBreaker: 一个啥都不做的断路器,它允许所有请求通过,并且断路器始终处于闭合状态
HystrixCircuitBreakerImpl:断路器的另一个实现类。

HystrixCircuitBreakerImpl介绍

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101128.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • encode-decode结构

    encode-decode结构encode的输入是变长的序列向量,每个向量之间会在batch内填充为固定长度,神经网络限制,不能输入变长的向量。encode输出固定长度的向量,但序列数量和输入数量保持不变,也就是一个输入产生一个输出。每个输出之间是独立的。encode的网络可以不固定,比如常见nlp任务用rnn,。encode将可变序列编码为固定状态,decode将固定状态输入映射为其它可变序列。decode的网络可以不固定,其中ctc结合search策略也可以用来做decode。通用的“编码器-解码器”接口定义:fro.

  • 逻辑回归算法原理实例_逻辑回归算法案例

    逻辑回归算法原理实例_逻辑回归算法案例逻辑回归算法的原理

  • 大数据技术原理与应用-林子雨版-课后习题答案

    大数据技术原理与应用-林子雨版-课后习题答案第一章1.试述信息技术发展史上的3次信息化浪潮及具体内容。 信息化浪潮 发生时间 标志 解决问题 代表公司 第一次浪潮 1980年前后 个人计算机 信息处理 Intel、AMD、IBM、苹果…

  • python中字符串转成数字的几种方法[通俗易懂]

    python中字符串转成数字的几种方法[通俗易懂]在python列表操作中,面对需要把列表中的字符串转为礼拜的操作,无需强转,通过简单的几步就可以实现,本文介绍python中字符串转成数字的三种方法:1、使用join的方法;2、使用int函数将16进制字符串转化为10进制整数;3、使用列表生成式进行转换。方法一:使用join的方法num_list=[‘1′,’2′,’3’]str_list=”.join(num_str)#把列表中的元素连起来print(int(str_list))输出123方法二:使用int函数将16进制

    2022年10月22日
  • css3元素简单的闪烁效果(html5 jquery)

    css3Animation:@-webkit-keyframestwinkling{/*透明度由0到1*/0%{opacity:0;/*透明度为0*/}100%{opacity:1

    2021年12月20日
  • vbs代码之“电脑系统崩溃”「建议收藏」

    vbs代码之“电脑系统崩溃”「建议收藏」熟练掌握vbs脚本,可以让你…我也不知道。具体操作:新建文本文档,将本段代码复制进入文本,保存;将后缀.txt改为.vbs即可。codeCreateObject(“SAPI.SpVoice”).Speak”你的电脑受到ddos木马攻击,系统严重瘫痪,电脑系统将在三秒后崩溃”setWshShell=WScript.CreateObject(“WScript.Shell”)WScript.Sleep2000CreateObject(“SAPI.SpVoice”).Speak”电脑系统已

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号