Hystrix详解及实践---SpringCloud组件(四)

news2025/1/1 23:04:17

Hystrix详解及实践

  • 1.Hystrix简介
  • 2.雪崩问题
  • 3.服务降级、线程隔离、原理
    • 3.1.服务降级实践(在feign的基础上实现)
      • 1 添加Hystrix依赖
      • 2.在yml中开启熔断功能
      • 3.编写降级逻辑
      • 4.重启测试
  • 4.服务熔断(Circuit Breaker)、原理
    • 4.1. 熔断原理
    • 4.2.动手实践
  • 5.Hystrix核心源码剖析

1.Hystrix简介

Hystix,英文意思是豪猪,全身是刺,看起来就不好惹,是一种保护机制。
Hystrix也是Netflix公司的一款组件。
主页:https://github.com/Netflix/Hystrix/
在这里插入图片描述

Hystrix 是一种开关装置,类似于熔断保险丝。在消费者端安装一个 Hystrix 熔断器,当
Hystrix 监控到某个服务发生故障后熔断器会开启,将此服务访问链路断开。不过 Hystrix 并不会将该服务的消费者阻塞,或向消费者抛出异常,而是向消费者返回一个符合预期的备选响应(FallBack)。通过 Hystrix 的熔断与降级功能,避免了服务雪崩的发生,同时也考虑到了用户体验。故 Hystrix 是系统的一种防御机制。

2.雪崩问题

如果说,我们需要访问的某个服务,Dependency-I发生了故障,此时,我们应用中,调用Dependency-I的服务,也会故障,造成阻塞。此时,其它业务似乎不受影响。
在这里插入图片描述

例如微服务I发生异常,请求阻塞,用户不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vZ7TdMdY-1615796261981)(assets/1604375397407.png)]

服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,形成雪崩效应。

这就好比,一个汽车生产线,生产不同的汽车,需要使用不同的零件,如果某个零件因为种种原因无法使用,那么就会造成整台车无法装配,陷入等待零件的状态,直到零件到位,才能继续组装。 此时如果有很多个车型都需要这个零件,那么整个工厂都将陷入等待的状态,导致所有生产都陷入瘫痪。一个零件的波及范围不断扩大。

3.服务降级、线程隔离、原理

在这里插入图片描述

Hystrix为每个服务调用的功能分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队.加速失败判定时间。

用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,或者请求超时,则会进行降级处理:返回给用户一个错误提示或备选结果

服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多占用该服务的线程资源,不会导致整个容器资源耗尽,把故障的影响隔离在线程池内

3.1.服务降级实践(在feign的基础上实现)

步骤:

1.添加Hystrix依赖
2.在yml中开启熔断功能
3.编写降级逻辑

1 添加Hystrix依赖

由于Feign默认也有对Hystix的集成,所以不需要单独再添加依赖
在这里插入图片描述

2.在yml中开启熔断功能

在feign-hystrix-consumer-8080服务中开启熔断配置

feign:
  hystrix:
    enabled: true # 开启Feign的熔断功能

在这里插入图片描述

3.编写降级逻辑

  1. 在feign-provider-api新增DepartServiceFallback类实现feign接口,在每个方法中编写具体的降级方法。

    在这里插入图片描述

/**
 1. @ClassName: DepartServiceFallback
 2. @Description: 失败回调类
 3. @Author: wang xiao le
 4. @Date: 2023/05/11 21:56
 **/
@Component
public class DepartServiceFallback implements DepartService {
    @Override
    public boolean saveDepart(DepartVO depart) {
        return false;
    }

    @Override
    public boolean removeDepartById(int id) {
        return false;
    }

    @Override
    public boolean modifyDepart(DepartVO depart) {
        return false;
    }

    @Override
    public DepartVO getDepartById(int id) {
        DepartVO departVO = new DepartVO();
        departVO.setId(id);
        departVO.setName("查询异常");
        return departVO;
    }

    @Override
    public List<DepartVO> listAllDeparts() {
        return null;
    }
}
  1. 在DepartService 指定刚才编写的实现类

    在这里插入图片描述

// 注意,接口名与方法名可以随意
// 参数指定了要访问的提供者微服务名称
//@FeignClient(url ="http://127.0.0.1:8081", value="abcmsc-provider-depart", path = "/provider/depart")
//@FeignClient(url ="${feign.client.url}", value="abcmsc-provider-depart", path = "/provider/depart")
@FeignClient(value="feign-provider", path = "/provider/depart",fallback = DepartServiceFallback.class)
public interface DepartService {
    @PostMapping("/save")
    boolean saveDepart(@RequestBody DepartVO depart);

    @DeleteMapping("/del/{id}")
    boolean removeDepartById(@PathVariable("id") int id);

    @PutMapping("/update")
    boolean modifyDepart(@RequestBody DepartVO depart);

    @GetMapping("/get/{id}")
    DepartVO getDepartById(@PathVariable("id") int id);

    @GetMapping("/list")
    List<DepartVO> listAllDeparts();
}

4.重启测试

我们只重启consumer,不启动provider服务,模拟provider服务宕机
在这里插入图片描述
访问http://localhost:8080/consumer/depart/get/1
显示为失败回调的结果
在这里插入图片描述

4.服务熔断(Circuit Breaker)、原理

4.1. 熔断原理

尽管隔离可以避免服务出现级联失败,但是对于访问服务I(故障服务 的其它服务,每次处理请求都要等待 数秒直至fallback,显然是对系统资源的浪费。

因此,当Hystix判断一个依赖服务失败比例较高时,就会对其做熔断处理: 拦截对故障服务的请求,快速失 败,不再阻塞等待,就像电路的断路器断开了,保护电路。

熔断器,也叫断路器,其英文单词为:Circuit Breaker 在这里插入图片描述
Hystix的熔断状态机模型:
在这里插入图片描述
状态机有3个状态:

  • Closed:关闭状态(断路器关闭),所有请求都正常访问。
  • Open:打开状态(断路器打开),所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
  • Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放1次请求通过,若这个请求是健康的,则会关闭断路器,否则继续保持打开,再次进行5秒休眠计时。

4.2.动手实践

为了能够精确控制请求的成功或失败,在feign-provider-modules的调用业务中加入一段逻辑:

在这里插入图片描述

    @GetMapping("/get/{id}")
    public DepartVO getHandle(@PathVariable("id") int id) {
        if(id == 1){
            throw new RuntimeException("太忙了");
        }
        return new DepartVO();
    }

这样如果参数是id为1,一定失败,其它情况都成功。

我们准备两个请求窗口:

  • 一个请求:http://localhost:8080/consumer/1,注定失败
  • 一个请求:http://localhost:8080/consumer/2,肯定成功

熔断器的默认触发阈值是20次请求,不好触发。休眠时间时5秒,时间太短,不易观察,为了测试方便。我们在consumer服务配置中修改熔断策略:
在这里插入图片描述

  hystrix:
    enabled: true # 开启Feign的熔断功能
    command:
      default:
        execution.isolation.thread.timeoutInMilliseconds: 2000
        circuitBreaker:
          errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50%
          sleepWindowInMilliseconds: 10000 # 熔断后休眠时长,默认值5秒
          requestVolumeThreshold: 10 # 触发熔断的最小请求次数,默认20

解读

  • requestVolumeThreshold:触发熔断的最小请求次数,默认20,这里我们设置为10,便于触发
  • errorThresholdPercentage:触发熔断的失败请求最小占比,默认50%
  • sleepWindowInMilliseconds:休眠时长,默认是5000毫秒,这里设置为10000毫秒,便于观察熔断现象

当我们疯狂访问id为1的请求时(10次左右),就会触发熔断。断路器会进入打开状态,一切请求都会被降级处理。

在这里插入图片描述

此时你访问id为2的请求,会发现返回的也是失败,而且失败时间很短,只有20毫秒左右:

在这里插入图片描述

5.Hystrix核心源码剖析

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

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

相关文章

5个模板非常多的免费样机素材分享

样机素材是设计行业的不可缺少的素材之一&#xff0c;设计师可以将自己的设计作品&#xff0c;应用到一个效果图中进行展示&#xff0c;让你的设计作品看起来更加形象逼真。 本文分享5个非常给力的样机素材网站 1.即时设计资源社区 即时设计是一款「专业UI设计工具」&#x…

【edusrc】某校园网登录系统存在的一个简单爆破

前言 红中(hong_zh0) CSDN内容合伙人、2023年新星计划web安全方向导师、 华为MindSpore截至目前最年轻的优秀开发者、IK&N战队队长、 阿里云专家博主、华为网络安全云享专家、腾讯云自媒体分享计划博主 本文主讲思路&#xff0c;可能有点废话。 该漏洞已修复 最开始的思…

华为OD机试真题 Java 实现【字符串重新排序】【2023Q1 100分】

一、题目描述 给定一个字串s&#xff0c;s包含以空格分隔的若干个单词&#xff0c;请对s进行如下处理后输出&#xff1a; 1、单词内部调整 对每个单词字母重新按字典序排序。 2、单词间顺序调整: 统计每个单词出现的次数&#xff0c;并按次数降序排列&#xff1b;次数相同…

存下吧!Spring高频面试题总结

Spring是什么&#xff1f; Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 Spring的优点 通过控制反转和依赖注入实现松耦合。支持面向切面的编程&#xff0c;并且把应用业务逻辑和系统服务分开。通过切面和模板减少样板式代码。声明式事务的支持。可以从单…

Windows系统下Chromedriver.exe安装及配置

Windows系统下Chromedriver.exe安装及配置 在利用selenium工具进行Web自动化测试时&#xff0c;必须先要安装浏览器驱动&#xff0c;通常比较常用的是谷歌浏览器和火狐浏览器。 一、浏览器驱动下载地址 1.浏览器驱动官网&#xff1a;http://chromedriver.storage.googleapis…

计算环境安全

计算环境安全 操作系统安全安全机制标识与鉴别访问控制权限管理信道保护安全审计内存保护与文件系统保护 安全部署原则操作系统安全配置密码远程暴力破解安全审计 针对系统的攻击信息收集公开信息收集-搜索引擎信息收集与分析的防范 缓冲区溢出缓冲区溢出基础-堆栈、指针、寄存…

Dubbo源码篇03---点点直连如何实现及背后原理

Dubbo源码篇03---从点点直连探究Complier编译的原理 什么是点点直连实际需求如何实现动态编译&#xff1f;如何发起调用?点点直连原理实现点点直连消费端提供端测试 点点直连小结 什么是点点直连 Dubbo正常的请求模型&#xff0c;都是消费端从注册中心拉取服务提供者列表&…

spring 命令执行 (CVE-2022-22947)

漏洞原理 该漏洞产生的原因是由于&#xff0c;当AddResponseHeaderGatewayFilterFactory传入的值进行计算(getValue())的时候&#xff0c;会逐一向上调用对应的方法&#xff0c;直到进入带有SpEL表达式解析器的位置进行最后的解析&#xff0c;从而触发了SpEL表达式注入漏洞。漏…

分组背包问题 java

&#x1f351; 算法题解专栏 &#x1f351; 分组背包问题 输入 3 5 2 1 2 2 4 1 3 4 1 4 5输出 8&#x1f468;‍&#x1f3eb; 参考题解 &#x1f351; 终极简化版 import java.util.Scanner;public class 分组背包极简版 {static int N 110;static int[] f new int[N]…

【大数据之Hadoop】三十、HDFS故障排除

使用3台服务器&#xff0c;恢复yarn快照。 1 NameNode故障处理 出现NameNode进程挂了并且存储的数据也丢失了&#xff0c;怎么恢复NameNode。 故障模拟&#xff1a; &#xff08;1&#xff09;kill掉NameNode的进程&#xff1a; kill -9 进程ID&#xff08;2&#xff09;删…

SpringCloud:微服务保护之授权规则

授权规则可以对请求方来源做判断和控制。 1.授权规则 1.1.基本规则 授权规则可以对调用方的来源做控制&#xff0c;有白名单和黑名单两种方式。 白名单&#xff1a;来源&#xff08;origin&#xff09;在白名单内的调用者允许访问 黑名单&#xff1a;来源&#xff08;origi…

【JAVAEE】阻塞队列的实现

目录 阻塞队列 生产者消费者模型 消息队列 消息队列的作用 1.解耦 2.削峰填谷 3.异步 演示JDK中的阻塞队列 实现一个阻塞队列 阻塞队列 队列&#xff0c;是一种先进先出&#xff08;FIFO&#xff09;数据结构。 阻塞队列也满足队列的特性&#xff1a; 入队元素时&am…

详细版易学版TypeScript - 泛型详解

一、泛型的基本使用 泛型&#xff1a;定义时不确定是什么类型&#xff0c;就先定义为泛型&#xff0c;等到使用时再去确定具体的类型 //实现需求&#xff1a;根据传入的数据value和数量count&#xff0c;返回有count个value值的数组 const myFuncTest1 (value: number, count:…

一文搞懂Bootloader跳转到APP 的方法和原理

一 跳转方法 1、检查栈顶地址是否合法 if (((*(uint32_t*)(NRF52840_APP_BASE)) & 0xffff0000 ) 0x20040000 ){nrf_bootloader_app_start();}在编译生成的APP.bin文件中,前4个字节存放的是__initial_sp&#xff0c;紧接着第二个地址存放的是Reset_Handler&#xff1b;这两…

【机器学习】决策树(基础篇)

决策树&#xff08;基础篇---分类问题&#xff0c;回归问题会另出一篇博客,但也是基础篇&#xff09; 思维导图前言了解决策树&#xff08;前后观看&#xff09;使用决策树&#xff08;感性的认识&#xff09;如何生成决策树&#xff08;原理部分&#xff0c;此部分有局限性&am…

一次失败的面试经历:我只想找个工作,你却用面试题羞辱我

金三银四就要来了&#xff0c;即将又是一波求职月&#xff0c;面对跳槽的高峰期&#xff0c;很多软件测试人员都希望能拿一个满意的高薪offer&#xff0c;但是随着招聘职位的不断增多&#xff0c;面试的难度也随之加大&#xff0c;而面试官更是会择优录取 小王最近为面试已经焦…

redis与mysql事务区别

mysql事务具有原子性&#xff0c;隔离性&#xff0c;一致性的特点。 redis提供multi&#xff0c; exec&#xff0c;watch来支持事务&#xff1a; 原子性&#xff0c;一致性&#xff1a; redis保证在multi&#xff0c;exec之间的语句作为一个整体执行&#xff0c;redis在exec后&…

【Linux进阶之路】基本指令(上)

文章目录 * —— 通配符与ls搭配使用与 rm 搭配使用 ctrl C——终止当前操作man——指令的指南man manman printfman pwd echo ——输出指定内容echo 字符串 cat ——打印文件呢内容cat 文件名常用选项 moreless常用 head——查看文件的前N行内容tail| ——管道cp——拷贝文…

【Android车载系列】第13章 车载渲染-OpenGL实现屏幕渲染

1 OpenGL渲染 上一章节我们通过SurfaceFlinger拿到Surface进行图像绘制&#xff0c;这节课我们通过GLSurfaceView来进行绘制&#xff0c;把摄像头的数据采集后展示渲染在屏幕上&#xff0c;这种方式是在GPU进行处理和绘制。 1.1 渲染使用GLSurfaceView 自定义CarView继承GLS…

考研数学武忠祥 高等数学0基础课笔记 函数和映射

常见的函数 取整函数的基本性质 函数的有界性 例题 sinx 是从-1到1的&#xff0c;但是x是无界的 遇到这种带sin的&#xff0c;就要试着取特殊值&#xff0c;让它为1或者为0 函数的单调性 函数的奇偶性 函数的周期性 举例 数学中Q表示有理数集&#xff0c;下面那个符号表示…