[Spring Cloud] Hystrix三大特性--降级,熔断,隔离

news2025/2/27 19:15:22

✨✨个人主页:沫洺的主页

📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 

                           📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏

                           📖Docker专栏📖Reids专栏📖MQ专栏📖SpringCloud专栏     

💖💖如果文章对你有所帮助请留下三连✨✨

衔接上篇: [Spring Cloud] Ribbon介绍与定义负载均衡_沫洺的博客-CSDN博客

💐Hystrix介绍

Hystrix中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力。

Hystrix是一个容错组件,实现了超时机制和断路器模式。

Hystrix被设计的目标是:

  1. 对通过第三方客户端库访问的依赖项(通常是通过网络)的延迟和故障进行保护和控制。
  2. 在复杂的分布式系统中阻止级联故障。
  3. 快速失败,快速恢复。
  4. 回退,尽可能优雅地降级。
  5. 启用近实时监控、警报和操作控制。

Hystrix提供了熔断和降级。

接下来了解一下Hystrix的三大特性: 降级,熔断,隔离

🌿服务降级 

参考文章: 微服务架构—服务降级

当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和业务有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作

服务降级主要用于什么场景呢?

当整个微服务架构整体的负载超出了预设的上限阈值或即将到来的流量预计将会超过预设的阈值时,为了保证重要或基本的服务能正常运行,我们可以将一些 不重要 或 不紧急 的服务或任务(非核心业务(负载过高)或者故障业务)进行服务的 延迟使用 或 暂停使用。就相当于try catch一样的逻辑,当然hystrix底层使用aop来实现的。

说白了服务降级就是系统有限的资源的合理协调,来保证核心服务和业务正常运作或高效运作

🌾服务熔断

参考文章: 什么是服务熔断

参考文章: 微服务的熔断原理与实现

熔断这一概念来源于电子工程中的断路器,当电路超负荷运行时,保险丝会自动的断开,从而保证电路中的电器不受损害

在互联网系统中,当下游服务(被调用方)因访问压力过大而响应变慢或失败,上游服务(调用方)为了保护系统整体的可用性,可以暂时切断对下游服务(被调用方)的调用。也就是说熔断机制是应对雪崩效应的一种微服务链路保护机制

这种牺牲局部,保全整体的措施就叫做熔断

服务调用方为每一个调用服务 (调用路径) 维护一个状态机,在这个状态机中有三个状态:

  • 关闭 (Closed):在这种状态下,我们需要一个计数器来记录调用失败的次数和总的请求次数,如果在某个时间窗口内,失败的失败率达到预设的阈值,则切换到断开状态,此时开启一个超时时间,当到达该时间则切换到半关闭状态,该超时时间是给了系统一次机会来修正导致调用失败的错误,以回到正常的工作状态。在关闭状态下,调用错误是基于时间的,在特定的时间间隔内会重置,这能够防止偶然错误导致熔断器进去断开状态
  • 打开 (Open)在该状态下,发起请求时会立即返回错误,一般会启动一个超时计时器,当计时器超时后,状态切换到半打开状态,也可以设置一个定时器,定期的探测服务是否恢复
  • 半打开 (Half-Open)在该状态下,允许应用程序一定数量的请求发往被调用服务,如果这些调用正常,那么可以认为被调用服务已经恢复正常,此时熔断器切换到关闭状态,同时需要重置计数。如果这部分仍有调用失败的情况,则认为被调用方仍然没有恢复,熔断器会切换到关闭状态,然后重置计数器,半打开状态能够有效防止正在恢复中的服务被突然大量请求再次打垮

🍃服务降级和服务熔断区别

实际上服务熔断 和 服务降级 没有任何关系,就像 java 和 javaScript

参考文章: 服务降级与服务熔断区别

  • 触发原因不一样,服务熔断由链路上某个服务引起的,服务降级是从整体的负载考虑
  • 管理目标层次不一样,服务熔断是一个框架层次的处理,服务降级是业务层次的处理
  • 实现方式不一样,服务熔断一般是自我熔断恢复,服务降级相当于人工控制
  • 触发原因不同 服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;

服务熔断是应对系统服务雪崩的一种保险措施,给出的一种特殊降级措施。而服务降级则是更加宽泛的概念,主要是对系统整体资源的合理分配以应对压力。

服务熔断是服务降级的一种特殊情况,他是防止服务雪崩而采取的措施。系统发生异常或者延迟或者流量太大,都会触发该服务的服务熔断措施,链路熔断,返回兜底方法。这是对局部的一种保险措施

服务降级是对系统整体资源的合理分配。区分核心服务和非核心服务。对某个服务的访问延迟时间、异常等情况做出预估并给出兜底方法。这是一种全局性的考量,对系统整体负荷进行管理。

🍁Hystrix隔离策略

每当向服务发起一个请求时,就是会发起一个http请求,每一个http请求就要开启一个线程,然后等待服务返回信息,这容易导致线程的堆积,所以就可以用http的URI作为一个标识,然后相同的URI可以开启一个线程池,然后线程池中限定线程数,这样就可以设置拒绝策略,当线程池满了,就可以快速的抛出异常或者拒绝请求,用线程池做到线程隔离来达到限流。

🍂Hystrix使用

参考文章: SpringCloud--Hystrix--断路器--01

参考文章: SpringCloud--Hystrix--断路器--02

父模块pom声明子模块

        <module>spring-cloud-hystrix</module>

创建子模块spring-cloud-hystrix

 pom.xml添加依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.moming</groupId>
        <artifactId>spring-cloud-root</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>spring-cloud-hystrix</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

启动类添加@EnableHystrix注解,启用Hystrix

@SpringBootApplication
@EnableHystrix
public class HystrixApp {
    public static void main(String[] args) {
        SpringApplication.run(HystrixApp.class, args);
    }
}

编写测试接口

在接口上使用@HystrixCommand注解,进行服务降级的配置

参数: fallbackMethod 

@RestController
public class Test {
    @GetMapping("/test")
    @HystrixCommand(fallbackMethod = "hello_fallback")
    public String hello(){
        return "原方法";
    }
    public String hello_fallback(){
        return "兜底方法";
    }
}

运行访问接口,此时服务调用正常

 

 接下来模拟服务异常

@RestController
public class Test {
    @GetMapping("/test")
    @HystrixCommand(fallbackMethod = "hello_fallback")
    public String hello(){
        int i = 1/0;
        return "原方法";
    }
    public String hello_fallback(){
        return "兜底方法";
    }
}

再次访问

如果将异常进行try-catch处理,就会感知不到异常,结果还是原方法

@RestController
public class Test {
    @GetMapping("/test")
    @HystrixCommand(fallbackMethod = "hello_fallback")
    public String hello(){
        try {
            int i = 1/0;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "原方法";
    }
    public String hello_fallback(){
        return "兜底方法";
    }
}

其实可以理解为兜底的作用,你不行的话就我来 

注意兜底方法和原方法的入参和返回值类型要保持一致,只是方法名不同

参数: commandProperties

@RestController
public class Test {
    @GetMapping("/test")
    @HystrixCommand(fallbackMethod = "hello_fallback",commandProperties =
            {
                    @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //开启熔断器
                    @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value ="30000"), //统计时间窗
                    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "3"),      //统计时间窗内最小请求次数阈值
                    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //休眠时间窗口期
                    @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "30"), //时间窗内失败阈值百分比
                    //执行隔离线程超时
                    @HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,value = "3000")

            })
    public String hello(@RequestParam Integer time){
        ThreadUtil.sleep(time*1000);
        return "原方法";
    }
    public String hello_fallback(Integer time){
        return "兜底方法";
    }
}

运行访问

localhost:8080/test?time=1 模拟在隔离线程指定时间3秒内,模拟正常访问

localhost:8080/test?time=4 模拟超出隔离线程指定时间3秒,模拟失败访问,执行兜底方法

大致流程就是在30秒内,且超过访问最小此时3次,在访问5次时(其中2次正常,3次失败)超过失败阈值30%,开启熔断机制,开启后有10秒的休眠期,之后再次正常访问恢复正常状态,如果休眠期过后还是进行失败访问,那么继续开启熔断,10秒休眠期

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高级测试工程师必备技术:用Git版本控制自动化测试代码

初识Git版本控制 自动化测试代码反复执行&#xff0c;如果借用持续集成工具会提高测试效率&#xff0c;那么需要我们把自动化测试代码发布到正式环境中&#xff0c;这时候用Git版本控制工具高效、稳定、便捷。 分布式版本控制 Git可以把代码仓库完整地镜像下来&#xff0c;有…

Mybatis整合MP

Mybatis整合MP 案例准备&#xff1a; 创建测试表&#xff1a; -- 创建测试表 CREATE TABLE tb_user (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID,user_name varchar(20) NOT NULL COMMENT 用户名,password varchar(20) NOT NULL COMMENT 密码,name varchar(30) …

kafka性能指南

kafka性能指南 1.绪论 首先是epoll模型&#xff0c;epoll使其在框架上得以使用mmp和回写高性能。 epoll模型具体可以看linuxIO那一个笔记&#xff0c;这里简单讲一下 首先是epoll模型&#xff0c;模型要求有一组fd由单独线程监控&#xff0c;然后app去干别的事&#xff0c;当…

Arduino开发实例-MAX30100 脉搏血氧仪传感器驱动

MAX30100 脉搏血氧仪传感器驱动 1、MAX30100介绍 MAX30100 脉搏血氧仪和心率传感器是一款基于 I2C 的低功耗即插即用生物识别传感器。 MAX30100 是一款集成脉搏血氧饱和度和心率监测传感器解决方案。 它结合了两个 LED、一个光电探测器、优化的光学器件和低噪声模拟信号处理,…

【蓝桥杯Web】第十四届蓝桥杯(Web 应用开发)模拟赛 2 期 | 精品题解

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ 蓝桥杯专栏&#xff1a;蓝桥杯题解/感悟 &#x1f5a5;️ TS知识总结&#xff1a;十万字TS知识点总结 &#x1f449; 你的一键三连是我更新的最大动力❤️&#xff01; &…

降本增效利器?Share Creators智能数字资产管理系统真香!

降本增效似乎是一个持续又永久的话题。尤其在今年&#xff0c; 显得格外的重要~ 疫情不知不觉已经伴随了我们三年&#xff0c;在各行各业都受到了疫情所带来巨大冲击的背景下&#xff0c;降本增效对很多企业来说不再是锦上添花&#xff0c;而可能是一条唯一的出路。 随着市场…

荧光素PEG活性酯,FITC-PEG-NHS,FITC-PEG-SCM,荧光素聚乙二醇琥珀酰亚胺乙酸酯

中文名称&#xff1a;荧光素聚乙二醇琥珀酰亚胺乙酸酯 英文名称&#xff1a;FITC-PEG-NHS,FITC-PEG-SCM 分子量&#xff1a; 1K,2K,3.4K,5K,10K(黄色、橙黄色或者橘黄色固体或者粉末) 端基取代率&#xff1a;≥90% 原料分散系数PDI&#xff1a;≤1.05 纯度&#xff1a;98%…

Vue简单示例——weex跨平台解决方案

简单介绍&#xff1a; Weex的出现主要解决了Web开发的应用频繁发布版本和多端研发两个问题&#xff0c;同时解决了前端语言性能差异和显示效果受限的问题。 什么是weex&#xff1a; Weex是使用流行的Web开发体验来开发高性能原生应用框架。使开发者可以用JS语言和前端开发经…

若依框架解读(微服务版)—— 3.验证码与登录

验证码 查看验证码的请求&#xff1a; 之前已经讲过http://localhost/dev-api/code会在前端重写为http://localhost:8080/code。 请求第一步会进入网关模块 网关相关知识&#xff1a;Gateway基于的WebFlux框架&#xff0c;与我们平时用的WebMVC是不太一样的。网关由Route&#…

PHP的Exception

# 简单解释 Exception是PHP的内置类&#xff0c;用来处理异常的基类 https://www.php.net/manual/zh/class.exception.php php class Exception implements Throwable { /** The error message */ protected $message; /** The error code */ protect…

MVC升级swagger No operations defined in spec!

不要嘲笑农民工种田怎么不香了&#xff0c;要反思为什么别人种田收入高。 以下是农民工即将转行挖野菜之前的种田心得。 &#xff11;No operations defined in spec! &#xff12;Failed to load API definition. Failed to load API definition. 经过多次试验测试&#xff0…

光盘如何重装系统教程

​如果你想用光盘来重装自己的电脑系统&#xff0c;但是不知道怎么操作的话&#xff0c;下面让我们一起来看一下光盘重装系统的步骤吧。 工具/原料&#xff1a; 系统版本&#xff1a;win7 品牌型号&#xff1a;惠普 光盘重装系统&#xff1a; 1.首先我们需要先打开电脑上的光…

VUE 的生命周期

Vue 实例有一个完整的生命周期&#xff0c;也就是从创建之前→创建完成→挂载之前→挂载完成→更新渲染之前→渲染完成→销毁之前→销毁完成等一系列过程&#xff0c;我们称这是 Vue 的生命周期。通俗说就是 Vue 实例从创建到销毁的过程&#xff0c;就是生命周期。每一个组件或…

22.11.20补卡 javaSE多线程学习笔记

自用 并发编程 多个任务同时执行 并发原理: CPU分时间片交替执行, 宏观并行, 微观串行; 由OS调度 进程: OS中并发的一个任务 线程: 在一个进程中,并发的一个顺序执行流程 每当执行新的进程时, 之前的进程都会暂且暂停, 由于cpu的时间片非常短, 人感觉不出来 线程的三个要素: CP…

RemObjects SDK for Delphi

RemObjects SDK for Delphi RemObjects SDK for Delphi是一个高级远程处理框架&#xff0c;它允许您从局域网内或Internet上的客户端远程访问驻留在服务器上的对象。RemObjects SDK for Delphi将允许您构建客户端和服务器应用程序&#xff0c;使用高度优化的Smart Services实现…

Seata AT模式下的源码解析(三)

7. 网络请求 7.1 TransactionManager 事务管理器&#xff0c;在客户端主要用于发起事务请求、提交事务、回滚事务请求等&#xff0c;用于跟 TC 进行通信的类&#xff0c;其中获取当前接口的实现类是通过 TransactionManagerHolder 进行获取&#xff0c;然后通过 SPI 接口获取…

【没用的小知识又增加了--电机】

一些乱七八糟的笔记.. 怎么计算电流环带宽 https://www.csdn.net/tags/MtTaMgysMTgwMTQwLWJsb2cO0O0O.html 理解电机控制系统中的带宽问题 - 知乎 电机控制电路程序带宽和硬件带宽的关系&#xff0c;应该如何设计相关参数&#xff1f; - 知乎 怎么理解Clarke和park变换&am…

[附源码]java毕业设计西柚网购物系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

论文阅读【5】Attention Is All You Need

1.概述 1.1 论文相关 题目&#xff1a;注意你所有需要的&#xff08;Attention Is All You Need&#xff09;发表时间&#xff1a;2017出版&#xff1a;NIPS原文地址&#xff1a;经典模型了&#xff0c;网上一搜就能搜索到代码&#xff1a; 1.2 动机 因为循环神经网络通常是…

Poison Ink: Robust and Invisible Backdoor Attack 论文笔记

1. 论文信息 论文名称Poison Ink: Robust and Invisible Backdoor Attack作者Jie Zhang&#xff08;中国科学技术大学&#xff09;会议/出版社IEEE Transactions on Image Processingpdf&#x1f4c4;在线pdf 2. introduction 文章提出了一种新的攻击方式称为“Poison Ink”…