Skip to content

A Go + Redis based unified rate limiting and quota service for dubbo-go-pixiu gateway and microservices, supporting sliding window, token bucket, and leaky bucket algorithms, multi-dimensional limits (IP, user, app, route), per-minute/hour/day quotas, burst smoothing, black/white lists, real-time monitoring, and distributed consistency.

Notifications You must be signed in to change notification settings

nanjiek/Pixiu-RLS

Repository files navigation

Pixiu-RLS

*鍩轰簬 Go + Redis 鐨勯珮鎬ц兘鍒嗗竷寮忛檺娴侀厤棰濇湇鍔?

Go Version Redis License

鏀寔澶氱闄愭祦绠楁硶鍜屽缁村害鎺у埗锛岄�傜敤浜庣綉鍏冲拰寰湇鍔℃灦鏋?

[鐗规�(#鏍稿績鍔熻兘) 鈥?[蹇�熷紑濮媇(#蹇�熷紑濮? 鈥?鏂囨。 鈥?鎬ц兘


馃摉 椤圭洰绠�浠?

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

瀹夎閮ㄧ讲

1. 鍏嬮殕椤圭洰

git clone https://github.com/your-org/pixiu-rls.git
cd pixiu-rls

2. 閰嶇疆鏂囦欢

缂栬緫 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

3. 鍚姩 Redis

# 浣跨敤 Docker
docker run -d -p 6379:6379 --name redis redis:7-alpine

# 鎴栦娇鐢?docker-compose
docker-compose -f deployments/docker-compose.yaml up -d

4. 杩愯鏈嶅姟

# 缂栬瘧
go build -o rls-http ./cmd/rls-http

# 杩愯
./rls-http -c configs/rls.yaml

鏈嶅姟鍚姩鍚庤闂細http://localhost:8080

蹇�熸祴璇?

1. 鍋ュ悍妫�鏌?

curl http://localhost:8080/health

2. 闄愭祦妫�鏌?

curl -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"
}

3. 瑙勫垯绠$悊

# 鑾峰彇鎵�鏈夎鍒?
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
  }'

馃搳 鎬ц兘鎸囨爣

RCU 蹇収鎬ц兘

鍩轰簬 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 鏁呴殰鏃舵湰鍦伴檺娴?閰嶉闄嶇骇璇存槑

鎶�鏈枃妗?

绀轰緥浠g爜

馃И 娴嬭瘯

杩愯鎵�鏈夋祴璇?

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=. -benchmem

娴嬭瘯瑕嗙洊鐜?

go 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: 8000

馃洜锔?寮�鍙?

椤圭洰缁撴瀯

Pixiu-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 ./...

娣诲姞鏂扮殑闄愭祦绛栫暐

  1. 鍦?internal/core/limiter/ 鍒涘缓鏂版枃浠?
  2. 瀹炵幇 core.Strategy 鎺ュ彛
  3. 鍦?cmd/rls-http/main.go 娉ㄥ唽绛栫暐
  4. 娣诲姞瀵瑰簲鐨勬祴璇曟枃浠?

绀轰緥锛?

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)銆?

璐$尞娴佺▼

  1. Fork 鏈粨搴?
  2. 鍒涘缓鐗规�у垎鏀?(git checkout -b feature/AmazingFeature)
  3. 鎻愪氦鏇存敼 (git commit -m 'Add some AmazingFeature')
  4. 鎺ㄩ�佸埌鍒嗘敮 (git push origin feature/AmazingFeature)
  5. 寮�鍚?Pull Request

馃摑 璁稿彲璇?

鏈」鐩噰鐢?MIT 璁稿彲璇?- 鏌ョ湅 LICENSE 鏂囦欢浜嗚В璇︽儏銆?

馃檹 鑷磋阿

馃摓 鑱旂郴鏂瑰紡


Made with 鉂わ笍 by Pixiu-RLS Team

About

A Go + Redis based unified rate limiting and quota service for dubbo-go-pixiu gateway and microservices, supporting sliding window, token bucket, and leaky bucket algorithms, multi-dimensional limits (IP, user, app, route), per-minute/hour/day quotas, burst smoothing, black/white lists, real-time monitoring, and distributed consistency.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages