当前位置:网站首页>hystrix 服务熔断和服务降级
hystrix 服务熔断和服务降级
2022-08-03 11:24:00 【叮当的猫猫】
原理
雪崩效应(熔断器的背景)
在微服务架构中,一个应用由多个服务组成。相互依赖,依赖关系错综复杂。若有一个服务因为故障原因,可能会导致整个服务崩溃。
例如一个微服务架构存在A、B、C、D、E、F等多个服务,它们的依赖关系如下图
请求1调用A、D、E、F四个服务才能完成。请求 2 需要调用 B、E、D 三个服务才能完成请求 3 需要调用服务C、F、E、D四个服务才能完成。
微服务之间的调用,就是所谓的扇出,当扇出的链路上服务E发生了故障后者网络验证,会出现以下情况:
1即使其他所有服务都可用,由于服务E不可用,那么用户请求1,2,3都会处于阻塞状态,在高并发的环境下,会导致服务器资源的线程资源短时间耗尽
2 所有的依赖于服务E的其他服务,例如服务 B、D 以及 F 也都会处于线程阻塞状态,会处于等待服务E的响应状态,导致这些服务不可用
3 所有依赖服务B、D 和 F 的服务,例如服务 A 和服务 C 也会处于线程阻塞状态,以等待服务 D 和服务 F 的响应,导致服务 A 和服务 C 也不可用
通过上面可以看出来,微服务系统因为一个服务出现故障,而导致故障沿着服务调用而疯狂蔓延
进而导致整个微服务系统瘫痪,这就是"雪崩效应"
为了防止此类事件发生,微服务架构引入了"熔断器"的一些列的服务容错和保护措施。
熔断器简介
物理学电路知识涉及到熔断器(Circuit Breaker)的概念,当电路发生故障时,会迅速切断电源来保护电路的安全。
在微服务架构中有些微服务由于网络问题或服务故障的原因,熔断器及时作出向服务调用方返回一个符合预期的,可处理的降级响应(FallBack),而不是让用户长时间的等待或者抛出用户无法处理的异常
这样保证了服务提供方不会对系统资源长时间的,不必要的占用,避免故障在微服务系统中的蔓延,防止雪崩效应的产生。
Spring Cloud Hystrix
Spring Cloud Hystrix是一款优秀的服务容错和保护组件,也是Spring Cloud的重要组件之一
Spring Cloud Hystrix是基于Netfilx公司的开源组件Hystrix实现的。提供熔断器功能,能够有效阻止分布式服务系统中出现联动故障,以提高微服务系统的弹性。
Spring Cloud Hystrix具有服务降级,服务熔断,线程隔离,请求缓存,请求合并以及实时故障监控等强大功能。
Hystrix [hɪst'rɪks],中文含义是豪猪,豪猪的背上长满了棘刺,使它拥有了强大的自我保护能力。
而 Spring Cloud Hystrix 作为一个服务容错与保护组件,也可以让服务拥有自我保护的能力,
因此也有人将其戏称为“豪猪哥”。
Hystrix能做什么
保护线程资源: 防止 单个服务 的 故障耗尽系统 中 所有的线程资源
快速失败机制: 当 某个服务 发生了故障,不让 服务调用方 一直等待,而 直接返回一个可预期的 , 可处理的 降级响应。
提供降级(FallBack)方案: 在 请求失败后 ,提供一个设计好的 降级方案,当 请求失败后 调用此方法。
防止故障扩散: 使用 熔断机制,防止 故障扩散到其他服务。
提供熔断器 故障监控组件 Hystrix Dashboard ,随时 监控 熔断器的状态
服务正常请求
出现服务故障时,它可以阻止整个用户请求
随着大容量通信的增加,某个服务的故障会导致所有服务器上的线程资源短时间内饱和
应用程序中通过网络或客户端库可能导致网络请求的每个点都是潜在故障的来源。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,从而备份队列、线程和其他系统资源,从而导致更多跨系统的级联故障,引起雪崩现象
当使用Hystrix包装每个基础依赖项时,上面的图表中所示的体系结构会发生类似于以下关系图的变化。每个依赖项是相互隔离的,限制在延迟发生时它可以填充的资源中,并包含在回退逻辑中,该逻辑决定在依赖项中发生任何类型的故障时要做出什么样的响应:
Hystrix服务熔断
熔断机制是为了应对雪崩效应而出现一种微服务链路保护机制。
当微服务系统的某个微服务不可用或响应时间太长时,为了保护系统的服务整体可用性,熔断器会暂时切断对该服务的请求调用,并快速返回一个友好的错误响应信息。这种熔断状态不是永久的,在经历了一定时间后,熔断器会再次检测该微服务是否恢复正常,若恢复正常则恢复调用链路。

熔断 关闭 状态(Closed):当服务 访问正常 时,熔断器处于 关闭状态,服务调用方可以 正常地对服务进行调用。
熔断 开启 状态(Open):默认情况下,在 固定时间内 接口调用 出错比率 达到一个阈值(例如 50%),熔断器 会进入 熔断开启状态。
进入熔断状态后,后续对该服务的调用都会被切断,熔断器会 执行本地的降级(FallBack)方法。
半 熔断 状态(Half-Open): 在 熔断开启 一段时间 之后,熔断器会进入 半熔断状态 。
在半熔断状态下,熔断器会 尝试恢复 服务调用方对服务的调用,允许 部分请求 调用该服务,并 监控 其 调用成功率。
如果 成功率 达到预期,则说明 服务已恢复正常,熔断器 进入 关闭状态;如果成功率 仍旧很低,则重新进入 熔断开启 状态。
Hystrix熔断实现
<!--引入hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
开启断路器
@SpringBootApplication
@EnableCircuitBreaker //用来开启断路器
public class Products9998Application {
public static void main(String[] args) {
SpringApplication.run(Products9998Application.class, args);
}
}
//服务熔断
@GetMapping("/product/break")
@HystrixCommand(fallbackMethod = "testBreakFall" )
public String testBreak(int id){
log.info("接收的商品id为: "+ id);
if(id<=0){
throw new RuntimeException("数据不合法!!!");
}
return "当前接收商品id: "+id;
}
public String testBreakFall(int id){
return "当前数据不合法: "+id;
}
HystrixProperty配置

@HystrixCommand(fallbackMethod = "prop",commandProperties =
{
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //开启熔断器
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value ="1000"), //统计时间窗
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), //统计时间窗内请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //休眠时间窗口期
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), 在统计时间窗口期以内,请求失败率达到 60% 时进入熔断状态
})
@Override
public User getUserById(int id) {
if(id<0)
{
throw new RuntimeException("ID为负数,用户ID不存在");
}
User user = userMapper.getUserById(id);
if(null == user)
{
throw new RuntimeException("该用户不存在");
}
return user;
}
public User prop(int id)
{
return new User().setId(id).setUsername("用户ID不存在,请您确认好信息").setAlias(null);
}
服务降级
边栏推荐
猜你喜欢

Babbitt | Metaverse daily must-read: Players leave, platforms are shut down, and the digital collection market is gradually cooling down. Where is the future of the industry?...

Classical Architecture and Memory Classification of Embedded Software Components

实至名归!九章云极DataCanvas公司荣获智能制造领域多项殊荣

第四周学习 HybridSN,MobileNet V1,V2,V3,SENet

Cross-chain bridge protocol Nomad suffers hacker attack, losing more than $150 million

Redis发布订阅和数据类型

微信小程序获取用户手机号码

Android 技术面试准备(含面试题及答案)

MySQL - 2059 - Authentication plugin ‘caching_sha2_password‘ cannot be loaded

VRRP协议的作用及VRRP+OSPF配置方法
随机推荐
viewstub 的详细用法_pageinfo用法
MySQL数据库实战(1)
完全背包问题
[Output each bit of an integer, from high to low.With and without recursion]
什么是bin文件?「建议收藏」
html+css+php+mysql实现注册+登录+修改密码(附完整代码)
"Global Digital Economy Conference" landed in N World, Rongyun provides communication cloud service support
[LeetCode—Question 2 Sum of Two Numbers Detailed Code Explanation ] The source code is attached, which can be copied directly
Dva.js 新手入门指南
Polymorphism in detail (simple implementation to buy tickets system simulation, covering/weight definition, principle of polymorphism, virtual table)
C#/VB.NET 从PDF中提取表格
Question G: Word Analysis ← Questions for the second provincial competition of the 11th Blue Bridge Cup Competition
字节最爱问的智力题,你会几道?
Cookie and Session usage
thymeleaf中的日期格式转化
asdn涨薪技术之apifox+Jenkins如何玩转接口自动化测试
SmobilerService 推送实现
微信多开批处理(自动获取安装路径)
CADEditorX ActiveX 14.1.X
【TypeScript】Why choose TypeScript?