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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HTTP协议

    当你在浏览器地址栏敲入“http://www.cnblogs.com/”,然后猛按回车,呈现在你面前的,将是博客园的首页了(这真是废话,你会认为这是理所当然的)。作为一个开发者,尤其是web开发人员,

    2022年3月29日
    45
  • pycharm设置背景色及字体_pycharm设置字体

    pycharm设置背景色及字体_pycharm设置字体pycharm字体多小,不好看,不喜欢背景颜色。改变字体样式、颜色、大小依次点击File→setting→Editor→font之后就可以调整字体的样式、大小和行间距等。改变背景颜色依次点击File→setting→Editor→ColorScheme,调整即可。…

    2022年8月27日
    0
  • java开发区块链只需150行代码

    java开发区块链只需150行代码本文目的是通过java实战开发教程理解区块链是什么。将通过实战入门学习,用Java自学开发一个很基本的区块链,并在此基础上能扩展如web框架应用等。这个基本的java区块链也实现简单的工作量证明系统。

    2022年7月3日
    21
  • IDEA继承父类后重写方法快捷键

    IDEA继承父类后重写方法快捷键eg:我们的MyServlet继承了HttpServlet,我们想要重写里面的doGet()方法和doPost()方法,如何做到呢?publicclassMyServletextendsHttpServlet{}1)ctrl+o,注意光标在继承的父类名后2)弹出下图后3)我们想要选定连续的方法怎么做?按住shift键,默认开始为当前位置,结束位置为你下次的鼠标单击位置4)我们只是想选择不连续的两个方法,比如说上文的doGet()和doPost(),如何做.

    2025年6月14日
    1
  • HDU 4334 Trouble

    HDU 4334 Trouble

    2021年12月3日
    41
  • ElasticSearch安装及辅件安装

    ElasticSearch安装及辅件安装ElasticSearc 安装及辅件安装前言 es 的安装分为 ElasticSearc 安装和辅助安装工具 小编也是学习后将笔记整理分享给大家 有什么不对的地方可以在下方留言更正 一 ES 的安装登录网址 www elastic co 官网里有很多的环境解压包 由 windows linux 等主要介绍 Linux 环境的的配置步骤 这里要注意一下 network 配置 0 0 0 0 外网就可以访问然后进行启动 cdbin 进入 bin 目录 执行 elasticsearc 启动后会报

    2025年7月25日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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