温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

服务器gateway如何限流

发布时间:2026-10-20 05:40:48 来源:亿速云 阅读:93 作者:小樊 栏目:系统运维

“服务器 gateway 如何限流”通常可以从网关层(API Gateway)限流和后端服务限流两个层面来看。下面按常见方案 + 实现方式 + 示例系统说明。


一、限流核心维度

一般从以下几个维度限流:

  1. QPS / TPS(每秒请求数)
  2. 并发数(同时处理的请求数)
  3. 连接数(TCP / WebSocket)
  4. 用户 / IP / 租户
  5. 接口级别(不同 API 不同阈值)

二、常见限流算法

1. 计数器(固定窗口)

  • 每秒最多 N 个请求
  • 实现简单,但有“临界突刺”问题

2. 滑动窗口

  • 更平滑,避免瞬间翻倍

3. 漏桶算法(Leaky Bucket)

  • 请求进桶,匀速流出
  • 适合保护后端

4. 令牌桶(Token Bucket)✅ 最常用

  • 按速率发令牌
  • 支持一定突发流量
  • Nginx / Gateway 多用此算法

三、Gateway 层限流方案

1️⃣ Nginx 限流(最基础)

基于 IP 限流

http {
    limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

    server {
        location /api/ {
            limit_req zone=ip_limit burst=20 nodelay;
        }
    }
}
  • rate=10r/s:每秒 10 个
  • burst=20:允许突发
  • nodelay:不排队直接拒绝

2️⃣ Spring Cloud Gateway 限流

使用 Redis + 令牌桶

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
                key-resolver: "#{@userKeyResolver}"
@Bean
KeyResolver userKeyResolver() {
    return exchange -> Mono.just(
        exchange.getRequest().getHeaders().getFirst("X-User-Id")
    );
}

✅ 支持:

  • 用户级
  • IP 级
  • 接口级限流

3️⃣ Kong Gateway 限流

plugins:
  - name: rate-limiting
    config:
      second: 10
      minute: 500
      policy: redis

支持:

  • 按 consumer
  • 按 service
  • 按 route

4️⃣ APISIX 限流

{
  "plugins": {
    "limit-req": {
      "rate": 10,
      "burst": 20,
      "key": "remote_addr"
    }
  }
}

四、后端服务限流(双保险)

1. Sentinel(Java 常用)

@SentinelResource(value = "getUser", blockHandler = "block")
public User getUser() {
    return userService.get();
}

支持:

  • QPS
  • 线程数
  • 熔断降级
  • 热点参数限流

2. Guava RateLimiter(单机)

RateLimiter limiter = RateLimiter.create(10);
if (limiter.tryAcquire()) {
    // 处理请求
}

⚠️ 不适合分布式


五、分布式限流关键点

✅ 必须使用共享存储:

  • Redis
  • Zookeeper
  • Etcd

❌ 单机限流 ≠ 集群限流


六、推荐架构(生产级)

Client
  ↓
CDN / LB
  ↓
API Gateway(限流 + 鉴权)
  ↓
Service Mesh / 微服务
  ↓
Sentinel(兜底限流)

七、限流后的处理

  • 返回 429 Too Many Requests
  • 返回 Retry-After
  • 降级到默认数据
  • 异步排队(非实时接口)

八、选择建议

场景 推荐
简单 IP 限流 Nginx
微服务网关 Spring Cloud Gateway
高性能网关 APISIX / Kong
Java 服务保护 Sentinel
突发流量 令牌桶

如果你能告诉我:

  • 用的是 什么 Gateway(Nginx / Spring / Kong / APISIX)
  • 是否 分布式
  • 限流维度(IP / 用户 / 接口)

我可以直接给你可落地的配置示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手