基于Hector的测试
1、基于limit-conn的连接限流

#限流方法: 10 线程、100 并发连接、持续 10 秒
wrk -t10 -c50 -d10s --latency http://192.168.0.203:10004/zn
Running 10s test @ http://192.168.0.203:10004/zn
10 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 25.53ms 28.14ms 266.53ms 90.03%
Req/Sec 257.94 77.79 444.00 64.99%
Latency Distribution
50% 15.61ms
75% 23.08ms
90% 53.54ms
99% 129.19ms
25681 requests in 10.03s, 6.10MB read
Non-2xx or 3xx responses: 24850
Requests/sec: 2559.95
Transfer/sec: 623.05KB
##结果解读
| 指标 | 数值 | 含义 |
| -------------- | ---------- | --------------------- |
| 总请求 | 24,268 | 10 秒内发出的请求 |
| Non-2xx or 3xx | **23,367** | 被拒绝的请求(就是你配的 **503**) |
| 成功率 | ~3.7% | 只有约 901 个请求正常通过 |
##结论
符合预期
2、基于limit-conn的限流计数

##规则解读:
同一个 IP 地址,每 60 秒内最多只能访问 /zn 100 次。第 101 次开始,网关直接返回 503,Body 为「歇会吧,再来」。60 秒后计数器重置,又能访问 100 次。
##限流方法:
for i in {1..105}; do code=$(curl -s -o /dev/null -w "%{http_code}" http://192.168.0.203:10004/zn); if [ $i -eq 1 ] || [ $i -eq 100 ] || [ $i -eq 101 ] || [ $i -eq 105 ]; then echo "Request $i: HTTP $code"; fi; done
Request 1: HTTP 200
Request 100: HTTP 200
Request 101: HTTP 503
Request 105: HTTP 503
##结果解读:
前 100 个全部 200,从第 101 个开始全部 503
##结论:
符合预期
3、基于limit-conn的请求限流

##规则解读:
同一个 IP,请求像水流一样进入漏桶。桶以 50 次/秒 的固定速率出水。如果瞬间来了一大波请求,桶里最多能缓冲 5 个排队等待;第 6 个及以后的请求,桶装不下,直接溢出返回 503
##限流方法:
cat 1.sh
#!/bin/bash
URL="http://192.168.0.203:10004/zn"
TOTAL=60
TMP=$(mktemp)
trap "rm -f $TMP" EXIT
echo "[*] 正在并发发送 $TOTAL 个请求..."
for i in $(seq 1 $TOTAL); do
(
ms=$(date +%s%N)
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "$URL")
ms=$(( ($(date +%s%N) - ms) / 1000000 ))
echo "$code $ms" >> "$TMP"
) &
done
wait
echo ""
echo "=================================================="
echo "Total : $TOTAL"
awk '$1==200{ok++} $1==503{rej++} {sum+=$2; count++}
END{print "200 : "ok; print "503 : "rej;
if(count) print "Avg ms: "int(sum/count+0.5)}' "$TMP"
echo "=================================================="
echo ""
echo "[200 响应延迟 Top 10](看是否有阶梯状延迟)"
grep "^200 " "$TMP" | awk '{print $2}' | sort -n | head -10 | nl
##结果解读:
[*] 正在并发发送 60 个请求...
==================================================
Total : 60
200 : 9
503 : 51
Avg ms: 68
==================================================
[200 响应延迟 Top 10](看是否有阶梯状延迟)
1 63
2 70
3 86
4 100
5 114
6 128
7 147
8 160
9 189
200 : 9 ← 漏桶放行(1个直接处理 + 8个排队)
503 : 51 ← 桶满溢出,直接拒绝
Avg ms: 68 ← 包含排队延迟的平均值
为什么是 9 个成功,而不是 6 个?
理论上 rate=50/s + burst=5 应该是 1 个直接处理 + 5 个排队 = 6 个成功。
实际是 9 个,原因是:
脚本创建 60 个后台 curl 进程不是绝对同时完成的,这个过程本身花了几十毫秒。
在这几十毫秒内,漏桶一直在以 50/s 的速率"漏水"(处理请求),所以桶里又空出了 3 个位置,导致第 7-9 个请求也能挤进排队队列。
4、

浙公网安备 33010602011771号