Spring Cloud学习 之 Spring Cloud Hystrix(断路器原理)

简介: Spring Cloud学习 之 Spring Cloud Hystrix(断路器原理)

断路器定义:

public interface HystrixCircuitBreaker {
    // 每个Hystrix都通过它判断是否被执行
    public boolean allowRequest();
    // 返回当前断路器是否打开
    public boolean isOpen();
    // 用来闭合断路器
  void markSuccess();
    public static class Factory {
    // 维护了一个Hystrix命令与HystrixCircuitBreaker的关系
        // String类型的key通过HystrixCommandKey定义
        private static ConcurrentHashMap<String, HystrixCircuitBreaker> circuitBreakersByCommand = new ConcurrentHashMap<String, HystrixCircuitBreaker>();
        public static HystrixCircuitBreaker getInstance(HystrixCommandKey key, HystrixCommandGroupKey group, HystrixCommandProperties properties, HystrixCommandMetrics metrics) {
            HystrixCircuitBreaker previouslyCached = circuitBreakersByCommand.get(key.name());
            if (previouslyCached != null) {
                return previouslyCached;
            }
            HystrixCircuitBreaker cbForCommand = circuitBreakersByCommand.putIfAbsent(key.name(), new HystrixCircuitBreakerImpl(key, group, properties, metrics));
            if (cbForCommand == null) {
                return circuitBreakersByCommand.get(key.name());
            } else {
                return cbForCommand;
            }
        }
        public static HystrixCircuitBreaker getInstance(HystrixCommandKey key) {
            return circuitBreakersByCommand.get(key.name());
        }
static void reset() {
            circuitBreakersByCommand.clear();
        }
    }
static class HystrixCircuitBreakerImpl implements HystrixCircuitBreaker {
    // 断路器对应的HystrixCommand实例的属性对象
        private final HystrixCommandProperties properties;
    // 用来让HystrixCommand记录各类度量指标的对象
        private final HystrixCommand记录各类度量指标的对象Metrics metrics;
  // 断路器是否打开的标志,默认未false
        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;
        }
    // 在半开路的情况下使用,若Hystrix命令调用成功,通过调用它将打开的断路器关闭
      // 并重置度量指标 
        public void markSuccess() {
            if (circuitOpen.get()) {
                if (circuitOpen.compareAndSet(true, false)) {
                    metrics.resetStream();
                }
            }
        }
// 判断请求是否被允许,先根据配置对象中断路器
        @Override
        public boolean allowRequest() {
            if (properties.circuitBreakerForceOpen().get()) {
              // 配置了强制打开,直接返回false
                return false;
            }
            if (properties.circuitBreakerForceClosed().get()) {
                // 配置了强制关闭,会允许所有请求,但同时也会调用isOpen()来执行断路器的计算逻辑
                isOpen();
                return true;
            }
            // 默认情况下,会用过!isOpen() || allowSingleTest(),来判断请求是否被允许
            // 也就是说,断路器闭合,或者断路器关闭,但是allowSingleTest()为true
            return !isOpen() || allowSingleTest(),;
        }
        public boolean allowSingleTest() {
            long timeCircuitOpenedOrWasLastTested = circuitOpenedOrLastTestedTime.get();
      // 断路器打开的情况下,每隔一段事件允许请求一次,默认为5s
            // 此时断路器处于一个半开路的状态下
            if (circuitOpen.get() && System.currentTimeMillis() > timeCircuitOpenedOrWasLastTested + properties.circuitBreakerSleepWindowInMilliseconds().get()) {
                if (circuitOpenedOrLastTestedTime.compareAndSet(timeCircuitOpenedOrWasLastTested, System.currentTimeMillis())) {
                    return true;
                }
            }
            return false;
        }
   // 判断当前断路器是否打开
        @Override
        public boolean isOpen() {
            if (circuitOpen.get()) {
        // 如果断路器打开的标志为true就直接返回true,,表示断路器在打开状态
                return true;
            }
      // 否则从度量指标对象中获取HealthCounts统计对象做进一步判断(该对象记录了一个滚动事件窗内         的请求信息快照,默认时间窗为10秒)
            HealthCounts health = metrics.getHealthCounts();
            if (health.getTotalRequests() < 
                //如果他的QPS在预设的阈值范围内就返回false,表示断路器处于闭合状态。
                //该值的默认值为20
                properties.circuitBreakerRequestVolumeThreshold().get()) {
                return false;
            }
            if (health.getErrorPercentage() < 
                // 错误百分比在阈值内就返回false,该阈值默认为50%
                properties.circuitBreakerErrorThresholdPercentage().get()) {
                return false;
            } else {
                // 如果上面两个参数都不满足,就打开断路器
                if (circuitOpen.compareAndSet(false, true)) {
                    circuitOpenedOrLastTestedTime.set(System.currentTimeMillis());
                    return true;
                } else {
                    return true;
                }
            }
        }
    }
// 定义了一个什么都不做的断路器
 static class NoOpCircuitBreaker implements HystrixCircuitBreaker {
        @Override
        public boolean allowRequest() {
            return true;
        }
        @Override
        public boolean isOpen() {
            return false;
        }
        @Override
        public void markSuccess() {
        }
    }
}
相关文章
|
Java UED 开发者
Spring Boot 降级功能的神秘面纱:Hystrix 与 Resilience4j 究竟藏着怎样的秘密?
【8月更文挑战第29天】在分布式系统中,服务稳定性至关重要。为应对故障,Spring Boot 提供了 Hystrix 和 Resilience4j 两种降级工具。Hystrix 作为 Netflix 的容错框架,通过隔离依赖、控制并发及降级机制增强系统稳定性;Resilience4j 则是一个轻量级库,提供丰富的降级策略。两者均可有效提升系统可靠性,具体选择取决于需求与场景。在面对服务故障时,合理运用这些工具能确保系统基本功能正常运作,优化用户体验。以上简介包括了两个工具的简单示例代码,帮助开发者更好地理解和应用。
597 0
|
设计模式 监控 Java
解析Spring Cloud中的断路器模式原理
解析Spring Cloud中的断路器模式原理
|
XML 监控 Java
Spring Cloud全解析:熔断之Hystrix简介
Hystrix 是由 Netflix 开源的延迟和容错库,用于提高分布式系统的弹性。它通过断路器模式、资源隔离、服务降级及限流等机制防止服务雪崩。Hystrix 基于命令模式,通过 `HystrixCommand` 封装对外部依赖的调用逻辑。断路器能在依赖服务故障时快速返回备选响应,避免长时间等待。此外,Hystrix 还提供了监控功能,能够实时监控运行指标和配置变化。依赖管理方面,可通过 `@EnableHystrix` 启用 Hystrix 支持,并配置全局或局部的降级策略。结合 Feign 可实现客户端的服务降级。
984 23
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
Java 对象存储 开发者
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
356 3
|
负载均衡 Java API
Spring Cloud原理详解
Spring Cloud原理详解
443 0
|
负载均衡 Java 网络架构
Spring Cloud原理详解
介绍了Spring Cloud的原理和核心组件,包括服务注册与发现、配置管理、负载均衡、断路器、智能路由、分布式消息传递、分布式追踪和服务熔断等,旨在帮助开发人员快速构建和管理微服务架构中的分布式系统。
717 0
|
缓存 Java 微服务
Spring Cloud中@RefreshScope实现动态刷新的原理
Spring Cloud中@RefreshScope实现动态刷新的原理
|
设计模式 监控 Java
深入理解Spring Cloud中的断路器模式
深入理解Spring Cloud中的断路器模式