Bootstrap

限流组件Nginx+Gateway+Sentinel结合使用

限流概述

限流 是控制系统负载、避免服务过载的一种机制。在微服务架构中,限流有助于确保系统在高并发下能够保持稳定性和高可用性,避免因为过多的请求导致系统崩溃。常见的限流技术包括基于 令牌桶算法漏桶算法QPS 限流 等。

在实际生产环境中,限流策略不仅限于后端服务,通常会在不同层级上进行限流,以实现流量的多层次控制。主要包括以下几种层级:

  • Nginx:前端反向代理层,适用于防止 DDoS 攻击和 IP 层面流量控制。
  • API 网关(如 Spring Cloud Gateway):适用于服务网关层的全局流量管理,提供基于接口和用户的限流。
  • 后端服务(如 Sentinel):适用于微服务的业务流量控制,能根据业务需求动态调整流量控制策略。

1. Nginx 限流

Nginx 是非常常见的反向代理和负载均衡工具,它可以通过配置文件进行高效的限流,尤其适用于防止 恶意流量高并发攻击IP 滥用 等场景。

主要配置项:
  • limit_req_zone:定义限流区域,通常基于 binary_remote_addr(IP 地址)。
  • limit_req:对特定路径或资源进行限流,控制请求频率。
  • limit_conn:限制每个客户端的最大并发连接数。
示例:Nginx 配置 IP 限流
http {
    # 定义每个 IP 地址每秒最多请求 1 次
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {
        location /api/ {
            # 每个 IP 地址最多突发 5 次请求
            limit_req zone=one burst=5;
            proxy_pass http://backend;
        }
    }
}
  • limit_req_zone:创建一个共享内存区域(zone=one:10m),每秒限制每个 IP 地址 1 次请求。
  • limit_req:为 /api/ 路径配置限流,允许每个 IP 最多突发 5 次请求。
适用场景:
  • 防止 DDoS 攻击
  • 控制全局请求频率
  • 基于 IP 地址的流量控制

2. Spring Cloud Gateway 限流

Spring Cloud Gateway 是一个现代化的 API 网关,能够为微服务架构提供统一的流量管理、路由功能和限流策略。它内建了流量控制功能,可以非常灵活地基于请求路径、请求频率、用户等进行限流。

主要配置项:
  • RequestRateLimiter:Spring Cloud Gateway 提供了 RequestRateLimiter 过滤器来实现基于令牌桶算法的限流。
  • RedisRateLimiter:基于 Redis 实现分布式限流,确保多实例架构下的流量控制。
示例:Spring Cloud Gateway 限流配置
spring:
  cloud:
    gateway:
      routes:
        - id: service_route
          uri: lb://SERVICE
          predicates:
            - Path=/api/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10   # 每秒允许 10 次请求
                redis-rate-limiter.burstCapacity: 20   # 最大突发请求数为 20
  • redis-rate-limiter.replenishRate:每秒钟允许 10 个请求。
  • redis-rate-limiter.burstCapacity:允许最大突发请求数为 20。
适用场景:
  • 在 API 网关层进行全局流量控制
  • 每个接口、每个用户等粒度的限流控制
  • 分布式环境下的限流管理

3. Sentinel 限流

Sentinel 是一个由阿里巴巴提供的流量控制工具,专门用于分布式系统中的流量管理。Sentinel 提供了非常强大的功能,支持 QPS 限流并发线程数限流熔断降级等策略,非常适合用于微服务的后端限流和服务保护。

主要配置项:
  • FlowRule:限流规则,可以配置限流策略(如基于 QPS 或线程数的限制)。
  • @SentinelResource:用于注解业务方法,定义流量控制策略,提供流控异常处理方法。
示例:Sentinel 基于注解的限流
  1. 添加依赖

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
  2. 使用 @SentinelResource 注解限流

    @SentinelResource(value = "yourApiMethod", blockHandler = "handleBlock")
    public String yourApiMethod() {
        return "Success";
    }
    
    public String handleBlock(BlockException ex) {
        return "Request Blocked due to rate limiting";
    }
    
  3. 配置流量控制规则

    @Bean
    public FlowRule flowRule() {
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("yourApiMethod");
        flowRule.setCount(10);   // 每秒 10 个请求
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);  // 按 QPS 限流
        flowRule.setLimitApp(RuleConstant.LIMIT_APP_DEFAULT);
        return flowRule;
    }
    
  • FlowRule:流控规则,setCount(10) 表示每秒最多允许 10 个请求,setGrade(RuleConstant.FLOW_GRADE_QPS) 表示按 QPS 限流。
适用场景:
  • 微服务架构中的后端流量控制
  • 灵活的限流策略,支持 QPS 限流、并发线程数控制等
  • 结合熔断、降级和流量控制,保护系统的高可用性

综合使用:Nginx + Spring Cloud Gateway + Sentinel

在微服务架构中,通常需要多个层级的流量控制来保障系统的稳定性和高可用性。不同层级的限流策略可以协同工作,以防止流量冲击后端服务。

使用场景:
  1. Nginx 限流:用于保护整个服务层,防止恶意请求、IP 滥用、全局请求频率控制等。
    • 适合应用于负载均衡前端,对流量进行粗粒度控制。
  2. Spring Cloud Gateway 限流:用于微服务架构中的 API 网关层,提供对每个接口、每个用户的流量控制,支持分布式限流。
    • 适合全局流量控制,提供接口级别、用户级别的限流。
  3. Sentinel 限流:用于微服务中的后端服务,精细控制每个服务的流量,可以动态调整流控策略,结合降级和熔断机制。
    • 适合后端服务的业务流量控制,确保微服务在高并发下不会崩溃。
流量控制的多层次防护:
  • Nginx:首先拦截流量,防止 DDoS 攻击和恶意请求,保护后端服务。
  • Spring Cloud Gateway:作为 API 网关,提供接口层级的流量控制,保护微服务的 API 层。
  • Sentinel:在后端服务中提供精细化的流量控制,并结合熔断、降级等策略保护业务系统。

总结

  • Nginx:适用于前端流量控制,防止 DDoS 攻击、IP 滥用等;通过配置文件进行高效的限流。
  • Spring Cloud Gateway:适用于 API 网关层的流量控制,支持每个接口、每个用户的限流,通过配置文件或代码灵活配置。
  • Sentinel:适用于后端微服务的流量控制,支持精细的限流策略(如 QPS 限流、并发控制),通过注解和代码动态配置流控规则。

通过结合这三者的限流机制,可以实现多层次、全方位的流量控制,确保系统的稳定性、可靠性和高可用性。

;