返回

Sentinel 服务限流融合网关路由实战</>

后端

Sentinel 集成:为微服务保驾护航

在微服务架构中,服务之间的相互调用十分频繁,这可能导致服务过载或故障,从而影响系统的稳定性。为了应对这些挑战,我们引入了 Sentinel——一个开源的分布式服务监控和流量控制组件。本文将详细介绍如何将 Sentinel 集成到 Spring Cloud Gateway 中,实现服务限流、熔断和降级的功能。

Sentinel 简介

Sentinel 是阿里巴巴开源的一款分布式服务监控和流量控制组件,它提供了丰富的功能,包括:

  • 服务限流:限制服务每秒处理的请求数量,避免服务过载。
  • 服务熔断:当服务出现故障时,自动熔断对该服务的调用,防止故障蔓延。
  • 服务降级:当服务降级时,自动将流量切换到备用方案,确保系统的可用性。

Sentinel 集成步骤

环境准备

  • Java 1.8 或更高版本
  • Spring Boot 2.3 或更高版本
  • Spring Cloud Gateway 3.0 或更高版本
  • Sentinel 1.9 或更高版本
  • Nacos 2.0 或更高版本

Maven 依赖

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

Sentinel 配置

application.yml 文件中添加以下配置:

spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080
      filter:
        enabled: true
  • transport.port: Sentinel 监控客户端与 Sentinel 控制台通信的端口。
  • transport.dashboard: Sentinel 控制台的地址。
  • filter.enabled: 启用 Sentinel 过滤器。

启动 Sentinel 仪表盘

cd sentinel-dashboard/bin
sh sentinel-dashboard.sh -p 8080

Spring Cloud Gateway 集成

Maven 依赖

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

Spring Cloud Gateway 配置

application.yml 文件中添加以下配置:

spring:
  cloud:
    gateway:
      routes:
        - id: sentinel_route
          uri: http://localhost:8080
          predicates:
            - SentinelRoutePredicateFactory.SentinelHeader = true
  • id: 路由的标识。
  • uri: 路由的目标地址。
  • predicates: 断言列表。

自定义断言工厂

@Component
public class SentinelRoutePredicateFactory extends AbstractRoutePredicateFactory<SentinelRoutePredicateFactory.Config> {

    public SentinelRoutePredicateFactory() {
        super(Config.class);
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return exchange -> {
            ServerHttpRequest request = exchange.getRequest();
            String headerValue = request.getHeaders().getFirst("Sentinel");
            return headerValue != null && headerValue.equals("true");
        };
    }

    public static class Config {
        private boolean sentinelHeader;

        public boolean isSentinelHeader() {
            return sentinelHeader;
        }

        public void setSentinelHeader(boolean sentinelHeader) {
            this.sentinelHeader = sentinelHeader;
        }
    }
}

这个断言工厂检查请求中是否存在 Sentinel 头,如果存在且值为 true,则允许该请求通过。

测试

启动项目后,访问 http://localhost:8080/sentinel_route,可以在 Sentinel 仪表盘中查看服务调用信息。

在 Sentinel 仪表盘中配置服务限流、熔断或降级规则,然后重新访问 http://localhost:8080/sentinel_route,Sentinel 将根据配置的规则限制或处理服务调用。

结语

通过将 Sentinel 集成到 Spring Cloud Gateway 中,我们可以有效地保护我们的微服务免受过载、故障和降级的影响,从而确保系统的稳定性和可用性。

常见问题解答

  1. Sentinel 和 Hystrix 有什么区别?
    Sentinel 和 Hystrix 都是服务流量控制组件,但 Sentinel 侧重于分布式场景,而 Hystrix 更适用于单机场景。

  2. 如何配置 Sentinel 的限流规则?
    在 Sentinel 仪表盘中,选择 "规则管理" -> "流控规则",即可配置限流规则。

  3. 如何配置 Sentinel 的熔断规则?
    在 Sentinel 仪表盘中,选择 "规则管理" -> "熔断规则",即可配置熔断规则。

  4. 如何配置 Sentinel 的降级规则?
    在 Sentinel 仪表盘中,选择 "规则管理" -> "降级规则",即可配置降级规则。

  5. 如何监控 Sentinel 的运行状态?
    Sentinel 仪表盘提供了丰富的监控指标,包括服务调用量、限流次数、熔断次数等。