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

本文共 3173 字,大约阅读时间需要 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
    @EnableEurekaClient
    public class PaymentHystrixMain8001 {
    public static void main(String[] args) {
    SpringApplication.run(PaymentHystrixMain8001.class, args);
    }
    }

    4. 业务逻辑

    @Service
    public 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: 9001
    feign:
    hystrix:
    enabled: true

    总结

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

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

    你可能感兴趣的文章
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>
    OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
    查看>>
    OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
    查看>>
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>
    OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
    查看>>
    OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
    查看>>
    OA系统多少钱?OA办公系统中的价格选型
    查看>>
    Object c将一个double值转换为时间格式
    查看>>
    object detection错误之Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
    查看>>
    Object of type 'ndarray' is not JSON serializable
    查看>>
    Object Oriented Programming in JavaScript
    查看>>
    OBJECTIVE C (XCODE) 绘图功能简介(转载)
    查看>>
    Objective-C——判断对象等同性
    查看>>
    Objective-C之成魔之路【7-类、对象和方法】
    查看>>