如何使用K6测试DotNet WebAPI的限流规则是否生效
.NET WebAPI TokenBucketRateLimiter 限流验证方案
我为.NET WebAPI集成了TokenBucketRateLimiter限流组件,配置如下:
new TokenBucketRateLimiterOptions { TokenLimit = 5, ReplenishmentPeriod = TimeSpan.FromSeconds(10), TokensPerPeriod = 2, QueueLimit = 0 });
需要验证:当5个初始令牌耗尽后,后续请求会返回HTTP 429状态码,直到10秒的令牌补充周期结束。目前我能编写基础k6脚本验证200状态,但不知道如何测试预期的429限流状态,现有脚本如下:
import { check } from 'k6' import http from 'k6/http' export let options = { insecureSkipTLSVerify: true, scenarios: { constant_request_rate: { executor: 'constant-arrival-rate', rate: 1, timeUnit: '2s', duration: '10s', preAllocatedVUs: 1, maxVUs: 1, }, }, }; export default () => { let result = http.get(url, { headers: { 'Authorization': 'Bearer ...' } }); check(result, { 'is status 200': (r) => r.status === 200 }); };
修改后的k6测试脚本
要精准验证限流规则,需要调整测试场景的请求频率,确保快速耗尽令牌后持续发送请求验证429状态。以下是优化后的脚本:
import { check, sleep } from 'k6' import http from 'k6/http' // 替换为你的API实际地址 const url = 'https://your-api-target-endpoint'; export let options = { insecureSkipTLSVerify: true, scenarios: { // 阶段1:1秒内发5个请求,耗尽初始令牌 consume_initial_tokens: { executor: 'constant-arrival-rate', rate: 5, timeUnit: '1s', duration: '1s', preAllocatedVUs: 5, maxVUs: 5, }, // 阶段2:令牌补充前的9秒内,每秒发1个请求验证限流 verify_rate_limit: { executor: 'constant-arrival-rate', rate: 1, timeUnit: '1s', duration: '9s', preAllocatedVUs: 1, maxVUs: 1, startTime: '1s', // 阶段1结束后立即启动 }, }, }; export default () => { const result = http.get(url, { headers: { 'Authorization': 'Bearer your-valid-token' // 替换为有效授权令牌 } }); // 根据迭代次数区分阶段:前5次是令牌消耗阶段,后续是限流验证阶段 const isConsumePhase = __ITER < 5; if (isConsumePhase) { check(result, { '[消耗阶段] 返回200 OK': (r) => r.status === 200 }); } else { check(result, { '[限流阶段] 返回429 Too Many Requests': (r) => r.status === 429 }); // 可选:验证Retry-After响应头(如果API返回的话) check(result, { '[限流阶段] Retry-After头存在且合理': (r) => r.headers['Retry-After'] !== undefined && parseInt(r.headers['Retry-After']) <= 10 }); } sleep(0.1); };
脚本核心逻辑说明
双阶段场景设计
- 第一阶段
consume_initial_tokens:用5个VUs在1秒内发送5个请求,确保瞬间耗尽初始的5个令牌。 - 第二阶段
verify_rate_limit:在第一阶段结束后,连续9秒每秒发送1个请求,覆盖10秒补充周期内的未补充时段,验证限流触发。
- 第一阶段
状态码精准校验
- 通过k6内置变量
__ITER(当前迭代次数)判断请求所处阶段,前5次请求预期返回200,后续请求强制校验429状态码。
- 通过k6内置变量
可选扩展验证
- 可以添加第三阶段,在10秒补充周期结束后发送请求,验证令牌补充后是否恢复返回200,确认令牌 replenishment 机制正常。
内容的提问来源于stack exchange,提问作者Noone
相关产品推荐
相关产品推荐

