Spring Cloud教程 第四弹 Hystrix熔断器

骑猪看日落 2022-12-20 11:26 230阅读 0赞

更多Spring与微服务相关的教程请戳这里 Spring与微服务教程合集

1、 Hystrix概述

1.1、Hystrix是什么?

hystrix是spring cloud netflix项目中的一个熔断器(circuit breaker),hystrix实现了熔断器模式,可以理解为熔断器是抽象的,而hystrix是具体的实现。

Hystrix是一个延迟和容错库,旨在隔离远程系统、服务和第三方库,阻止级联故障,在复杂的分布式系统中实现恢复能力

Hystrix单词意为豪猪,表示浑身有刺来保护自己

20201112104320740.png

1.2、为什么要用Hystrix

  • 当正常流量情况下,系统稳定运行;当进行促销、秒杀等活动,流量暴增,可能会影响某个服务A,导致CPU、内存占用过高等问题,结果导致服务A延迟,响应过慢;随着压力持续增加,服务A承受不住压力导致机器内部资源耗尽,这时会导致大量请求堆积彻底使服务A不可用。更糟糕的是,其它服务依赖了服务A,导致其它服务也出现请求堆积、资源占用等问题,这时会导致整个系统出现大面积的延迟和瘫痪,直到整个系统不可用。
  • 在微服务体系中,多层调用是很常见的,较低级别的服务出现故障,会导致级联故障,直到传到用户那里。
  • 当由10秒定义的滚动窗口中,假如请求过多或请求超时,导致服务不堪重负时,需要一种机制来处理延迟和故障,并保护整个系统处于稳定的状态。断路器就是这样一种机制,当出现错误或断路情况下,断路器就会打开,并且开发人员可以提供备用(fallback)方法。

1.3、Hystrix的设计目标

  • 通过客户端库对延迟和故障进行保护和控制
  • 在一个复杂的分布式系统中停止级联故障
  • 快速失败和迅速恢复
  • 在合理的情况下回退和优雅地降级
  • 开启实时监控、告警和操作控制

1.4、Hystrix现状

Hystrix 当前已经进入为维护阶段,Netflix 认为Hystrix的定位和使命在功能上,当前已经完全满足了既有的内部系统,所以后期不再有新的开发和新的特性出现。

团队由于精力的原因,在Github上,不再review issue,不再接受Merge request,也不再发布新的版本,版本定格在1.5.18。hystrix github

Hystrix虽然官方社区不再维护,但是其客户端熔断保护,断路器设计理念,有非常高的学习价值,为我们在服务保护的设计上,提供了非常好的设计思路;

除了官方不再维护之外,hystrix目前对于一般的分布式服务调度,甚至本地服务保护上,完全可以胜任,在短期内可以正常使用。

2、Hystrix入门

2.1、pom.xml

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-actuator</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.cloud</groupId>
  11. <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
  12. </dependency>

这里分别介绍一下三个依赖的作用:

  1. 第一个是hystrix的依赖,这个是必须的
  2. 第二个是因为hystrix需要暴露端点以支持hystrix仪表盘,关于仪表盘后面会讲到
  3. 第三个是hystrix仪表盘的依赖

2.2、application.yml

  1. management:
  2. security:
  3. enabled: false
  4. endpoints:
  5. web:
  6. exposure:
  7. # 暴露端点:/actuator/hystrix.stream
  8. include: hystrix.stream
  9. #include: '*'

2.3、具体使用方式

启动类需要打上这几个注解:

  • @EnableHystrix或@EnableCircuitBreaker,这两个打一个就行,@EnableHystrix是@EnableCircuitBreaker的子类
  • @EnableHystrixDashboard,用于开启仪表盘

将@HystrixCommand注解打在需要熔断的方法上

  1. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. @RequestMapping("/common")
  6. public class CommonController {
  7. /**
  8. * 定义降级方法
  9. * 如果原方法有参数,则降级方法也必须要有参数,否则报错,且位置在Throwable之前
  10. */
  11. public String fallback(Integer type,Throwable t){
  12. return "调用降级方法:"+t.getMessage();
  13. }
  14. @GetMapping("/hystrix")
  15. //fallbackMethod指定降级方法,commandProperties用于配置@HystrixCommand
  16. @HystrixCommand(fallbackMethod = "fallback",commandProperties = {})
  17. public String hystrix(Integer type){
  18. if(type == 0){
  19. return "ok";
  20. }else{
  21. throw new NullPointerException("空指针异常");
  22. }
  23. }
  24. }

2.4、仪表盘

hystrix仪表盘用于监控hystrix的各项指标,具体使用方式如下:

访问http://ip:port/上下文/hystrix

输入要监控的URL,比如:http://ip:port/上下文/actuator/hystrix.stream,再输入延迟和标题,最后点Monitor Stream即可

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hsXzE4MDM_size_16_color_FFFFFF_t_70

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hsXzE4MDM_size_16_color_FFFFFF_t_70 1

发表评论

表情:
评论列表 (有 0 条评论,230人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring cloud 熔断Hystrix

    在微服务的体系下,服务之间是与依赖关系的!服务的调用中也存在着各种可能的问题,如果一个服务处理缓慢,可能会导致服务被阻塞住,导致整个系统被拖慢,甚至是崩溃。这种情况下可以