Hystrix

137 阅读3分钟

雪崩效应

服务A调用B,B调用C,C岔劈,B等C,A全来B等C,线程不够,死机,一个服务引起一串服务崩溃,就是雪崩

解决雪崩问题的常见方式:

  • 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待
  • 舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。
  • 熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。
  • 流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。

Hystrix实现熔断降级

Feign默认也有对Hystix的集成 容错(服务降级):当hystrix进行保护的时候,提供的一种异常处理(提供兜底数据)

线程隔离,服务降级

配置开启Hystrix

  • 不是在Feign模块里,而是在消费者模块里
#服务降级
feign:
  hystrix:
    enabled: true #开启熔断功能

降级的处理类

  • 也就是重写一下方法,正常走自动生成的实现类,出事儿走咱们写的实现类
public class UserClientFallback implements UserClient {
    @Override
    public User queryById(Long id) {
        User user = new User();
        user.setUsername("降级辣");
        return user;
    }
}

Feign客户端中,提供访问出错指定降级类

//fallback
@FeignClient(value = "user-service",configuration = FeignConfig.class,
fallback = UserClientFallback.class)

@Import引入降级实现类

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients(clients = UserClient.class)
@Import(UserClientFallback.class) //引入降级实现类
public class OrderApplication {

    public static void main(String[] args) {

        SpringApplication.run(OrderApplication.class, args);
    }

服务熔断

熔断器有三个状态 CLOSEDOPENHALF_OPEN 熔断器默认关闭状态,当触发熔断后状态变更为 OPEN,在等待到指定的时间,Hystrix会放请求检测服务是否开启,这期间熔断器会变为HALF_OPEN 半开启状态,熔断探测服务可用则继续变更为 CLOSED关闭熔断器。

  • Closed:关闭状态(断路器关闭),所有请求都正常访问。
  • Open:打开状态(断路器打开),所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全关闭。默认失败比例的阈值是50%,请求次数最少不低于20次。
  • Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放1次请求通过,若这个请求是健康的,则会关闭断路器,否则继续保持打开,再次进行5秒休眠计时。

测试

通过配置修改熔断策略(注意,是在消费者端)

hystrix:
  command:
    default:
      circuitBreaker:
        requestVolumeThreshold: 5 # 触发熔断的最小请求次数,默认20
        errorThresholdPercentage: 50 #触发熔断的失败请求最小占比,默认50%
        sleepWindowInMilliseconds: 10000 #休眠时长,默认是5000毫秒