什么是 Resilience4j,为什么需要它?
\n\nResilience4j 是一个轻量级的 Java 库,旨在提高微服务和分布式系统的容错能力(resilience)。它提供了一组现成的组件,帮助保护您的应用程序免受级联故障、过载以及来自外部服务(数据库、API、消息队列等)的慢速响应。
\n\n该库的主要任务是实现容错模式,例如 Circuit Breaker(自动断开有问题的服务)、Rate Limiter(限制请求频率)、Retry(重试)、Bulkhead(资源隔离)、Time Limiter(执行时间限制)和 Cache(结果缓存)。
\n\n该库完美融入 Spring Boot 生态系统,但也可用于任何其他 Java 应用程序。Resilience4j 被认为是 Netflix 过时库 Hystrix 的现代替代品。
\n\n安装(Maven/Gradle)
\n\nResilience4j 是一个 Java 库,因此通过 Maven 或 Gradle 构建系统安装。与 Python 不同,这里不使用 pip install 命令。
Maven (pom.xml)
\n<dependency>\n <groupId>io.github.resilience4j</groupId>\n <artifactId>resilience4j-all</artifactId>\n <version>2.2.0</version>\n</dependency>\n\n<!-- 对于 Spring Boot 额外添加 -->\n<dependency>\n <groupId>io.github.resilience4j</groupId>\n <artifactId>resilience4j-spring-boot3</artifactId>\n <version>2.2.0</version>\n</dependency>\n\nGradle (build.gradle)
\nimplementation 'io.github.resilience4j:resilience4j-all:2.2.0'\nimplementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'\n\n快速入门及代码示例
\n\n让我们创建一个简单的 Circuit Breaker 使用示例。假设我们有一个调用外部 API 的方法。我们希望如果 API 连续 5 次响应错误,那么后续调用立即返回 fallback 值,而不会给有问题的服务增加负载。
\n\nimport io.github.resilience4j.circuitbreaker.CircuitBreaker;\nimport io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;\nimport io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;\nimport java.time.Duration;\nimport java.util.function.Supplier;\n\npublic class QuickStartExample {\n\n public static void main(String[] args) {\n // 1. 创建 Circuit Breaker 配置\n CircuitBreakerConfig config = CircuitBreakerConfig.custom()\n .failureRateThreshold(50) // 错误阈值百分比\n .waitDurationInOpenState(Duration.ofMillis(1000)) // 处于开启状态的时间\n .slidingWindowSize(5) // 用于计算错误的滑动窗口大小\n .build();\n\n // 2. 创建注册表和 Circuit Breaker\n CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);\n CircuitBreaker circuitBreaker = registry.circuitBreaker("myService");\n\n // 3. 包装危险调用\n Supplier<String> decoratedSupplier = CircuitBreaker\n .decorateSupplier(circuitBreaker, QuickStartExample::riskyOperation);\n\n // 4. 执行多次\n for (int i = 0; i < 10; i++) {\n try {\n String result = decoratedSupplier.get();\n System.out.println("成功: " + result);\n } catch (Exception e) {\n System.out.println("错误: " + e.getMessage());\n }\n }\n }\n\n // 模拟不可靠的外部服务\n public static String riskyOperation() {\n if (Math.random() > 0.3) {\n throw new RuntimeE