Spring Cloud教程 第四弹 Hystrix熔断器

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

 

1、 Hystrix概述

1.1、Hystrix是什么?

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

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

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

 

Spring Cloud教程 第四弹 Hystrix熔断器

 

 

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.18hystrix github

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

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

 

 

2、Hystrix入门

2.1、pom.xml

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


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
		

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

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

 

 

2.2、application.yml

 

management:
  security:
    enabled: false
  endpoints:
    web:
      exposure:
        # 暴露端点:/actuator/hystrix.stream
        include: hystrix.stream
        #include: '*'

 

2.3、具体使用方式

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

 

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

 

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

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/common")
public class CommonController {
   

    /**
     * 定义降级方法
     * 如果原方法有参数,则降级方法也必须要有参数,否则报错,且位置在Throwable之前
     */
    public String fallback(Integer type,Throwable t){
        return "调用降级方法:"+t.getMessage();
    }


    @GetMapping("/hystrix")
    //fallbackMethod指定降级方法,commandProperties用于配置@HystrixCommand
    @HystrixCommand(fallbackMethod = "fallback",commandProperties = {})
    public String hystrix(Integer type){
        if(type == 0){
            return "ok";
        }else{
            throw new NullPointerException("空指针异常");
        }
    }

}

2.4、仪表盘

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

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

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

 

 

Spring Cloud教程 第四弹 Hystrix熔断器

 

Spring Cloud教程 第四弹 Hystrix熔断器

 

上一篇:Cannot resolve configuration property 'feign.hystrix.enabled'


下一篇:互联网高并发解决方案(1)-基于Hystrix实现服务隔离与降级