返回

SentinelResource:给服务降级和熔断提供优雅的 Plan B

后端

Sentinel 是一款开源的流量控制组件,可以帮助我们对应用系统的流量进行控制,从而保护系统不受过载的影响。Sentinel 提供了多种流量控制策略,包括限流、降级和熔断,可以帮助我们有效地管理应用系统的流量。

在 Sentinel 中,我们可以通过 @SentinelResource 注解来对方法进行限流、降级和熔断控制。@SentinelResource 注解有三个重要的属性:

  • name:资源的名称,用于标识限流、降级和熔断规则。
  • blockHandler:当限流或降级发生时,执行的处理方法。
  • fallback:当熔断发生时,执行的处理方法。

Sentinel 会根据 @SentinelResource 注解的配置,在方法执行前进行限流、降级和熔断判断。如果判断结果为限流或降级,则会执行 blockHandler 方法;如果判断结果为熔断,则会执行 fallback 方法。

1. SentinelResource 限流

我们可以使用 @SentinelResource 注解来对方法进行限流控制。限流是指当流量超过一定阈值时,对请求进行拒绝。Sentinel 提供了多种限流策略,包括:

  • QPS 限流 :根据每秒请求数对请求进行限流。
  • 并发数限流 :根据并发请求数对请求进行限流。
  • 线程数限流 :根据线程数对请求进行限流。

我们可以通过 @SentinelResource 注解的 limitApplimitQps 属性来配置限流策略。例如,以下代码对方法 getUser 进行 QPS 限流,每秒最多允许 100 个请求:

@SentinelResource(name = "getUser", blockHandler = "getUserBlockHandler")
public User getUser(Long id) {
    // 获取用户数据
    User user = userService.getUser(id);
    return user;
}

public User getUserBlockHandler(Long id, BlockException e) {
    // 限流处理逻辑
    return new User();
}

2. SentinelResource 降级

我们可以使用 @SentinelResource 注解来对方法进行降级控制。降级是指当系统出现故障或负载过高时,对请求进行降级处理,以保证系统的稳定性。Sentinel 提供了多种降级策略,包括:

  • 快速失败 :当系统出现故障或负载过高时,直接返回失败结果。
  • 返回默认值 :当系统出现故障或负载过高时,返回默认值。
  • 执行降级方法 :当系统出现故障或负载过高时,执行降级方法。

我们可以通过 @SentinelResource 注解的 fallback 属性来配置降级策略。例如,以下代码对方法 getUser 进行降级处理,当系统出现故障或负载过高时,返回默认用户:

@SentinelResource(name = "getUser", fallback = "getUserFallback")
public User getUser(Long id) {
    // 获取用户数据
    User user = userService.getUser(id);
    return user;
}

public User getUserFallback(Long id) {
    // 降级处理逻辑
    return new User();
}

3. SentinelResource 熔断

我们可以使用 @SentinelResource 注解来对方法进行熔断控制。熔断是指当系统出现故障或负载过高时,对请求进行熔断,以防止系统被进一步破坏。Sentinel 提供了多种熔断策略,包括:

  • 快速失败 :当系统出现故障或负载过高时,直接返回失败结果。
  • 返回默认值 :当系统出现故障或负载过高时,返回默认值。
  • 执行熔断方法 :当系统出现故障或负载过高时,执行熔断方法。

我们可以通过 @SentinelResource 注解的 fallback 属性来配置熔断策略。例如,以下代码对方法 getUser 进行熔断处理,当系统出现故障或负载过高时,返回默认用户:

@SentinelResource(name = "getUser", fallback = "getUserFallback")
public User getUser(Long id) {
    // 获取用户数据
    User user = userService.getUser(id);
    return user;
}

public User getUserFallback(Long id) {
    // 熔断处理逻辑
    return new User();
}

4. 总结

@SentinelResource 注解及其 blockHandlerfallback 属性,可以帮助我们对方法进行限流、降级和熔断控制。通过合理地配置这些属性,我们可以有效地保护系统不受过载的影响,从而提高系统的稳定性和可用性。