如何在Azure API Management中实现无订阅公网API的按客户端限流
解决Azure APIM中公开API的客户端级速率限制问题
我懂你的需求:要让部分API公开无需用户订阅,同时每个独立客户端(按IP区分)每分钟最多调用10次。你现在遇到的问题是,用无密钥订阅加全局速率限制后,所有客户端共享同一个配额,导致新设备也触发429。下面是具体的解决方法:
一、取消基于订阅的速率限制,改为允许匿名访问
首先你不需要依赖无密钥订阅来实现公开API,反而要配置API允许匿名访问:
- 进入Azure APIM实例,找到目标API,切换到设置标签页
- 在订阅要求部分,选择不需要,保存更改。这样用户无需订阅就能调用API。
二、添加基于客户端IP的速率限制策略
接下来要给API添加针对客户端IP的速率限制,确保每个独立IP有自己的配额。你需要修改API的入站策略,替换原来的订阅级rate-limit,改用rate-limit-by-key策略,以客户端IP作为区分键:
<inbound> <!-- 保留你已有的其他入站策略(如果存在) --> <rate-limit-by-key calls="10" renewal-period="60" counter-key="@(context.Request.IpAddress)" /> </inbound>
策略参数说明:
calls="10":设置每分钟允许的最大调用次数renewal-period="60":配额重置周期(单位为秒,这里60秒即1分钟)counter-key="@(context.Request.IpAddress)":用客户端IP作为计数的唯一标识,确保每个IP独立统计调用次数
三、验证效果
配置完成后测试:
- 用设备A在1分钟内调用10次,第11次会收到429状态码
- 同时用设备B(不同公网IP)调用,即使设备A已经触发限制,设备B依然能正常调用直到自己的10次配额用完
补充说明
如果你的场景中,多个客户端可能共享同一个公网IP(比如同一公司网络下的设备),IP区分会把他们当成同一个客户端。如果需要更精细的区分,可以考虑用自定义客户端标识头(比如X-Client-ID)作为counter-key,但这需要客户端配合传递这个头参数。
内容的提问来源于stack exchange,提问作者CoderX
相关产品推荐
相关产品推荐

