当前位置: 首页 > article >正文

Spring Cloud实现微服务- 熔断机制

1. 熔断机制介绍

在介绍熔断机制之前,我们需要了解微服务的雪崩效应。在微服务架构中,微服务是完成一个单一的业务功能,这样做的好处是可以做到解耦,每个微服务可以独立演进。但是,一个应用可能会有多个微服务组成,微服务之间的数据交互通过远程过程调用完成。这就带来一个问题,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。
熔断机制是应对雪崩效应的一种微服务链路保护机制。我们在各种场景下都会接触到熔断这两个字。高压电路中,如果某个地方的电压过高,熔断器就会熔断,对电路进行保护。股票交易中,如果股票指数过高,也会采用熔断机制,暂停股票的交易。同样,在微服务架构中,熔断机制也是起着类似的作用。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand,Hystrix会找有这个注解的方法,并将这类方法关联到和熔断器连在一起的代理上。当前,@HystrixCommand仅当类的注解为@Service或@Component时才会发挥作用。
上一节中,我们提到,微服务之间的调用可以通过两种方式,一个是RestTemplate,另一个是Feign。相对应,在这两种调用方式下,都有Hystrix调用方法。

2. 代码实现及验证

本次代码实现对RestTemplate和Feign两种微服务调用场景下,使用Hystrix验证Spring Cloud的熔断机制。

2.1 RestTemplate的微服务调用场景

在第五节负载均衡,我们使用了RestTemplate实现了服务之间的调用。我们基于这一部分的代码,增加Hystrix,实现熔断机制。
1) 启动Eureka-Server及LOADBALANCE-SERVICE,不要启动Bookingcar-Service
 
点击"LOADBALANCE-SERVICE"后面链接,进入负载均衡验证页面,输入请求参数/v1/lb/testport?name=bookingcar-service,我们会在页面上得到以下的错误提示:
 
2)  在pom.xml里,添加对Hystrix的依赖
 
3)在ribbon-service入口程序RibbonServiceApplication.java处添加注解@EnableCircuitBreaker,开启熔断器功能,如下所示:
 
4) 在LoadBalanceService.java里,使用了@Service注解声明了LoadBalanceService类。我们在LoadBalanceService类里通过@HystrixCommand注解引入对TestPort调用的熔断机制,@HystrixCommand注解里可以添加回调函数,如@HystrixCommand(callbackCommand = "XXX“),当无法调用TestPort服务时,熔断机制的回调函数就会发生作用,对错误进行快速处理。
 
5) 重新启动LOADBALANCE-SERVICE, 再次进入负载均衡验证页面,输入请求参数/v1/lb/testport?name=bookingcar-service,我们发现熔断机制已经发挥作用:
 

2.2 Feign的微服务调用场景

上一节,我们利用Feign实现了微服务间的内部调用,Feign中也内置了对Hystrix的支持。
1) 运行Report,同样不要启动BOOKINGCAR-SERVICE
 
点击REPORTING-SERVICE后面链接,进入Feign验证页面,输入参数v1/order/1,我们可以看到如下的错误提醒页面:
 
2) 在application.properties里,添加feign.hystrix.enabled=true,使能Feign对hystrix的支持,如下所示:
 
需要说明的是,在某个微服务中开启断路器,实现的是该微服务对其下游微服务的熔断功能,而不是该微服务对其上游调用的熔断,这一点大家不要混淆了,因为在Spring Cloud的微服务体系下,熔断的实现是基于Hystrix本地库来实现的,本质上是客户端熔断,而不是服务端的熔断。相比较于最近谈论比较多的基于Service Mesh的限流熔断功能而言,基于客户端的熔断从应用的形态上看,是与微服务本身融合在一起的,而不是独立的服务。
3)在pom.xml里,添加对Hystrix的依赖
 
4) 在Report的入口程序ReportsApplication里,添加注解@EnableCircuitBreaker,开启熔断器功能,如下所示:
 
5) 在OrderClient.java里Feign的注解里,添加回调函数的参数
 
6) 添加一个新的类OrderClientHystrix,当调用微服务发生错误时,进行处理,本示例中,会返回“Hystrix works in Feign”的信息。
 
7)重新运行Report,点击REPORTING-SERVICE后面链接,输入请求参数v1/order/1,我们发现熔断机制已经发挥作用,显示如下:
 

3. 总结:

微服务本身是一种分布式架构,当调用链路过长时,系统的可用性是很大的挑战。Spring Cloud框架的Hystrix提供了熔断机制,在RestTemplate和Feign两种对微服务调用的场景下都可以使用,当调用链路出现问题时可以快速进行服务降级处理,为我们提高微服务架构的可用性提供了很大的帮助。

 


http://www.kler.cn/a/5175.html

相关文章:

  • Three.js教程015:全面讲解Three.js的UV与应用
  • Kivy,跨平台UI的艺术家
  • HTTP-响应协议
  • Effective C++读书笔记——item13(使用对象管理资源)
  • 精度论文:【Coordinate Attention for Efficient Mobile Network Design】
  • [Git] git cherry-pick
  • 2023年四月份图形化三级打卡试题
  • Jenkins自动化部署实例讲解
  • 【WEB前端进阶之路】 HTML 全路线学习知识点梳理(中)
  • 倒计时时钟
  • UNIX环境高级编程——UNIX基础知识
  • 实战:向人工智能看齐用Docker部署一个ChatGPT
  • 科大奥瑞物理实验——半导体封装实验
  • python -m pip install --upgrade pip 升级失败
  • 2023-04-01 解决使用sort()方法对数字数组排序失效的问题,sort()方法的参数:比较函数,如何根据对象属性,将对象构成的数组进行排序?
  • linux基础之计算机基础
  • ChatGPT 出现严重技术漏洞,“当红炸子鸡”翻车了?
  • Unity创建自定义脚本模板
  • 文件操作—IO
  • 力扣刷题笔记21——两个链表的第一个公共节点/栈方法和双指针法
  • Typescript快速入门
  • TCP连接的三次握手和连接释放的四次挥手图文详解
  • 总结:磁盘写入原理
  • ijkplayer 源码分析(1):初始化流程
  • Java中的Math类和String、StringBuffer、StringBuilder类
  • C# 各种文件和路径操作小结