返回

一招教你用 Sentinel + Ribbon + OpenFeign + Fallback 实现服务熔断

后端

Sentinel 服务熔断:保护系统免受过载

简介

Sentinel 是一款分布式系统监控和流量控制组件,可防止系统过载,确保服务稳定运行。它的服务熔断功能基于熔断器模式,在服务出现故障时将其隔离,防止故障扩散。当服务恢复正常后,熔断器自动恢复服务。

工作原理

Sentinel 熔断器分为三种状态:

  • 关闭状态: 服务正常运行,熔断器允许流量通过。
  • 打开状态: 服务出现故障,熔断器断开流量,防止进一步故障。
  • 半开状态: 熔断器允许少量流量通过,若服务处理正常,熔断器将关闭;若服务处理异常,熔断器将重新打开。

Sentinel 熔断器可通过配置参数进行定制,包括熔断阈值、熔断时间、半开时间等。

实现示例

可以使用 Sentinel、Ribbon、OpenFeign 和 Fallback 实现服务熔断。

依赖引入

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

配置 Sentinel

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080

配置 Ribbon

ribbon:
  eureka:
    enabled: false

配置 OpenFeign

feign:
  hystrix:
    enabled: false

实现 Fallback

@Component
public class UserFallback implements UserService {

    @Override
    public String getUser(String id) {
        return "服务熔断";
    }
}

集成 Sentinel

@Service
public class UserService {

    @Autowired
    private FeignClientFactoryBean feignClientFactoryBean;

    public String getUser(String id) {
        UserServiceClient userServiceClient = feignClientFactoryBean.create(UserServiceClient.class);
        return userServiceClient.getUser(id);
    }
}

测试

访问 /getUser?id=1,返回 "服务熔断",说明熔断器生效。

结语

Sentinel 的服务熔断功能可以有效保护系统免受过载,保障服务稳定运行。它易于配置和使用,只需简单几步即可实现。

常见问题解答

  1. Sentinel 熔断器如何判断服务故障?
    熔断器通过统计流量的错误率来判断服务故障。

  2. 如何配置熔断阈值?
    熔断阈值可以在 Sentinel 配置文件中或通过 API 动态配置。

  3. 服务熔断后多久会自动恢复?
    服务熔断后进入半开状态,允许少量流量通过。若服务处理正常,熔断器将在半开时间后关闭;若服务处理异常,熔断器将重新打开。

  4. 如何防止服务雪崩?
    Sentinel 可以设置流控规则,限制流量流入服务,防止服务雪崩。

  5. Sentinel 如何与其他微服务框架集成?
    Sentinel 可以通过 SPI 机制与多种微服务框架集成,如 Spring Cloud、Dubbo 等。