你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:设置请求速率限制

注意

从 2025 年 3 月中旬开始,基本、标准和企业计划将弃用,停用期为三年。 建议过渡到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

从 2024 年 9 月 30 日开始,标准消耗和专用计划将弃用,六个月后将完全关闭。 建议过渡到 Azure 容器应用。 有关详细信息,请参阅将 Azure Spring Apps 标准消耗和专用计划迁移到 Azure 容器应用

本文适用于:❌ 基本版/标准版 ✔️ 企业版

此快速入门介绍如何在 Azure Spring Apps Enterprise 计划上使用 Spring Cloud Gateway 设置请求速率限制。

通过速率限制,可以避免出现流量峰值时出现的问题。 设置请求速率限制时,应用程序可能会拒绝过多的请求。 此配置可帮助你最大程度地减少限制错误并更准确地预测吞吐量。

先决条件

设置请求速率限制

Spring Cloud Gateway 包括来自开源版本的路由筛选器和多个更多路由筛选器。 其中一个筛选器是 RateLimit:限制用户请求筛选器。 RateLimit 筛选器限制时间范围内每个路由允许的请求数。

定义路由时,可以通过将 RateLimit 筛选器包含在路由的筛选器列表中来添加它。 筛选器接受四个选项:

  • 在窗口中接受的请求数。
  • 窗口的持续时间。 此值默认为毫秒,但可以指定其后缀为 smh,以表示该值以秒、分钟或小时为单位。
  • (可选)用户分区键。 还可以应用每个用户的速率限制。 也就是说,不同的用户可以根据请求中找到的标识符拥有自己的吞吐量。 指示密钥是否位于 JWT 声明或带有语法 claimheader 的 HTTP 标头中。
  • (可选)可以按 IP 地址对限制速率进行速率限制,但不能与每个用户的速率限制结合使用。

以下示例将所有用户限制为每五秒向 /products 路由发送两个请求:

{
    "predicates": [
      "Path=/products",
      "Method=GET"
    ],
    "filters": [
      "StripPrefix=0",
      "RateLimit=2,5s"
    ]
}

如果要公开不同用户组的路由,则每个路由都由其自己的 client_id HTTP 标头标识,请使用以下路由定义:

{
    "predicates": [
      "Path=/products",
      "Method=GET"
    ],
    "filters": [
      "StripPrefix=0",
      "RateLimit=2,5s,{header:client_id}"
    ]
}

超过限制后,响应将失败并出现 429 Too Many Requests 状态。

使用以下命令将 RateLimit 筛选器应用于 /products 路由:

az spring gateway route-config update \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-service-instance-name> \
    --name catalog-routes \
    --app-name catalog-service \
    --routes-file azure-spring-apps-enterprise/resources/json/routes/catalog-service_rate-limit.json

使用以下命令检索 Spring Cloud Gateway 中 /products 路由的 URL:

export GATEWAY_URL=$(az spring gateway show \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-service-instance-name> | jq -r '.properties.url')

echo "https://${GATEWAY_URL}/products"

在五秒内向 /products 的 URL 发出多个请求,以查看失败并出现状态 429 Too Many Requests 的请求。

清理资源

如果打算继续使用后续的快速入门和教程,则可能需要保留这些资源。 如果不再需要资源组,可以将其删除,这将删除资源组中的资源。 若要使用 Azure CLI 删除资源组,请使用以下命令:

echo "Enter the Resource Group name:" &&
read resourceGroupName &&
az group delete --name $resourceGroupName &&
echo "Press [ENTER] to continue ..."

后续步骤

继续学习以下任一可选快速入门: