SpringCloud-Netflix学习笔记10——Hystrix实现服务熔断
创始人
2024-05-23 22:27:09
0

一、概述

1、分布式系统面临的问题

复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败!
在这里插入图片描述

2、服务雪崩

多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B 和微服务C又调用其他的微服务,这就是所谓的 “扇出”、如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的 “雪崩效应”。

对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒中内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障,这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。

我们需要 ·弃车保帅·

3、什么是Hystrix

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

“断路器” 本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个服务预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证了服务调用方的线程不会被长时间,不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

4、Hystrix能干嘛

  • 服务熔断
  • 服务降级
  • 服务限流
  • 接近实时的监控
  • … …

5、官网资料

https://github.com/Netflix/Hystrix/wiki

二、服务熔断

1、是什么?

熔断机制是对应雪崩效应的一种微服务链路保护机制。

当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回 错误的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。下面我们画个图来进行理解:

微服务之间肯定存在互相调用的关系,如下图,用户请求进入服务,调用服务A,服务A调用服务B,服务B调用服务C,服务C调用服务D,最后服务D响应给回用户,一次请求结束:
在这里插入图片描述
此时如果服务B宕机了,用不了了,那么这个调用链路就会发生故障,服务A一直等待去调用服务B,因为链路到不了服务D,不能响应给回用户,所以这次请求一直未结束,一直占用系统资源,严重的话可能会引起整个系统的故障:
在这里插入图片描述
我们服务熔断的含义就是,当服务B发生故障时,我们将服务A对服务B的调用过程给断掉,我们一开始就设置一个备选服务,当服务B发生故障时,我们可以去调用备选服务,给回用户响应,已结束本次请求:

当然,这个备选服务可以有两种选择:

  1. 备选服务的功能和服务B一样,可以正常执行调用服务C的流程,最后返回正确的响应信息。
  2. 备选服务直接返回错误信息,提醒用户本次请求发生错误。

在这里插入图片描述

熔断机制的注解是 @HystrixCommand

我们下面的例子以方式二来说明。

三、实例

1、拷贝一份 springcloud-provider-dept-8001 命名为 springcloud-provider-dept-hystrix-8001
2、添加 Hystrix的依赖:

        org.springframework.cloudspring-cloud-starter-hystrix1.4.7.RELEASE

3、在可能发生错误的服务上添加一个注解 @HystrixCommand(fallbackMethod = "备选服务名(或函数名)")

4、编写备选服务,Controller 代码如下:

/提供Restful 服务
@RestController
@RequestMapping("/dept")
public class DeptController {@Autowiredprivate DeptService deptService;@GetMapping("/queryDeptById/{id}")// 如果这个方法调用失败,就会执行熔断备选方法queryDeptByIdHystrix@HystrixCommand(fallbackMethod = "queryDeptByIdHystrix")public Dept queryDeptById(@PathVariable("id") Long id){Dept dept = deptService.queryDeptById(id);if(dept == null){throw new RuntimeException("id=>" + id + "不存在该用户,或者信息无法找到!");}return dept;}// 熔断版的备选方案public Dept queryDeptByIdHystrix(@PathVariable("id") Long id){return new Dept().setDeptno(id).setDname("id=>" + id + "没有对应的信息,null--@Hystrix!").setDbSource("no this database in Mysql");}}

5、在主启动类上开启服务熔断,添加一个注解即可:

@EnableCircuitBreaker  //添加对Hystrix熔断的支持

接下来开启服务以及集群,就可以看到效果了!当服务发生错误时,会去执行备选服务,返回错误信息给用户!

相关内容

热门资讯

未来的房子作文300字 未来的房子作文300字(通用42篇)  在平凡的学习、工作、生活中,大家都不可避免地会接触到作文吧,...
成长的烦恼作文600字 精选成长的烦恼作文600字4篇  在学习、工作、生活中,大家都有写作文的经历,对作文很是熟悉吧,作文...
给自己的情书作文 给自己的情书作文(精选16篇)  在平凡的学习、工作、生活中,大家都不可避免地要接触到作文吧,作文是...
小学生科幻作文:未来宇宙 小学生科幻作文:未来宇宙  在平平淡淡的学习、工作、生活中,大家最不陌生的就是作文了吧,作文要求篇章...
热爱生命的作文 关于热爱生命的作文精选15篇  在平日的学习、工作和生活里,许多人都写过作文吧,写作文是培养人们的观...
四年级观察日记作文 关于四年级观察日记作文5篇  在日常生活或是工作学习中,大家都尝试过写作文吧,通过作文可以把我们那些...
最美好的自己作文 最美好的自己作文(精选47篇)  在平日的学习、工作和生活里,大家总免不了要接触或使用作文吧,作文根...
黄豆芽的生长过程观察日记 黄豆芽的生长过程观察日记(通用10篇)  一天的时间即将结束了,想必有很多难忘的瞬间吧,想必是时候写...
超越自己的作文 关于超越自己的作文(通用29篇)  在日常生活或是工作学习中,许多人都有过写作文的经历,对作文都不陌...
世界末日的想象作文1000字 世界末日的想象作文1000字  在平凡的学习、工作、生活中,大家都有写作文的经历,对作文很是熟悉吧,...
我们的校园作文400字 我们的校园作文400字5篇  我们的校园就是一个大花园。来到我校参观的人都说:“聚仁园虽小却美而精致...
挫折让我感受到成功作文 挫折让我感受到成功作文  谁都希望自己的人生是一帆风顺,鲜花和掌声人人都想要,可是挫折往往就在成功的...
未来世界的800字作文 未来世界的800字作文  在学习、工作、生活中,大家总少不了接触作文吧,作文是一种言语活动,具有高度...
假如我是钢铁侠作文_小学生作... 假如我是钢铁侠作文_小学生作文  在日常的学习、工作、生活中,大家都经常看到作文的身影吧,作文要求篇...
宇宙大战_小学作文 宇宙大战_小学作文  在日常的学习、工作、生活中,大家都跟作文打过交道吧,写作文可以锻炼我们的独处习...
柏林战争想象作文350字 柏林战争想象作文350字  我是苏联陆军第十三师的列兵米勒。  1945年4月,我们在队长老柯莱蒂的...
军训感受的作文 军训感受的作文(精选43篇)  在日复一日的学习、工作或生活中,大家对作文都再熟悉不过了吧,作文一定...
做更好的自己作文 做更好的自己作文(4篇)  无论在学习、工作或是生活中,大家都不可避免地会接触到作文吧,作文是由文字...
国王与啄木鸟童话故事 国王与啄木鸟童话故事  在平平淡淡的日常中,大家都有写故事的经历,下面是小编帮大家整理的国王与啄木鸟...
诗情画意作文 诗情画意作文14篇  在日常生活或是工作学习中,大家都经常看到作文的身影吧,作文是经过人的思想考虑和...