Hystrix

  • 0. 服务雪崩
  • 1. 熔断(服务提供方处理)
  • 1.1 服务熔断解决如下问题
  • 1.2 使用
  • 1.2.1 导入hystrix依赖
  • 1.2.2 修改controller
  • 1.2.3 @EnableCircuitBreaker
  • 1.3 服务熔断原理
  • 1.3.1 Hystrix中熔断的常用配置
  • 1.3.2 过程
  • 2. 降级(消费端处理)
  • 2.1 demo
  • 2.1.1 配置 开启降级feign.hystrix
  • 2.1.2
  • 2.1.3
  • 3. Hystrix原理


0. 服务雪崩

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

springcloud alibaba 雪崩_微服务

1. 熔断(服务提供方处理)

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

在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阀值缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是:@HystrixCommand。

1.1 服务熔断解决如下问题

当所依赖的对象不稳定时,能够起到快速失败的目的;
快速失败后,能够根据一定的算法动态试探所依赖对象是否恢复。

1.2 使用

1.2.1 导入hystrix依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>

1.2.2 修改controller

@RestController
public class DeptController {
    @Autowired
    private DeptService deptService;
   
    @HystrixCommand(fallbackMethod = "hystrixGet")
    @RequestMapping("/dept/get/{id}")//根据id查询
    public Dept get(@PathVariable("id") Long id){
        Dept dept = deptService.queryById(id);
        if (dept==null){throw new RuntimeException("这个id=>"+id+",不存在该用户,或信息无法找到~");}
        return dept;
    }
    
    /**
     * 根据id查询备选方案(熔断)
     * @param id
     * @return
     */
    public Dept hystrixGet(@PathVariable("id") Long id){
        return new Dept().setDeptno(id).setDname("这个id=>"+id+",没有对应的信息,null---@Hystrix~").setDb_source("在MySQL中没有这个数据库");
    }
}

1.2.3 @EnableCircuitBreaker

为主启动类添加对熔断的支持注解
@EnableCircuitBreaker //启用断路器

1.3 服务熔断原理

1.3.1 Hystrix中熔断的常用配置

circuitBreaker.requestVolumeThreshold
默认值20.意思是至少有20个请求才进行errorThresholdPercentage错误百分比计算。比如一段时间(10s)内有19个请求全部失败了。错误百分比是100%,但熔断器不会打开,因为requestVolumeThreshold的值是20. 这个参数非常重要,

circuitBreaker.sleepWindowInMilliseconds
过多长时间,熔断器再次检测是否开启,默认为5000,即5s钟

circuitBreaker.errorThresholdPercentage
设定错误百分比,默认值50%,例如一段时间(10s)内有100个请求,其中有55个超时或者异常返回了,那么这段时间内的错误百分比是55%,大于了默认值50%,这种情况下触发熔断器-打开。

按照以上配置的熔断器如下:
每当20个请求中,有50%失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到5s钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开

1.3.2 过程

最开始处于closed状态,一旦检测到错误到达一定阈值,便转为open状态;

这时候会有个 reset timeout,到了这个时间了,会转移到half open状态,尝试放行一部分请求到后端,一旦检测成功便回归到closed状态,即恢复服务;

springcloud alibaba 雪崩_微服务_02

2. 降级(消费端处理)

2.1 demo

2.1.1 配置 开启降级feign.hystrix

# 开启降级feign.hystrix
feign:
  hystrix:
    enabled: true

2.1.2

@Component    //必须被spring 托管
public class IProductClientServiceFallbackFactory implements FallbackFactory<IProductClientService> {
    @Override
    public IProductClientService create(Throwable throwable) {
        //这里提供请求方法出问题时回退处理机制
        return new IProductClientService(){

            @Override
            public Product getProduct(long id) {
                Product p=new Product();
                p.setProductId(999999999L);
                p.setProductDesc("error");
                return p;
            }
        };
    }
}

2.1.3

@FeignClient(name="MICROSERVICE-PROVIDER-PRODUCT",
        configuration = FeignClientConfig.class,
        fallbackFactory = IProductClientServiceFallbackFactory.class)  // 配置要按自定义的类FeignClientConfig
public interface IProductClientService {

3. Hystrix原理