pkg/adapters/go-zero/global_middleware.go (34 lines of code) (raw):
package go_zero
import (
"net/http"
sentinel "github.com/alibaba/sentinel-golang/api"
"github.com/alibaba/sentinel-golang/core/base"
"github.com/zeromicro/go-zero/rest"
)
// SentinelMiddleware returns new echo.HandlerFunc.
// Default resource name pattern is {httpMethod}:{apiPath}, such as "GET:/api/:id".
// Default block fallback is to return 429 (Too Many Requests) response.
//
// You may customize your own resource extractor and block handler by setting options.
func SentinelMiddleware(opts ...Option) rest.Middleware {
options := evaluateOptions(opts)
return func(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
resourceName := r.Method + ":" + r.URL.Path
if options.resourceExtract != nil {
resourceName = options.resourceExtract(r)
}
entry, blockErr := sentinel.Entry(
resourceName,
sentinel.WithResourceType(base.ResTypeWeb),
sentinel.WithTrafficType(base.Inbound),
)
if blockErr != nil {
if options.blockFallback != nil {
status, msg := options.blockFallback(r)
http.Error(w, msg, status)
} else {
// default error response
http.Error(w, "Blocked by Sentinel", http.StatusTooManyRequests)
}
return
}
defer entry.Exit()
next(w, r)
}
}
}