*鍩轰簬 Go + Redis 鐨勯珮鎬ц兘鍒嗗竷寮忛檺娴侀厤棰濇湇鍔?
鏀寔澶氱闄愭祦绠楁硶鍜屽缁村害鎺у埗锛岄�傜敤浜庣綉鍏冲拰寰湇鍔℃灦鏋?
Pixiu-RLS (Rate Limiting Service) 鏄竴涓?*杞婚噺绾т絾鍔熻兘寮哄ぇ**鐨勫垎甯冨紡闄愭祦鏈嶅姟锛屼笓涓哄垎甯冨紡绯荤粺璁捐锛屾彁渚涚粺涓�鐨勬祦閲忔帶鍒惰兘鍔涖�?
- 馃殌 鏋佽嚧鎬ц兘锛氬熀浜?RCU 蹇収鏈哄埗锛岃鍒欐煡璇㈡�ц兘鎻愬崌 *60+ 鍊?
- 馃敡 鐏垫椿閰嶇疆锛氭敮鎸佷护鐗屾《绠楁硶銆佸缁村害闄愬埗銆侀厤棰濈鐞?- 馃敟 **鐑洿鏂?*锛氳鍒欏姩鎬佹洿鏂帮紝鏃犻渶閲嶅惎鏈嶅姟
- 馃洝锔?鑷垜淇濇姢锛氱啍鏂満鍒惰嚜鍔ㄤ繚鎶ょ郴缁?
- 馃搳 绮剧‘闄愭祦锛氬熀浜?Redis + Lua 瀹炵幇鍒嗗竷寮忕簿纭檺娴?
- 馃幆 鏄撲簬闆嗘垚锛歊ESTful API锛屾敮鎸佷换浣曠紪绋嬭瑷�鎺ュ叆
- 鉁?**浠ょ墝妗?*锛圱oken Bucket锛夛細鏀寔娴侀噺绐佸彂锛屽钩婊戦檺娴?
- 馃敼 **澶氱淮搴︾粍鍚?*锛欼P銆佺敤鎴?ID銆佸簲鐢?ID銆佽矾鐢便�佽澶?ID 绛変换鎰忕粍鍚?
- 馃敼 澶氱骇閰嶉锛氬垎閽熺骇銆佸皬鏃剁骇銆佸ぉ绾ч厤棰濋檺鍒?
- 馃敼 榛戠櫧鍚嶅崟锛氱伒娲婚厤缃眮鍏嶆垨姘镐箙闄愬埗鍚嶅崟
- 馃洝锔?鐔旀柇淇濇姢锛氳嚜鍔ㄧ啍鏂繃杞戒繚鎶わ紝閬垮厤闆穿
- 馃攧 **瑙勫垯鐑洿鏂?*锛氶�氳繃 API 鎴?Redis Pub/Sub 鍔ㄦ�佹洿鏂拌鍒?
- 馃搱 楂樻�ц兘缂撳瓨锛歊CU 鏃犻攣蹇収锛屾敮鎸佺櫨涓囩骇骞跺彂
- 馃寪 **鍒嗗竷寮忎竴鑷?*锛氬熀浜?Redis 淇濊瘉澶氬疄渚嬩竴鑷存�?
鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹?
鈹? HTTP API Layer 鈹?
鈹? (RESTful API / Health Check) 鈹?
鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹?
鈹?
鈻?
鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹?
鈹? Rate Limit Engine 鈹?
鈹? 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹? 鈹?
鈹? 鈹? 鈥?榛戠櫧鍚嶅崟妫�鏌? 鈥?缁村害鍝堝笇 鈥?閰嶉妫�鏌? 鈥?闄愭祦鎵ц 鈹? 鈹?鈹? 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹? 鈹?
鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹?
鈹? 鈹?
鈻? 鈻?
鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹? 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹?
鈹? RCU Snapshot Cache 鈹? 鈹? Limiter Implementation 鈹?
鈹? (Rules Management) 鈹? 鈹? 鈥? 鈹?
鈹? 鈥?鏃犻攣璇诲彇 (60x 鎬ц兘) 鈹? 鈹? 鈥?Token Bucket 鈹?
鈹? 鈥?鐑洿鏂版敮鎸? 鈹? 鈹? 鈥? 鈹?
鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹? 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹?
鈹?
鈻?
鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹?
鈹? Redis Cluster 鈹?
鈹? 鈥?瑙勫垯瀛樺偍 鈥?闄愭祦鐘舵�? 鈥?Pub/Sub 鏇存柊閫氱煡 鈹?
鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹?
| 妯″潡 | 鑱岃矗 | 鍏抽敭鎶�鏈? |
|---|---|---|
api |
HTTP 鎺ュ彛灞? | Gorilla Mux, RESTful API |
core |
闄愭祦寮曟搸 | 绛栫暐妯″紡, 渚濊禆娉ㄥ叆 |
rcu |
楂樻�ц兘缂撳瓨 | *RCU 鏃犻攣蹇収锛?0x 鎬ц兘鎻愬崌锛? |
limiter |
闄愭祦绠楁硶 | Lua 鑴氭湰, Redis 鍘熷瓙鎿嶄綔 |
repo |
鏁版嵁璁块棶灞? | Redis 瀹㈡埛绔皝瑁? |
rules |
瑙勫垯绠$悊 | 鐑洿鏂? Pub/Sub |
config |
閰嶇疆绠$悊 | YAML 閰嶇疆 |
util |
宸ュ叿鍑芥暟 | 鍝堝笇, 缁村害澶勭悊 |
- Go: 1.25
- Redis: 7.0+
- 鎿嶄綔绯荤粺: Linux / macOS / Windows
git clone https://github.com/your-org/pixiu-rls.git
cd pixiu-rls缂栬緫 configs/rls.yaml:
server:
httpAddr: ":8080"
redis:
mode: "standalone" # standalone | sentinel | cluster
addr: "localhost:6379"
db: 0
prefix: "pixiu:rls"
updatesChannel: "pixiu:rls:updates"
features:
audit: "none"
localFallback: false
bootstrapRules:
- ruleId: "api-default"
match: "/api/*"
algo: "token_bucket"
windowMs: 1000
limit: 100
burst: 20
dims: ["ip", "route"]
enabled: true
quota:
perMinute: 1000
perHour: 10000
perDay: 100000# 浣跨敤 Docker
docker run -d -p 6379:6379 --name redis redis:7-alpine
# 鎴栦娇鐢?docker-compose
docker-compose -f deployments/docker-compose.yaml up -d# 缂栬瘧
go build -o rls-http ./cmd/rls-http
# 杩愯
./rls-http -c configs/rls.yaml鏈嶅姟鍚姩鍚庤闂細http://localhost:8080
curl http://localhost:8080/healthcurl -X POST http://localhost:8080/api/check \
-H "Content-Type: application/json" \
-d '{
"ruleId": "api-default",
"dims": {
"ip": "192.168.1.1",
"route": "/api/login"
}
}'鍝嶅簲绀轰緥锛?
{
"allowed": true,
"remaining": 95,
"retryAfterMs": 0,
"reason": "allowed"
}# 鑾峰彇鎵�鏈夎鍒?
curl http://localhost:8080/api/rules
# 鍒涘缓/鏇存柊瑙勫垯
curl -X POST http://localhost:8080/api/rules \
-H "Content-Type: application/json" \
-d '{
"ruleId": "api-login",
"match": "/api/login",
"algo": "token_bucket",
"windowMs": 1000,
"limit": 10,
"burst": 5,
"dims": ["ip"],
"enabled": true
}'鍩轰簬 Intel i7-13650HX 鐨勫熀鍑嗘祴璇曪細
| 鎿嶄綔 | QPS | 寤惰繜 | vs RWMutex |
|---|---|---|---|
| 瑙勫垯鏌ヨ | ~31 浜?s | 0.03 ns | 62x 鈿? |
| 瑙勫垯鏇存柊 | ~5200 涓?s | 21.89 ns | 2x |
| 娣峰悎璇诲啓锛?0%璇伙級 | ~1.8 浜?s | 5.59 ns | 30x |
- 单实例 QPS: 10万+
- 寤惰繜: P99 < 5ms
- 骞跺彂杩炴帴: 鏀寔 10000+ 骞跺彂
- 鍐呭瓨: ~50MB锛?000鏉¤鍒欙級
- CPU: 鍗曟牳 < 10%锛?涓?QPS锛?
- Redis: Key 鏁伴噺鍙栧喅浜庣淮搴︾粍鍚堟暟
- [蹇�熷叆闂╙(docs/RCU_QUICKSTART.md) - RCU 蹇収蹇�熷叆闂?
- API 鏂囨。 - 瀹屾暣鐨?API 鎺ュ彛璇存槑
- 閮ㄧ讲鎸囧崡 - 鐢熶骇鐜閮ㄧ讲鏈�浣冲疄璺?
- [寮�鍙戞寚鍗梋(docs/DEVELOPMENT.md) - 寮�鍙戣�呮寚鍗楀拰璐$尞璇存槑
- 鏈湴闄嶇骇璇存槑 - Redis 鏁呴殰鏃舵湰鍦伴檺娴?閰嶉闄嶇骇璇存槑
- RCU 闆嗘垚璇存槑 - RCU 蹇収鏈哄埗璇﹁В
- 鏋舵瀯璁捐 - 绯荤粺鏋舵瀯鍜岃璁℃�濊矾
- RCU 鍘熺悊 - RCU 鏃犻攣蹇収鍘熺悊
- RCU 浣跨敤绀轰緥 - RCU 蹇収鐨勪娇鐢ㄧず渚?
go test ./...# RCU 蹇収娴嬭瘯
go test -v ./internal/rcu/
# 瑙勫垯缂撳瓨娴嬭瘯
go test -v ./internal/rules/
# 宸ュ叿鍑芥暟娴嬭瘯
go test -v ./internal/util/
# 鏍稿績寮曟搸娴嬭瘯
go test -v ./internal/core/# RCU 鎬ц兘娴嬭瘯
cd internal/rcu
go test -bench=. -benchmem -benchtime=1s
# 瑙勫垯缂撳瓨鎬ц兘娴嬭瘯
cd internal/rules
go test -bench=. -benchmemgo test -cover ./...server:
httpAddr: ":8080" # HTTP 鐩戝惉鍦板潃
redis:
mode: "standalone" # standalone | sentinel | cluster
addr: "localhost:6379" # Redis 鍦板潃
db: 0 # 鏁版嵁搴撶紪鍙?
prefix: "pixiu:rls" # Key 鍓嶇紑
updatesChannel: "pixiu:rls:updates" # Pub/Sub 棰戦亾
features:
audit: "none" # 瀹¤: none | redis_stream
localFallback: false # Redis 鏁呴殰鏃舵槸鍚︽湰鍦伴檷绾э紙鍗曟満鍐呭瓨锛岄潪涓�鑷达級
bootstrapRules: # 鍚姩鏃跺姞杞界殑瑙勫垯
- ruleId: "example"
match: "/api/*" # 璺敱鍖归厤
algo: "token_bucket" # 算法:token_bucket
windowMs: 1000 # 鏃堕棿绐楀彛锛堟绉掞級
limit: 100 # 閫熺巼闄愬埗
burst: 20 # 绐佸彂瀹归噺
dims: ["ip", "route"] # 闄愭祦缁村害
enabled: true # 鏄惁鍚敤
quota: # 閰嶉闄愬埗
perMinute: 1000
perHour: 10000
perDay: 100000
breaker: # 鐔旀柇閰嶇疆
enabled: true
rlDenyThreshold: 20
rlDenyWindowMs: 10000
minOpenMs: 8000Pixiu-RLS/
鈹溾攢鈹� cmd/ # 搴旂敤鍏ュ彛
鈹? 鈹斺攢鈹� rls-http/ # HTTP 鏈嶅姟
鈹溾攢鈹� configs/ # 閰嶇疆鏂囦欢
鈹溾攢鈹� deployments/ # 閮ㄧ讲閰嶇疆
鈹溾攢鈹� docs/ # 鏂囨。
鈹溾攢鈹� examples/ # 绀轰緥浠g爜
鈹溾攢鈹� internal/ # 鍐呴儴鍖?
鈹? 鈹溾攢鈹� api/ # API 灞?
鈹? 鈹溾攢鈹� config/ # 閰嶇疆绠$悊
鈹? 鈹溾攢鈹� core/ # 鏍稿績寮曟搸
鈹? 鈹? 鈹斺攢鈹� limiter/ # 闄愭祦绛栫暐
鈹? 鈹溾攢鈹� rcu/ # RCU 蹇収
鈹? 鈹溾攢鈹� repo/ # Redis 浠撳簱
鈹? 鈹溾攢鈹� rules/ # 瑙勫垯绠$悊
鈹? 鈹溾攢鈹� types/ # 绫诲瀷瀹氫箟
鈹? 鈹斺攢鈹� util/ # 宸ュ叿鍑芥暟
鈹斺攢鈹� README.md
# 瀹夎渚濊禆
go mod download
# 杩愯娴嬭瘯
go test ./...
# 鍚姩鏈嶅姟锛堝紑鍙戞ā寮忥級
go run ./cmd/rls-http -c configs/rls.yaml
# 浠g爜鏍煎紡鍖?
go fmt ./...
# 闈欐�佹鏌?
go vet ./...- 鍦?
internal/core/limiter/鍒涘缓鏂版枃浠? - 瀹炵幇
core.Strategy鎺ュ彛 - 鍦?
cmd/rls-http/main.go娉ㄥ唽绛栫暐 - 娣诲姞瀵瑰簲鐨勬祴璇曟枃浠?
绀轰緥锛?
type MyLimiter struct {
repo *repo.RedisRepo
}
func (l *MyLimiter) Allow(ctx context.Context, rule config.Rule, key string, now time.Time) (types.Decision, error) {
// 瀹炵幇浣犵殑闄愭祦閫昏緫
return types.Decision{Allowed: true}, nil
}娆㈣繋璐$尞锛佽鏌ョ湅 [寮�鍙戞寚鍗梋(docs/DEVELOPMENT.md)銆?
- Fork 鏈粨搴?
- 鍒涘缓鐗规�у垎鏀?(
git checkout -b feature/AmazingFeature) - 鎻愪氦鏇存敼 (
git commit -m 'Add some AmazingFeature') - 鎺ㄩ�佸埌鍒嗘敮 (
git push origin feature/AmazingFeature) - 寮�鍚?Pull Request
鏈」鐩噰鐢?MIT 璁稿彲璇?- 鏌ョ湅 LICENSE 鏂囦欢浜嗚В璇︽儏銆?
- Redis - 楂樻�ц兘鍐呭瓨鏁版嵁搴?
- Gorilla Mux - HTTP 璺敱鍣?
- Go Redis - Redis Go 瀹㈡埛绔?