不同场景下使用 Resilience4J、Sentinel、Spring Cloud Circuit Breaker 和 API Gateway 来实现熔断功能

1. Resilience4J 示例

Resilience4J 是一个轻量级的熔断库,支持 Spring Boot 项目中的熔断、重试、限流等功能。它通常通过配置文件和注解的方式来启用熔断功能。

示例:

// 使用 Resilience4J 提供的熔断器
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    // 配置熔断器名称
    @CircuitBreaker(name = "userService", fallbackMethod = "fallback")
    public String getUserInfo(String userId) {
        // 模拟可能失败的业务逻辑
        if (Math.random() < 0.5) {
            throw new RuntimeException("Service failure");
        }
        return "User info for: " + userId;
    }

    // 熔断后的回退方法
    public String fallback(String userId, Throwable t) {
        return "Fallback: User service is down. Please try again later.";
    }
}

配置:application.yml 中可以配置 Resilience4J 的熔断器策略。

resilience4j.circuitbreaker:
  instances:
    userService:
      registerHealthIndicator: true
      failureRateThreshold: 50
      slidingWindowSize: 10
      waitDurationInOpenState: 10000ms

解释:

  • @CircuitBreaker 注解标记方法,启用熔断机制。
  • fallbackMethod 指定在熔断后调用的回退方法。
  • 配置中的 failureRateThreshold 定义了失败率的阈值,slidingWindowSize 是熔断器的滑动窗口大小,waitDurationInOpenState 是当熔断器处于打开状态时等待的时间。

2. Sentinel 示例

Sentinel 是由阿里巴巴开发的,专门为分布式系统提供熔断、流量控制、降级等功能。它能够自动识别流量瓶颈,采取流量切断或限流措施。

示例:

首先,在 Spring Boot 项目中引入 Sentinel 的依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

然后,在服务中使用 Sentinel 提供的熔断功能:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    // 使用 Sentinel 提供的熔断器
    @SentinelResource(value = "getUserInfo", fallback = "fallbackMethod")
    public String getUserInfo(String userId) {
        // 模拟可能失败的业务逻辑
        if (Math.random() < 0.5) {
            throw new RuntimeException("Service failure");
        }
        return "User info for: " + userId;
    }

    // 熔断后的回退方法
    public String fallbackMethod(String userId) {
        return "Fallback: User service is down. Please try again later.";
    }
}

配置:application.yml 中配置 Sentinel 参数。

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 # Sentinel 控制台地址
      datasource:
        ds1:
          driver-class-name: com.alibaba.druid.pool.DruidDataSource
          url: jdbc:mysql://localhost:3306/sentinel
          username: root
          password: root

解释:

  • @SentinelResource 注解用于指定熔断器资源和回退方法。
  • 配置中指定了 Sentinel 控制台的地址和数据源。

3. Spring Cloud Circuit Breaker 示例

Spring Cloud Circuit Breaker 是一个统一的熔断抽象,允许开发者选择不同的熔断器实现(如 Resilience4J、Hystrix、Sentinel 等)。

示例:

首先,依赖配置(以 Resilience4J 为例):

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>

然后,在服务中使用熔断器:

import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final CircuitBreakerFactory circuitBreakerFactory;

    public UserService(CircuitBreakerFactory circuitBreakerFactory) {
        this.circuitBreakerFactory = circuitBreakerFactory;
    }

    public String getUserInfo(String userId) {
        CircuitBreaker circuitBreaker = circuitBreakerFactory.create("userService");
        return circuitBreaker.run(() -> {
            // 模拟失败的业务逻辑
            if (Math.random() < 0.5) {
                throw new RuntimeException("Service failure");
            }
            return "User info for: " + userId;
        }, throwable -> "Fallback: User service is down. Please try again later.");
    }
}

解释:

  • CircuitBreakerFactory.create("userService") 用于创建一个名为 userService 的熔断器。
  • circuitBreaker.run() 方法执行正常的业务逻辑,若出现异常,则触发回退逻辑。

4. API Gateway (例如 Spring Cloud Gateway) 示例

Spring Cloud Gateway 是 Spring Cloud 提供的 API 网关,支持对流量进行控制,包括限流、熔断等。

示例:

首先,依赖配置

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

然后,配置熔断器(利用 Spring Cloud Gateway 的 Resilience4J 集成):

spring:
  cloud:
    gateway:
      routes:
        - id: user_service_route
          uri: http://localhost:8081
          predicates:
            - Path=/user/**
          filters:
            - name: Resilience4J
              args:
                fallbackUri: "forward:/fallback"
    resilience4j:
      circuitbreaker:
        instances:
          userService:
            registerHealthIndicator: true
            failureRateThreshold: 50
            slidingWindowSize: 10
            waitDurationInOpenState: 10000ms

Controller 中定义回退方法:

@RestController
public class FallbackController {

    @RequestMapping("/fallback")
    public String fallback() {
        return "Fallback: User service is down. Please try again later.";
    }
}

解释:

  • application.yml 中配置了熔断器的阈值等参数。
  • 使用 Spring Cloud Gateway 路由和过滤器配置来实现熔断,若服务不可用,则转到 /fallback 方法。

总结

框架用途示例
Resilience4J提供熔断、重试、限流等容错功能使用 @CircuitBreaker 注解定义熔断器,并提供回退方法。
Sentinel提供流量控制、熔断、降级等功能,支持高并发的分布式系统使用 @SentinelResource 注解标记熔断资源,并提供回退方法。
Spring Cloud Circuit Breaker提供统一的熔断接口,支持不同实现(如 Resilience4J、Hystrix)使用 CircuitBreakerFactory 创建熔断器,并定义回退逻辑。
API Gateway用作微服务网关,支持熔断、限流等流量控制机制在 Spring Cloud Gateway 中配置 Resilience4J 过滤器,设置熔断策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CK_1024

请我喝一杯咖啡吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值