断路器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)


相关推荐

  • vim设置编码

    vim设置编码Vim设置编码让Vim能正确显示和保存各种编码文件内容是个头疼的事情,今天专注的把这个问题研究一下首先是Vim编码配置的三个选项:encoding(enc):此项目配置的是vim的默认显示编码,如果你打开的文件编码与该属性配置的编码不同,那么Vim会将编码自动转换到配置编码再显示fileencodings(fencs):此项目配置的是一个编

  • JVM调优工具总结「建议收藏」

    JVM调优工具总结「建议收藏」一、jps:虚拟机进程状况工具它可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(MainClass,main()函数所在的类)名称以及正在运行的本地虚拟机唯一ID(LVMID);它是使用率最高的一个JDK命令行工具,因为其他的命令行工具都需要输入查询到的ID来确定要监控的是哪一个虚拟机进程。命令格式:jps[options][hostid]选项作用-q只…

  • 深信服SCSA认证知识点(2)[通俗易懂]

    深信服SCSA认证知识点(2)[通俗易懂]深信服SCSA认证1、IP数据报文在网络层选路时,是基于最长匹配的原则。2、SNMP依赖于IP协议工作的。3、IP报文头部中有一个TTL字段,该字段长度为7位。4、access端口只能发送untagged帧5、关于rip协议,路由器不可能转发条数为16的路由器条目给它的直连邻居。6、如果希望一台DHCP客户机总是获得一个固定的IP地址,需要在DHCP上为其设置IP作用域。7、关于HTTP相应状态码302为网页重定向。8、nslookup是Windows系统常用的dns测.

  • MybatisPlus逻辑删除

    MybatisPlus逻辑删除**MybatisPlus逻辑删除的使用**首先我们要知道为什么要进行逻辑删除:逻辑删除可以理解为假删除,并不是真的将数据进行删除。假删除只是为了数据安全起见,在数据库中增添一个字段,我们可以默认这个字段为1时数据被删除,而字段值为0时数据被删除想象一下这样的业务场景,当一位公司职员离职,但是手续还没有办理,这时我们便可以设置逻辑删除,以保证其信息不会被立刻删除。我们电脑里的回收站正是利用了逻辑删除,我们点击删除的文件不会被立刻删除,而是放入回收站,等我们反悔时可以将其进行还原。在Mybat

  • 用模拟器加载基于ARM平台的WinCE6.0 内核(NK.bin)

    用模拟器加载基于ARM平台的WinCE6.0 内核(NK.bin)

  • 一些好玩的代码_100个简单代码

    一些好玩的代码_100个简单代码1.让网页的图片都漂动起来将以下代码复制到地址框,回车。有些浏览器会把"javaScript"过滤掉,可手动添加"javaScript"2.一行代码让电脑

发表回复

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

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