Spring Cloud系列_17 服务熔断,服务降级
发布日期:2021-05-19 20:50:16 浏览次数:24 分类:精选文章

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

服务熔断与降级优化

服务熔断:保护服务免受过载攻击

服务熔断是当系统在高负载情况下为了防止核心服务崩溃而采取的一种保护机制。简单来说,就是在某些条件下自动暂停非核心服务的调用,以保证核心业务的正常运作。

服务熔断的原理

熔断机制类似于电路的跳闸功能。当某一层的电路出现故障时,只会切断该层的电能,而不会影响其他楼层的正常运行。服务熔断类似于如此:如果某一组请求过于集中或出现较多错误,熔断机制会自动切断这部分请求,而不会影响其他正常的业务流程。

在Hystrix中,熔断机制通过以下方式实现:

  • 阈值触发:在10秒内如果接收到10次请求且有1次错误,就会触发熔断
  • 错误率监控:如果错误率超过50%,熔断机制会介入
  • 重试机制:熔断后每隔5秒重试一次,直到成功或达到最大重试次数
  • 熔断机制的配置非常灵活,可以根据实际业务需求调整阈值和重试间隔。

    服务熔断的示例配置与测试

    在一个典型的微服务架构中,服务熔断通常用于保护其它服务不受 MyClass 1 的异常请求影响。以下是如何在 Spring Cloud Hystrix 中实现服务熔断的示例配置:

    @Override
    @HystrixCommand(
    commandProperties = {
    @HystrixProperty(name = HystrixProperties.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "10"),
    @HystrixProperty(name = HystrixProperties.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "50"),
    @HystrixProperty(name = HystrixProperties.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "5000")
    },
    fallbackMethod = "getProductFallback"
    )
    public Product selectProductById(Long id) {
    if (id.equals(1L)) {
    throw new RuntimeException("查询主键为1的商品信息导致异常");
    }
    return restTemplate.exchange(
    "http://service-provider-hystrix/ProductsById/" + id,
    HttpMethod.GET,
    null,
    new ParameterizedTypeReference
    () {}
    ).getBody();
    }
    private Product getProductFallback(Long id) {
    System.out.println("执行Fallback方法,id=" + id);
    return new Product(id, "Fallback数据01", 1, new BigDecimal("100"));
    }

    通过以上配置,当调用 selectProductById 方法时,如果传入 id=1 会抛出异常,触发熔断机制,直接调用 getProductFallback 方法,并返回预设的默认值。

    游戏效果与测试验证

    在实际应用中,可以通过以下方式测试熔断机制:

  • 当正常请求没有问题时,系统不会触发熔断
  • 当 id=1 的请求频繁调用或碰到错误时,熔断机制会启动
  • 在熔断状态下,每隔5秒会自动重试一次请求
  • 这种测试方法可以帮助开发人员了解熔断机制的行为模式,确保在高负载场景下系统的稳定性。

    服务降级:在压力下优化业务流程

    服务降级是另一个重要的保护机制。它用于在极端压力下,根据业务关键级别对某些服务进行限制,以确保核心业务的正常运行。

    服务降级的作用

    服务降级可以通过以下方式实现:

  • 限流控制:限制某些接口的调用次数
  • 熔断机制:切断非关键业务的调用
  • _manual降级按钮 的方式手动降级特定业务
  • 服务降级的实现示例

    以下是一个简单的服务降级实现示例:

    @Override
    @HystrixCommand(
    fallbackMethod = "getProductFallback"
    )
    public Product selectProductById(Long id) {
    if (id == null || id == 0) {
    return null;
    }
    // intelligently decide whether to do circuit break or not
    return restTemplate.exchange(
    "http://service-provider-hystrix/ProductsById/" + id,
    HttpMethod.GET,
    null,
    new ParameterizedTypeReference
    () {}
    ).getBody();
    }
    private Product getProductFallback(Long id) {
    System.out.println("执行Fallback方法,id=" + id);
    return new Product(id, "Fallback数据01", 1, new BigDecimal("100"));
    }

    注意到,在该示例中,如果请求参数传递了非法值(比如 null 或 0),系统会直接返回 null,这是简单的服务降级实现方式。

    总结

    服务熔断和降级是Hystrix 提供的核心功能,能够有效应对系统在高负载或故障情况下的抛 saya。通过合理配置,开发人员可以在保证核心业务正常运行的同时,最大限度地利用系统资源。在实际应用中,可以结合具体业务需求灵活配置Hystrix的各种保护机制。

    上一篇:Spring Cloud系列_18 feign实现服务熔断,降级
    下一篇:Java操纵Excel_02 EasyExcel方式

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月15日 10时36分21秒