SpringCloud之 Hystrix服务熔断

news2025/9/21 2:17:45

文章目录

  • 一、Hystrix 服务熔断 (已过时)
    • 🍉1.1 服务降级
    • 🍉1.2 服务熔断
    • 🍉1.3 OpenFeign 实现降级
  • 二、hystrix-dashboard 监控
    • 🍋2.1 监控页面部署
    • 🍋2.2 观察现象


提示:以下是本篇文章正文内容,SpringCloud系列学习将会持续更新

在这里插入图片描述

一、Hystrix 服务熔断 (已过时)

官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.3.5.RELEASE/single/spring-cloud-netflix.html#_circuit_breaker_hystrix_clients

我们知道,微服务之间是可以进行相互调用的,那么如果出现了下面的情况会导致什么问题?
在这里插入图片描述

由于位于最底端的服务提供者E发生故障,那么此时会直接导致服务ABCD全线崩溃,就像雪崩了一样。
在这里插入图片描述

这种问题实际上是不可避免的,由于多种因素,比如网络卡顿、系统故障、硬件问题等,都存在一定可能,会导致这种极端的情况发生。因此,我们需要寻找一个应对这种极端情况的解决方案。

为了解决分布式系统的雪崩问题,SpringCloud 提供了 Hystrix 熔断器组件,他就像我们家中的保险丝一样,当电流过载就会直接熔断,防止危险进一步发生,从而保证家庭用电安全。可以想象一下,如果整条链路上的服务已经全线崩溃,这时还在不断地有大量的请求到达,需要各个服务进行处理,肯定是会使得情况越来越糟糕的。

我们来详细看看它的工作机制:

🍉1.1 服务降级

首先我们来看看服务降级,注意一定要区分开服务降级和服务熔断的区别,服务降级并不会直接返回错误,而是可以提供一个补救措施,正常响应给请求者。这样相当于服务依然可用,但是服务能力肯定是下降了的。

我们就基于借阅管理服务来进行讲解,我们不开启用户服务和图书服务,表示用户服务和图书服务已经挂掉了。

①我们在 borrowservice 模块中导入 Hystrix 的依赖 (Hystrix已经停止维护,SpringCloud 依赖中已经不自带了,所以需要单独导入)

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>

②接着我们需要在启动类添加@EnableHystrix注解开启:

@SpringBootApplication
@EnableHystrix   //启用Hystrix
public class BorrowApplication {
    public static void main(String[] args) {
        SpringApplication.run(BorrowApplication.class, args);
    }
}

由于用户服务和图书服务不可用,所以查询借阅信息的请求肯定是没办法正常响应的。
③这时我们使用@HystrixCommand注解选择一个备选方案,也就是说当服务出现异常时,返回我们的备选方案:

@RestController
public class BorrowController {
    @Resource
    private BorrowService borrowService;

    @HystrixCommand(fallbackMethod = "onError")  //使用 @HystrixCommand 来指定备选方案
    @GetMapping("/borrow/{uid}")
    public UserBorrowView findUserBorrows(@PathVariable("uid") int uid) {
        return borrowService.getBorrowViewByUid(uid);
    }

    // 注意参数和返回值要和上面的一致
    public UserBorrowView onError(int uid) {
        // 备选方案,这里直接返回空列表了
        return new UserBorrowView(null, Collections.emptyList());
    }
}

④可以看到,虽然我们的服务无法正常运行了,但是依然可以给浏览器正常返回响应数据:
在这里插入图片描述
在这里插入图片描述

服务降级是一种比较温柔的解决方案,虽然服务本身的不可用,但是能够保证正常响应数据。

回到目录…

🍉1.2 服务熔断

熔断机制是应对雪崩效应的一种微服务链路保护机制,当检测出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回”错误”的响应信息。当检测到该节点微服务响应正常后恢复调用链路。

实际上,熔断就是在降级的基础上进一步升级形成的,也就是说,在一段时间内多次调用失败,那么就直接升级为熔断。

我们可以在控制台打印两条日志,观察降级和熔断现象:

@Slf4j
@RestController
public class BorrowController {
    @Resource
    private BorrowService borrowService;
    
    @HystrixCommand(fallbackMethod = "onError")
    @GetMapping("/borrow/{uid}")
    public UserBorrowView findUserBorrows(@PathVariable("uid") int uid) {
        log.info("开始向其它服务器发送请求!");
        return borrowService.getBorrowViewByUid(uid);
    }
    public UserBorrowView onError(int uid) {
        log.warn("服务错误, 进入备选方案!");
        return new UserBorrowView(null, Collections.emptyList());
    }
}

服务降级:我们在浏览器中多次点击刷新按钮,对服务发起请求,可以看到后台:
在这里插入图片描述

服务熔断:我们接着疯狂的刷新,继续不断地发起请求:
在这里插入图片描述
一开始的时候,会正常地去调用 Controller 对应的方法 findUserBorrows(),发现失败然后进入备选方法,但是我们发现在持续请求一段时间之后,没有再调用这个方法,而是直接调用备选方案,这便是升级到了熔断状态。

再次检测:可以看到过了一段时间之后,会尝试正常执行一次 findUserBorrows(),但是依然是失败状态,所以继续保持熔断状态。
在这里插入图片描述

④开启 UserService 服务器:当另外两个服务正常运行之后,当再次尝试调用 findUserBorrows() 之后会成功,于是熔断机制就关闭了,服务恢复运行。
请添加图片描述

总结一下:
 它能够对一段时间内出现的错误进行侦测,当侦测到出错次数过多时,熔断器会打开,所有的请求会直接响应失败,一段时间后,只执行一定数量的请求,如果还是出现错误,那么则继续保持打开状态,否则说明服务恢复正常运行,关闭熔断器。
在这里插入图片描述

回到目录…

🍉1.3 OpenFeign 实现降级

Feign 的降级也是依靠 Hystrix 组件实现的,所以我们的启动类依然需要用 @EnableHystrix 注解来修饰。

Hystrix 降级: 当用户服务挂掉后,我们的 Controller 中的方法在执行过程中会抛出异常,进而被 Hystrix 监控到并进行服务降级。

Feign 降级: 实际上导致方法执行异常的根源就是远程调用失败。所以我们直接给失败的远程调用添加一个替代方案,对其单独降级操作。

①我们知道 Feign 都是以接口的形式来声明远程调用,那么既然远程调用已经失效,我们就自行对其进行实现,创建一个实现类:BookFallbackClient

@Component //注意,需要将其注册为 Bean,Feign才能自动注入
public class BookFallbackClient implements BookClient {
    @Override
    public Book findBookById(int bid) {
        return new Book();
    }
}

②实现完成后,我们只需要在原有的 BookClient 接口中指定失败替代实现即可:

@FeignClient(value = "bookservice", fallback = BookFallbackClient.class)
public interface BookClient {
    @GetMapping("/book/{bid}")
    Book findBookById(@PathVariable("bid") int bid);
}

③现在去掉 BorrowController@HystrixCommand注解和备选方法:

@RestController
public class BorrowController {
    @Resource
    private BorrowService borrowService;
    
    // @HystrixCommand(fallbackMethod = "onError")
    @GetMapping("/borrow/{uid}")
    public UserBorrowView findUserBorrows(@PathVariable("uid") int uid) {
        return borrowService.getBorrowViewByUid(uid);
    }
}

④最后我们在配置文件中开启熔断支持

feign:
  circuitbreaker:
    enabled: true

现在启动服务,调用接口试试看:
在这里插入图片描述
可以看到,现在已经采用我们的替代方案作为结果。在这里插入图片描述
Feign 服务降级也是可以升级为服务熔断的,下面我们会部署监控页面,就可以看到熔断的现象了。

回到目录…

二、hystrix-dashboard 监控

🍋2.1 监控页面部署

①除了对服务的降级和熔断处理,我们也可以对其进行实时监控,只需要安装监控页面即可,这里我们创建一个新的项目 hystrix-dashboard,并导入依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>

②接着创建主类,注意需要添加@EnableHystrixDashboard注解开启管理页面:

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

③接着给 hystrix 模块添加配置文件:

server:
  port: 8900
hystrix:
  dashboard:
    # 将localhost添加到白名单,默认是不允许的
    proxy-stream-allow-list: "localhost"

④然后我们将需要进行监控的 borrowservice 服务添加 Actuator 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Actuator 是 SpringBoot 程序的监控系统,可以实现健康检查,记录信息等。在使用之前需要引入spring-boot-starter-actuator,并做简单的配置即可。

添加此依赖后,我们可以在 IDEA 中查看运行情况:
在这里插入图片描述

⑤然后在 borrowservice 服务的配置文件中配置 Actuator 添加暴露

management:
  endpoints:
    web:
      exposure:
        include: '*'

回到目录…

🍋2.2 观察现象

接着我们打开刚刚启动的管理页面,地址为:http://localhost:8900/hystrix/
在这里插入图片描述
在中间填写要监控的服务:比如借阅服务 http://localhost:8082/actuator/hystrix.stream,注意后面要添加/actuator/hystrix.stream,然后点击 Monitor Stream 即可进入。

①我们可以看到监控页面的初始画面:
在这里插入图片描述
可以看到现在是 Loading 状态,这是因为还没有开始统计,我们现在尝试调用几次我们的服务:
在这里插入图片描述

②可以看到在调用之后,监控页面出现了信息:可以看到6次访问都是正常的,所以显示为绿色。
请添加图片描述

③接着我们将图书服务关闭,当错误率飙升到100%,且一段时间内持续出现错误,中心的圆圈也变成了红色,此时就是服务降级状态。
在这里插入图片描述

④在出现大量错误的情况下保持持续访问,可以看到此时已经将服务熔断,Circuit 更改为 Open 状态,并且图中的圆圈也变得更大,表示压力在持续上升。
在这里插入图片描述

回到目录…


总结:
提示:这里对文章进行总结:
本文是对SpringCloud的学习,学习了 Hystrix 的服务降级和熔断,Feign实现服务降级的方法,以及使用hystrix-dashboard 进行服务监控。之后的学习内容将持续更新!!!

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

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

相关文章

【PySide6】信号(signal)和槽函数(slot),以及事件过滤器

说明 在PYQT中&#xff0c;父控件可以通过两种方式响应子控件的事件&#xff1a; 通过信号(signal)和槽函数(slot)机制连接子控件和父控件父控件可以通过设置eventFilter()方法来监听响应子控件的事件 一、信号(signal)和槽函数(slot) 示例 在PYQT中&#xff0c;每个组件都…

传输线的物理基础(三):传输线的瞬时阻抗

每个信号都有一个上升时间 RT&#xff0c;通常是从 10% 到 90% 的电压电平测量的。当信号沿传输线向下移动时&#xff0c;前沿在传输线上展开并具有空间范围。如果我们可以冻结时间并观察电压分布向外移动时的大小&#xff0c;我们会发现类似下图的东西。传输线上上升时间的长度…

Python中的三器一闭(详细版)

python中的三器一闭迭代器什么是迭代什么是可迭代对象判断数据是否可迭代什么是迭代器迭代器的本质使用迭代器取数据自定义迭代器生成器创建生产器的方法关键字yieldnext和send装饰器装饰器的功能定义装饰器闭包什么是闭包函数、匿名函数、闭包、对象 当做实参时的区别迭代器 …

Blazor_WASM之3:项目结构

Blazor_WASM之3&#xff1a;项目结构 Blazor WebAssembly项目模板可选两种&#xff0c;Blazor WebAssemblyAPP及Blazor WebAssemblyAPP-Empty 如果使用Blazor WebAssemblyAPP模板&#xff0c;则应用将填充以下内容&#xff1a; 一个 FetchData 组件的演示代码&#xff0c;该…

蓝桥杯-最优清零方案(2022省赛)

蓝桥杯-最优清零方案1、问题描述2、解题思路3、代码实现1、问题描述 给定一个长度为 N 的数列 1,2,⋯,A1,A2,...,ANA_1,A_2,...,A_NA1​,A2​,...,AN​ 。现在小蓝想通过若干次操作将 这个数列中每个数字清零。 每次操作小蓝可以选择以下两种之一: 1. 选择一个大于 0 的整数, 将…

杂记——18.VSCode的下载及使用

这篇文章&#xff0c;我们来讲一下VSCode&#xff0c;讲一下如何下载及使用VSCode 目录 1.VSCode的下载 1.1VSCode的简介 1.2VSCode的下载与安装 1.2.1下载 1.2.2安装 2.VSCode的使用 2.1界面 2.2基础设置 2.3禁用自动更新 2.3自动保存设置 2.4Vscode更换主题 2.5…

Hive面试题-HQL转换MapReduce底层核心逻辑剖析

视频可查看&#xff1a;https://www.bilibili.com/video/BV1RV41147Tb/?spm_id_from333.999.0.0&vd_source3ba3c3ba31427f60d734ede7a948de4a 原文地址&#xff1a;Hive学习之路 &#xff08;二十&#xff09;Hive 执行过程实例分析 - 扎心了&#xff0c;老铁 - 博客园 (c…

K_A14_012基于STM32等单片机驱动GY-25倾斜度角度模块 串口与OLED0.96双显示

K_A14_012基于STM32等单片机驱动GY-25倾斜度角度模块 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RCGY-25倾斜度角度模块1.2、STM32F103C8T6GY-25倾斜度角度模块五、基础知识学习与相关资料下…

测试按方向的分类

按方向分(都是在系统测试阶段测试的) 功能测试&#xff1a;举例说明什么是功能 性能测试 ①压力测试&#xff1a;不断地增加压力&#xff0c;从而找到系统的极限 ②负载测试&#xff1a;系统在极限工作条件下&#xff0c;最多能持续多久——可能发生内存泄漏/溢出&#xff0c;导…

angular技术(持续更新)

css类绑定[class.color-blue]"isBlue()" 如果isBlue()返回为true 这里使用color-blue的class样式style样式绑定[style.background-color]"canclick ? blue: red" 组件与模块模块的元数据*declarations: 用于指定属于这个模块的视图类&#xff08;View Cla…

CM6.3.2启用Kerberos(附问题解决)

基础准备支持JCE的jdk重新安装JCE的jdk(已正确配置跳过)删除/usr/java/下面的jdk,然后通过CM->管理->安全->安装Java无限制...重新安装后,配置Java(可选)主机->主机配置->搜java->Java主目录 配置路径主机->所有主机->设置->高级:Java配置Kerberos安…

[算法]插入排序

参考&#xff1a;《漫画算法-小灰的算法之旅》 目录 1、排序算法的思想 2、具体步骤 3、插入排序的优化 4、时间复杂度和空间复杂度 5、代码 1、排序算法的思想 维护一个有序区&#xff0c;把元素一个个插入有序区的适当位置&#xff0c;直到所有元素都有序为止。 2、具体…

多线程面试题

1. Sychronized的锁升级过程是怎样的&#xff1f; 2. Tomcat 中为什么要使用自定义类加载器&#xff1f; 3. 说说对线程安全的理解 4. 对守护线程的理解 5. 并发、并行、串行之间的区别 6. Java死锁如何避免&#xff1f; 7. 谈谈你对AQS的理解&#xff0c;AQS如何实现可重入锁&…

华为机试题:HJ107 求解立方根(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

2023年品牌惊蛰节气海报赏析

今天是3月6日——惊蛰&#xff0c;春日渐暖&#xff0c;春雷乍起&#xff0c;北方大地正在迎来新生&#xff0c;小鸟在枝头欢叫、种子在努力发芽&#xff0c;各大品牌也赶早发布了最新的惊蛰节气海报。下面就来和我们一起看看吧。 1&#xff0c;中国日报 2&#xff0c;BDuck…

java日志

日志是软件开发的重要组成部分。一个精心编写的日志代码提供快速的调试&#xff0c;维护方便&#xff0c;以及应用程序的运行时信息结构化存储。日志记录确实也有它的缺点。它可以减缓的应用程序Log4jLog4j是Apache的一个开放源代码项目&#xff0c;通过使用Log4j&#xff0c;我…

Spring | 基础

1. IOC和DI IOC&#xff1a;控制反转&#xff0c;其思想是反转资源获取的方向&#xff0c;传统的资源查找方式要求组件向容器发起请求查找资源&#xff0c;作为回应&#xff0c;容器适时的返回资源。而应用了 IOC 之后&#xff0c;则是**容器主动地将资源推送给它所管理的组件…

Sectigo中间证书根证书说明

Sectigo SSL证书产品证书链主要分为两个版本&#xff0c;常见的的一种版本多&#xff0c;但随着安全性提升&#xff0c;证书链的加载方式变化&#xff0c;第二种版本证书链更具备安全需要&#xff0c;对此做了详细说明。一、兼容性最高版本&#xff0c;根证书算法&#xff1a;s…

BI 是如何数据分析的?

企业部署商业智能BI前&#xff0c;需要进行详细的分析&#xff0c;了解BI能为企业带来多少价值&#xff1f;如何提高工作效率的等等&#xff0c;今天我们就来聊一聊 BI 的工作原理。 一、BI的取数方式 商业智能BI是通过访问和连接业务系统数据源数据库的方式来进行取数的&…

记录gitlab和jenkins集成的过程

gitlab设置外发请求 首先在前面的几篇文章中&#xff0c;我们的gitlab和jenkins都安装好了&#xff0c;在这里我们就可以对gitlab 和jenkins进行集成操作处理。 首先设置gitlab的外发请求,如图所示: 先点击管理员&#xff0c;进入到管理中心后 先点击设置&#xff0c;然后点击…