pkg/adapters/hertz/client.go (31 lines of code) (raw):
package hertz
import (
"context"
sentinel "github.com/alibaba/sentinel-golang/api"
"github.com/alibaba/sentinel-golang/core/base"
"github.com/cloudwego/hertz/pkg/app/client"
"github.com/cloudwego/hertz/pkg/protocol"
)
// SentinelClientMiddleware returns new client.Middleware
// Default resource name is {method}:{path}, such as "GET:/api/users"
// Default block fallback is returning blockError
// Define your own behavior by setting serverOptions
func SentinelClientMiddleware(opts ...ClientOption) client.Middleware {
options := newClientOptions(opts)
return func(next client.Endpoint) client.Endpoint {
return func(ctx context.Context, req *protocol.Request, resp *protocol.Response) (err error) {
resourceName := options.resourceExtract(ctx, req, resp)
entry, blockErr := sentinel.Entry(
resourceName,
sentinel.WithResourceType(base.ResTypeWeb),
sentinel.WithTrafficType(base.Outbound),
)
if blockErr != nil {
return options.blockFallback(ctx, req, resp, blockErr)
}
defer entry.Exit()
err = next(ctx, req, resp)
if err != nil {
sentinel.TraceError(entry, err)
return err
}
return nil
}
}
}