Skip to content

Rate Limiter

go-zero provides a token-bucket rate limiter that works both in HTTP middleware and standalone.

etc/app.yaml
MaxConns: 10000 # max concurrent connections

Add the rate-limit middleware in the API spec:

@server (
middleware: RateLimit
)
service api {
@handler CreateOrder
post /orders (OrderReq) returns (OrderResp)
}
import "github.com/zeromicro/go-zero/core/limit"
// Token bucket: 100 requests per second, burst of 200
limiter := limit.NewTokenLimiter(100, 200, store, "api:rate")
if limiter.Allow() {
// process request
} else {
httpx.Error(w, errorx.NewCodeError(429, "too many requests"))
}
// 1000 requests per hour per user
limiter := limit.NewPeriodLimit(3600, 1000, store, "user:rate:")
code, err := limiter.Take("user:42")
switch code {
case limit.Allowed:
// process
case limit.HitQuota:
// last allowed request; warn user
case limit.OverQuota:
// rejected
}