【Spring Cloud 微服务】1.Hystrix断路器

前言

Hystrix中文意思是豪猪,大家一想到豪猪,可能就想到浑身的刺,来保护自己。

Hystrix同样也是如此,具有熔断、降级、缓存、监控等多项功能,引用这个组件就是为了在当我们一个依赖包出现异常等时候,不影响其他任务的使用。

我们可能在项目或者实战中听说过Hystrix断路器相关使用,那么我们怎么用?在哪里用,如何用,如何和Fegin等结合起来,这是个问题。

使用背景

降级(fallBack)

当我们调用某个服务,比如调用影院系统的查询服务,如果出现以下场景:

  • 服务超时
  • 服务调用异常
  • 线程池拒绝
  • 断路器打开

1. 引入Hystrix相关依赖

首先,在项目的pom.xml文件中添加Hystrix的依赖:

复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
    <version>2023.0.0</version>
</dependency>

2. 启用Hystrix

在Spring Boot启动类上添加@EnableHystrix注解,以启用Hystrix的功能:

java 复制代码
@SpringBootApplication
@EnableHystrix
public class MovieSystemApplication {
    public static void main(String[] args) {
        SpringApplication.run(MovieSystemApplication.class, args);
    }
}

3. 配置Hystrix

application.yml中添加Hystrix的相关配置:

java 复制代码
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000  # 设置默认超时时间为5秒
        strategy:
          maxConcurrentRequests: 10      # 设置默认的最大并发请求数

4. 实现降级逻辑

在需要降级的业务逻辑中使用@HystrixCommand注解,并定义降级方法:

java 复制代码
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
@Service
public class MovieService {
    @HystrixCommand(fallbackMethod = "getDefaultMovie")
    public Movie findMovieById(String movieId) {
        // 调用实际的查询服务,可能会抛出异常或超时
        return movieRepository.findById(movieId).orElseThrow(() -> new RuntimeException("Movie not found"));
    }
    // 降级方法,当服务调用失败时调用
    private Movie getDefaultMovie(String movieId) {
        // 返回一个默认的电影对象
        return new Movie(
            "0000",
            "Default Movie",
            "Default Description",
            0.0
        );
    }
}

5. 测试降级功能

编写单元测试,模拟服务调用失败的情况,验证降级逻辑是否正确触发:

java 复制代码
@RunWith(SpringRunner.class)
@SpringBootTest
public class MovieServiceTest {
    @Autowired
    private MovieService movieService;
    @Test
    public void testFallbackWhenServiceFails() {
        Movie movie = movieService.findMovieById("nonexistentId");
        assertEquals("Default Movie", movie.getTitle());
    }
}

6. 验证降级行为

可以通过以下方式验证降级行为:

  • 手动抛出异常 :在findMovieById方法中手动抛出一个异常,观察是否调用getDefaultMovie方法。
  • 断路器打开:通过多次调用失败的服务,触发断路器打开,验证降级逻辑是否生效。
  • 超时测试 :在findMovieById方法中添加一个长时间运行的任务,触发超时,验证降级逻辑是否生效。
    通过以上步骤,我们可以实现一个完整的Hystrix降级机制,确保在服务调用失败时能够返回默认值,提高系统的容错能力和用户体验。
相关推荐
韩立学长7 小时前
基于Springboot的影视评论网站的设计与实现58py6238(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
毕设源码-朱学姐7 小时前
【开题答辩全过程】以 基于JAVA的市级非物质文化遗产交流平台为例,包含答辩的问题和答案
java·开发语言
小学鸡!8 小时前
Spring Boot通过手机号获取归属地
java·spring boot
pedestrian_h9 小时前
操作系统-线程
android·java·开发语言
whltaoin9 小时前
【JAVA全栈项目】弧图图-智能图床 SpringBoot+Vue3 :[框架开荒:一文全步骤打通前后端项目全流程]
java·spring boot·vue·开源项目·全栈·cos
Fu1co10 小时前
【Spring Boot】Spring Boot解决循环依赖
java·spring boot·spring
我命由我1234511 小时前
Derby - Derby 服务器(Derby 概述、Derby 服务器下载与启动、Derby 连接数据库与创建数据表、Derby 数据库操作)
java·运维·服务器·数据库·后端·java-ee·后端框架
技术砖家--Felix11 小时前
Spring Boot入门篇:快速搭建你的第一个Spring Boot应用
java·开发语言·音视频
i源11 小时前
Java语言处理Js文件内容格式化
java·javascript