首页 > 其他分享 >Spring Cloud- Hystrix

Spring Cloud- Hystrix

时间:2024-09-29 13:22:16浏览次数:11  
标签:降级 服务 hystrix Hystrix Spring 熔断 熔断器 Cloud

Spring Cloud Hystrix 熔断与降级

在微服务架构中,每个服务都是独立运行的,如果某个服务出现故障或者响应时间过长,会影响整个系统的稳定性。为了防止这样的情况,Spring Cloud 提供了 Hystrix 作为熔断器,确保服务的可用性。通过 Hystrix,我们可以实现:

  1. 熔断:当某个服务长时间不可用时,自动短路该服务的请求。
  2. 降级:当熔断器触发时或者服务不可用时,返回预定义的降级处理结果。
  3. 限流:防止瞬间的大量请求压垮服务。

一、Hystrix 熔断和降级的基本原理

  1. 熔断:当一个服务调用的失败次数达到某个阈值时,Hystrix会启动熔断器,阻止请求发送到这个服务。此时所有请求都会直接失败,防止请求不断积压。当服务恢复正常时,Hystrix会关闭熔断器,重新允许请求通过。
  2. 降级:当服务不可用或者熔断器打开时,Hystrix提供了降级机制,允许开发者定义一个备用逻辑。当服务失败时,将执行降级逻辑,避免服务不可用导致系统崩溃。

二、Hystrix 的基本使用

1. 引入依赖

Spring Cloud 已经集成了 Hystrix,首先在项目的 pom.xml 中引入 Hystrix 相关的依赖:

<dependencies>
    <!-- Hystrix 依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
</dependencies>
2. 在应用中启用 Hystrix

在 Spring Boot 主类上添加 @EnableCircuitBreaker 注解以启用 Hystrix 的断路器功能:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;

@SpringBootApplication
@EnableCircuitBreaker
public class HystrixApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixApplication.class, args);
    }
}
3. 使用 @HystrixCommand 实现熔断与降级

我们可以通过 @HystrixCommand 注解来指定某个方法需要使用 Hystrix 进行熔断和降级处理。以下是一个服务调用的示例,其中包含了熔断和降级逻辑:

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class MyService {

    private final RestTemplate restTemplate;

    public MyService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    // 使用 @HystrixCommand 注解来实现熔断
    @HystrixCommand(fallbackMethod = "fallbackMethod")
    public String callExternalService() {
        // 调用外部服务
        return restTemplate.getForObject("http://some-external-service/api", String.class);
    }

    // 当熔断触发或调用失败时,执行此降级方法
    public String fallbackMethod() {
        return "External service is down. This is fallback response.";
    }
}

在这个例子中,callExternalService 方法会调用一个外部服务。如果该服务不可用或超时,Hystrix 将自动调用 fallbackMethod,返回预定义的降级响应。

4. 配置超时

Hystrix 默认的超时时间是 1 秒,如果外部服务超过这个时间没有响应,就会触发熔断。我们可以通过 application.propertiesapplication.yml 文件自定义这些配置。

# Hystrix 配置
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000

上述配置将超时时间设置为 2 秒。

三、熔断器的工作原理

Hystrix 熔断器的核心概念包括以下三种状态:

  1. Closed(关闭状态):当服务运行正常时,熔断器处于关闭状态。此时所有请求都会正常发送到目标服务。

  2. Open(打开状态):当服务出现连续多次失败(如超时、异常等),并达到设定的失败次数阈值时,熔断器会进入打开状态,此时所有对目标服务的请求都会直接失败,不再发送到目标服务。

  3. Half-Open(半开状态):熔断器在打开一段时间后,会进入半开状态。此时允许部分请求发送到目标服务,如果这些请求成功,熔断器会关闭;否则,继续保持打开状态。

四、Hystrix 配置参数

我们可以通过配置文件或者 Java 代码来自定义 Hystrix 的一些行为,常用配置参数如下:

# Hystrix 熔断器配置
# 滑动窗口中,最小请求数量
hystrix.command.default.circuitBreaker.requestVolumeThreshold=10

# 熔断器打开的错误百分比阈值,超过此值,熔断器打开
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50

# 熔断器打开后,等待多少秒后进入半开状态,尝试恢复
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000

# 执行超时时间,超过此时间的请求将会被中断
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000
  • circuitBreaker.requestVolumeThreshold:在熔断器决定是否开启之前,必须在滚动窗口内收到的最少请求数。
  • circuitBreaker.errorThresholdPercentage:失败的请求达到这个百分比后,熔断器会进入打开状态。
  • circuitBreaker.sleepWindowInMilliseconds:熔断器打开状态后,等待多长时间熔断器会进入半开状态,重新允许部分请求。
  • execution.isolation.thread.timeoutInMilliseconds:指定调用超时时间,单位为毫秒。

五、集成监控 Dashboard

Hystrix 提供了一个可视化的 Dashboard,用来监控熔断器的状态。我们可以通过引入 spring-cloud-starter-netflix-hystrix-dashboard 依赖来启用这个功能:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

然后在主类中添加 @EnableHystrixDashboard 注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;

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

启动项目后,访问 http://localhost:8080/hystrix,可以进入 Hystrix Dashboard 界面,监控熔断器的状态。

六、熔断器半开状态和恢复机制

Hystrix 的熔断器有一个自动恢复机制。当熔断器进入打开状态后,会在一定的等待时间后进入半开状态。在半开状态下,允许部分请求通过熔断器并发给目标服务。如果这些请求成功,熔断器将自动关闭并恢复正常工作;如果这些请求失败,熔断器将重新进入打开状态。

我们可以通过 circuitBreaker.sleepWindowInMilliseconds 参数来配置熔断器打开后到进入半开状态的时间间隔。

hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000

七、Hystrix 与 Spring Cloud Alibaba Sentinel 的替代关系

虽然 Hystrix 曾是 Spring Cloud 微服务架构中的核心熔断组件,但自从 Spring Cloud 2020.0 版本后,官方宣布 Hystrix 进入维护模式,不再积极开发新功能。推荐的替代方案是 Spring Cloud Alibaba 的 Sentinel,它不仅支持熔断与降级,还支持更加灵活的流量控制和热点限流。

八、总结

  1. 熔断和降级:通过 Hystrix 的 @HystrixCommand,我们可以轻松实现熔断和降级功能,防止某个服务出现问题时影响整个系统。

  2. 配置与监控:Hystrix 提供了多种配置选项来调优熔断器的行为,还可以通过 Dashboard 监控熔断器的状态。

  3. 自动恢复机制:Hystrix 提供的半开状态允许服务自动恢复,从而提高了系统的可用性。

Hystrix 虽然已经进入维护模式,但它仍然是一个优秀的熔断与降级组件,在很多项目中仍然广泛使用。如果你希望使用更加现代化的解决方案,可以考虑 Spring Cloud Alibaba 的 Sentinel。

标签:降级,服务,hystrix,Hystrix,Spring,熔断,熔断器,Cloud
From: https://blog.csdn.net/Flying_Fish_roe/article/details/142633118

相关文章

  • Hystrix详细解释
    Hystrix详细解释1.背景与概念在微服务架构中,系统通常由许多独立的服务组成,每个服务之间通过网络进行通信。由于网络的不确定性,以及服务之间存在的依赖关系,单个服务的故障或响应延迟可能会影响整个系统的稳定性,甚至导致级联故障(即一个服务的失败可能会引发多个其他服务的......
  • 海滨体育馆管理系统:SpringBoot实现技巧与案例
    2系统关键技术2.1JAVA技术Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力。Java的跨平台能力十分强大,只需一次编译,任何地方都可以运行。除此之外,它还拥有简单的语法和实用的类库,......
  • 2024最新高分源码基于SpringBoot+Vue+uniapp的办事大厅政务预约系统(源码+lw+部署文档
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 2024最新高分源码基于SpringBoot+Vue+uniapp的网络办公系统(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 2024最新高分源码基于SpringBoot+Vue+uniapp的贫困认定管理平台(源码+lw+部署文档+讲
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 海滨体育馆管理系统:SpringBoot技术的应用
    1引言1.1课题背景当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计......
  • SpringBoot实战:海滨体育馆管理系统开发指南
    1引言1.1课题背景当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计......
  • 基于java的大学生家教预约管理系统springboot【毕业设计】
      博主介绍:......
  • SpringBoot学科竞赛管理平台:开发与优化
    3系统分析3.1可行性分析在进行可行性分析时,我们通常根据软件工程里方法,通过四个方面来进行分析,分别是技术、经济、操作和法律可行性。因此,在基于对目标系统的基本调查和研究后,对提出的基本方案进行可行性分析。3.1.1技术可行性本学科竞赛管理系统的设计与实现采用Java......
  • 基于java的宠物商城服务平台springboot【毕业设计】
      博主介绍:......