博客
关于我
【SpringCloud】Hystrix熔断器
阅读量:413 次
发布时间:2019-03-06

本文共 3128 字,大约阅读时间需要 10 分钟。

Hystrix熔断器技术解读

概述

Hystrix是一款开源的延迟和容错库,专注于处理分布式系统中的依赖故障。它通过熔断机制,防止单点故障对整个系统造成连锁崩溃,提升系统的弹性和容错能力。

分布式系统面临的问题

在复杂的分布式体系中,多个服务之间存在数十个依赖关系。这些依赖关系在某些时候不可避免地会失败,例如超时、异常等。这种情况会导致服务链路的“雪崩效应”,即多个微服务同时出现故障,导致系统资源被迅速占满,最终引发系统崩溃。

雪崩效应的典型表现是:

  • 单一依赖故障导致多个服务被占用,系统资源耗尽
  • 延迟增加、队列积压、线程耗尽等
  • 级联故障,使得整个系统陷入停滞
  • Hystrix的功能

    Hystrix通过以下方式解决分布式系统的依赖问题:

  • 服务降级:在依赖不可用或超时时,自动切换到一个友好的兜底响应,避免长时间等待或异常抛出。
  • 服务熔断:类似保险丝,当依赖达到阈值时,直接拒绝访问,切换到兜底逻辑,减少系统资源消耗。
  • 监控:提供实时的调用监控,帮助开发人员快速发现问题。
  • Hystrix的核心概念

    服务降级

    服务降级是Hystrix的核心功能之一。当调用目标服务出现问题时,Hystrix会自动触发降级逻辑,返回一个预定义的友好响应。

    降级触发条件

    • 依赖超时
    • 依赖运行异常
    • 线程池资源耗尽

    降级优点

    • 避免长时间等待
    • 保持系统资源可用
    • 提供友好提示给调用方

    服务熔断

    熔断机制是Hystrix防雪崩效应的关键功能。当依赖服务在一定时间内出现多次失败或超时时,Hystrix会开启熔断机制,停止向该服务发起请求,切换到降级逻辑。

    熔断参数

    • circuitBreaker.requestVolumeThreshold:请求总数阀值,默认为20次
    • circuitBreaker.sleepWindowInMilliseconds:熔断后暂停的时间,默认为10秒
    • circuitBreaker.errorThresholdPercentage:错误率阀值,默认为50%

    服务限流

    Hystrix也支持服务限流功能,通过限制请求数量,防止高并发下系统资源被过度占用。常用于秒杀等高并发场景。

    Hystrix的案例

    构建Hystrix服务

    1. 创建服务提供者

    org.springframework.cloud
    spring-cloud-starter-netflix-hystrix

    2. 配置服务发现

    eureka:  client:    register-with-eureka: true    fetch-registry: true    service-url:      defaultZone: http://eureka7001.com:7001/eureka

    3. 主启动类

    @SpringBootApplication@EnableEurekaClientpublic class PaymentHystrixMain8001 {    public static void main(String[] args) {        SpringApplication.run(PaymentHystrixMain8001.class, args);    }}

    4. 业务逻辑

    @Servicepublic class PaymentService {    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback")    public String paymentCircuitBreaker(@PathVariable("id") Integer id) {        if (id < 0) {            throw new RuntimeException("id 不能为负数");        }        String serialNumber = IdUtil.simpleUUID();        return Thread.currentThread().getName() + "\t" + "调用成功,流水号:" + serialNumber;    }    public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) {        return "id 不能为负数,请稍后再试, o(╥﹏╥)o id: " + id;    }}

    高并发测试

    在高并发场景下,单一依赖可能导致系统资源被迅速占满。通过Hystrix的熔断和降级功能,可以避免级联故障。

    测试压力

    使用JMeter进行压力测试,发送20000个并发请求:

    http://localhost:8001/payment/hystrix/timeout/31

    当服务端8001出现故障时,消费者80会自动触发服务降级,返回友好的提示,而不是长时间等待或报错。

    故障与解决方案

    故障现象

    在高并发下,单一依赖可能导致:

  • 服务端线程池被挤占
  • 客户端长时间等待
  • 级联故障
  • 解决方案

  • 超时处理:避免因超时导致服务器变慢
  • 错误处理:确保程序运行异常时有兜底
  • 服务降级:在依赖故障时自动切换到降级逻辑
  • 服务降级配置

    在服务提供者配置中,设置Hystrix命令属性:

    @HystrixCommand(    fallbackMethod = "paymentCircuitBreaker_fallback",    commandProperties = {        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")    })public String paymentCircuitBreaker(@PathVariable("id") Integer id) {    int timeNumber = 5;    try {        TimeUnit.SECONDS.sleep(timeNumber);    } catch (InterruptedException e) {        e.printStackTrace();    }    return "线程池:" + Thread.currentThread().getName() + " paymentCircuitBreaker,id:" + id + " 耗时(秒):" + timeNumber;}public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) {    return "我是消费者80,对方支付系统繁忙请10秒种后再试或者自己运行出错请检查自己,o(╥﹏╥)o";}

    服务监控

    通过Hystrix Dashboard,监控服务的依赖状态和性能指标。配置如下:

    server:  port: 9001feign:  hystrix:    enabled: true

    总结

    Hystrix通过服务降级、熔断和监控等功能,有效防止分布式系统中的依赖故障对整体系统造成连锁崩溃。在高并发场景下,Hystrix能够帮助系统快速恢复弹性,避免雪崩效应。

    转载地址:http://lntkz.baihongyu.com/

    你可能感兴趣的文章