Documentation
¶
Overview ¶
Package contrib 集中承载 hertz-contrib 社区库的桥接适配。
每个 ekit 侧桥接只做三件事:类型/Option 别名透传、一行挂载(中间件或 路由注册)、ekit 安全默认值(如 KeyAuth 缺省 reject-all validator、 RegisterDebug 的 token 鉴权 scope)。上游能力与语义以官方文档为准, ekit 不重复包装接口。
与 middleware 根包的边界:根包只保留自研标准中间件栈 (Recovery/Response/AccessLog/RateLimit/Auth/Prometheus/I18n/TraceID 组装), 本包是可选的社区库接入层——import 根包不会传递引入任何 hertz-contrib 依赖(2026-09-19 拆分,v0.29.0 breaking:原 mw.Xxx 桥接 API 迁至本包)。
清单(上游 → ekit API):
- hertz-contrib/cache → CacheMiddleware
- hertz-contrib/jwt → JWTAuth / JWTGenerateToken / JWTParse
- hertz-contrib/keyauth → KeyAuth
- hertz-contrib/csrf → CSRFMiddleware
- hertz-contrib/sessions → Sessions / RegisterSessions
- hertz-contrib/pprof → RegisterPprof / RegisterDebug(WithPrefix)
- swaggo/http-swagger → SwaggerV2(WithPrefix) 系列
- hertz-contrib/gzip → GzipMiddleware
- hertz-contrib/etag → ETagMiddleware
- hertz-contrib/secure → DefaultCSP(配合 secure.New 使用)
- hertz-contrib/basicauth → BasicAuth(仅适合 HTTPS)
- hertz-contrib/reverseproxy → NewSingleHostReverseProxy / MountReverseProxy
- hertz-contrib/loadbalance → NewRoundRobinBalancer
- hertz-contrib/autotls → AutoTlsNewTlsConfig / AutoTlsRunWithShutdown 等
- hertz-contrib/opensergo → SentinelServerMiddleware / SentinelClientMiddleware
- hertz-contrib/lark-hertz → LarkCardAction / LarkEvent
Index ¶
- Constants
- func AutoTlsNewServerWithCustomManager(m *autocert.Manager, tlsc *tls.Config, opts ...config.Option) *server.Hertz
- func AutoTlsNewTlsConfig(domains ...string) *tls.Config
- func AutoTlsRun(h *server.Hertz) error
- func AutoTlsRunWithShutdown(ctx context.Context, h *server.Hertz) error
- func BasicAuth(accounts Accounts) app.HandlerFunc
- func BasicAuthForRealm(accounts Accounts, realm, userKey string) app.HandlerFunc
- func CSRFMiddleware(opts ...CSRFOption) app.HandlerFunc
- func Cache(opts ...CacheOption) app.HandlerFunc
- func DefaultCSP() string
- func ETagMiddleware(opts ...etag.Option) app.HandlerFunc
- func GzipMiddleware(level int, opts ...gzip.Option) app.HandlerFunc
- func JWTAuth(opts ...JWTOption) app.HandlerFunc
- func JWTGenerateToken(claims jwt.MapClaims) (string, error)
- func JWTParse(tokenString string) (jwt.MapClaims, error)
- func KeyAuth(opts ...keyauth.Option) app.HandlerFunc
- func LarkCardAction(h *server.Hertz, handler *LarkCardHandler, opts ...LarkEventOption)
- func LarkCardActionHandlerFunc(handler *LarkCardHandler, opts ...LarkEventOption) func(c context.Context, ctx *app.RequestContext)
- func LarkEvent(h *server.Hertz, ed *LarkEventDispatcher, opts ...LarkEventOption)
- func LarkEventHandlerFunc(ed *LarkEventDispatcher, opts ...LarkEventOption) func(c context.Context, ctx *app.RequestContext)
- func MountReverseProxy(h *server.Hertz, rp *ReverseProxy)
- func RegisterDebug(h *server.Hertz, opts ...DebugOption)
- func RegisterDebugGroup(g *route.RouterGroup, prefix string, token ...string)
- func RegisterSentinelServer(h *server.Hertz, opts ...SentinelServerOption)
- func RegisterSessions(h *server.Hertz, name string, store Store)
- func RegisterSessionsMany(h *server.Hertz, names []string, store Store)
- func RegisterSwaggerV2(h *server.Hertz, opts ...func(*httpSwagger.Config))
- func RegisterSwaggerV2WithPrefix(h *server.Hertz, prefix string, opts ...func(*httpSwagger.Config))
- func SentinelClientMiddleware(opts ...SentinelClientOption) client.Middleware
- func SentinelServerMiddleware(opts ...SentinelServerOption) app.HandlerFunc
- func Sessions(name string, store Store) app.HandlerFunc
- func SessionsMany(names []string, store Store) app.HandlerFunc
- func SwaggerV2(opts ...func(*httpSwagger.Config)) app.HandlerFunc
- func SwaggerV2WithPrefix(prefix, specURL string, opts ...func(*httpSwagger.Config)) app.HandlerFunc
- type Accounts
- type CSRFOption
- type CSRFOptions
- type CacheOption
- func WithBeforeReplyWithCache(cb cache.BeforeReplyWithCacheCallback) CacheOption
- func WithCacheExpiration(d time.Duration) CacheOption
- func WithCachePrefix(prefix string) CacheOption
- func WithCacheStore(store persist.CacheStore) CacheOption
- func WithCacheStrategyByRequest(fn cache.GetCacheStrategyByRequest) CacheOption
- func WithIgnoreQueryOrder() CacheOption
- func WithOnHitCache(cb cache.OnHitCacheCallback) CacheOption
- func WithOnMissCache(cb cache.OnMissCacheCallback) CacheOption
- func WithOnShareSingleFlight(cb cache.OnShareSingleFlightCallback) CacheOption
- type DebugOption
- type JWTOption
- type LarkCardHandler
- type LarkEventDispatcher
- type LarkEventOption
- type Loadbalancer
- type PprofInfo
- type PprofOption
- type ReverseProxy
- type SentinelClientOption
- type SentinelServerOption
- type Session
- type SessionOptions
- type Store
- type SwaggerV2Option
Constants ¶
const PprofDefaultPrefix = "/debug/pprof"
PprofDefaultPrefix 是 hertz-contrib/pprof 默认暴露路径,业务如需隐藏可 通过 WithPprofPrefix 改写,例如挂到 "/internal/debug/pprof" 避免被公网 扫描到。
Variables ¶
This section is empty.
Functions ¶
func AutoTlsNewServerWithCustomManager ¶
func AutoTlsNewServerWithCustomManager(m *autocert.Manager, tlsc *tls.Config, opts ...config.Option) *server.Hertz
AutoTlsNewServerWithCustomManager 给业务完全控制权(自定义 autocert.Manager 用自己的证书缓存目录 / DNS-01 校验)。ekit 业务 99% 用 NewTlsConfig 即可, 这个函数给 ekit 业务做"复杂 TLS 编排"留口子(类似 ekit P4 大依赖模式)。
用法:
m := &autocert.Manager{
Prompt: autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.com"),
Cache: autocert.DirCache("/var/www/.cache"),
}
h := contrib.AutoTlsNewServerWithCustomManager(m, nil)
hlog.Fatal(contrib.AutoTlsRun(h))
func AutoTlsNewTlsConfig ¶
AutoTlsNewTlsConfig 透传 hertz-contrib/autotls.NewTlsConfig,构造 Let's Encrypt 托管的 TLS 配置(domains 是白名单,如 "example.com")。
官方依据:https://github.com/hertz-contrib/autotls (v0.0.1) + hertz 官方 TLS 教程。
用法:
h := server.New(
server.WithTLS(contrib.AutoTlsNewTlsConfig("example.com", "www.example.com")),
server.WithHostPorts(":https"),
)
hlog.Fatal(contrib.AutoTlsRun(h))
func AutoTlsRun ¶
AutoTlsRun 透传 hertz-contrib/autotls.Run,启动 HTTPS server(阻塞)。 业务应该用 WithShutdown 替代:支持 ctx 取消触发 graceful shutdown。
func AutoTlsRunWithShutdown ¶
AutoTlsRunWithShutdown 是 AutoTlsRun 的 ctx 包装:ctx 取消时自动 关闭 server,适合配合 ekit bootstrap 生命周期管理。
官方依据:hertz-contrib/autotls.RunWithContext 文档 (https://github.com/hertz-contrib/autotls README)
用法:
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() hlog.Fatal(contrib.AutoTlsRunWithShutdown(ctx, h))
func BasicAuth ¶
func BasicAuth(accounts Accounts) app.HandlerFunc
BasicAuth 透传 hertz 框架内置 HTTP Basic Auth 中间件,ekit 业务 1 行挂载,无需记 hertz 长 import 路径。
官方依据:https://github.com/cloudwego/hertz README [Extensions] 段 (hertz-contrib 23 个三方中间件中 basicauth 列在 hertz 框架内置, github.com/cloudwego/hertz/tree/main/pkg/app/middlewares/server/basic_auth)。
用法:
h.Use(contrib.BasicAuth(mw.Accounts{
"alice": "secret",
"admin": "stronger",
}))
注意:HTTP Basic Auth 每次请求都带 Authorization 头,密码是 base64 编码(不是 hash),**仅适用于 HTTPS 部署**,公网 HTTP 会泄露明文。 生产推荐:用 HTTPS + TLS termination at gateway,或改用 JWT(BearerAuth)。
func BasicAuthForRealm ¶
func BasicAuthForRealm(accounts Accounts, realm, userKey string) app.HandlerFunc
BasicAuthForRealm 透传 hertz 框架内置 BasicAuthForRealm,支持自定义 realm(浏览器弹窗显示)和 userKey(从 Authorization 头提取用户名的 方式,默认 "Authorization")。
用法:
h.Use(contrib.BasicAuthForRealm(accounts, "MyService", "X-API-User"))
func CSRFMiddleware ¶
func CSRFMiddleware(opts ...CSRFOption) app.HandlerFunc
CSRFMiddleware 返回 CSRF 防护中间件。
基于 hertz-contrib/csrf。校验请求携带的 CSRF token 是否与服务端签发的匹配, 不匹配则拒绝。用于防御跨站请求伪造,保护状态变更类接口(POST/PUT/DELETE)。
客户端流程:
- GET 一个受保护页面/接口,响应会种下 CSRF cookie + 可通过 csrf.GetToken 读取 token
- 后续 POST 请求在指定位置(默认 header X-CSRF-Token)携带 token
前置条件: 必须先注册 sessions 中间件(hertz-contrib/sessions), 否则每个请求都会 panic(底层 csrf 依赖 sessions.Default(c))。 Secret 不能为空。
用法:
h.Use(contrib.CSRFMiddleware(mw.WithCSRFSecret("your-32-byte-random-secret")))
在 handler 中读取 token 透传给前端:
token := csrf.GetToken(c)
func Cache ¶
func Cache(opts ...CacheOption) app.HandlerFunc
Cache 返回 hertz HTTP 缓存中间件,默认按 RequestURI 作 key、60s 过期、 内存存储(进程级,重启失效)。Redis 等分布式场景用 WithCacheStore 注入。
⚠️ 默认只缓存 GET(2026-09-05 复审修复):上游 hertz-contrib/cache 的 NewCacheByRequestURI strategy 恒返回 true 不分方法,全局挂载时 POST/ PUT/DELETE 的 2xx 响应也会被缓存重放。ekit 包装层默认对非 GET 请求直接 放行不缓存,对齐本注释一贯宣称的"GET 缓存"语义;业务通过 WithCacheStrategyByRequest 显式接管缓存判定时,方法过滤由业务负责。
业务使用:
// 简单 GET 缓存 1 分钟
h.Use(contrib.Cache())
// 自定义 5 分钟 + key 前缀
h.Use(contrib.Cache(
mw.WithCacheExpiration(5*time.Minute),
mw.WithCachePrefix("my-svc"),
))
// Redis 分布式缓存
h.Use(contrib.Cache(
mw.WithCacheStore(persist.NewRedisStore(redisClient)),
mw.WithCacheExpiration(10*time.Minute),
))
官方依据:https://www.cloudwego.io/zh/docs/hertz/tutorials/third-party/middleware/cache/ (上游 strategy 返回 false 时 c.Next(ctx) 直接放行 — 非 GET 走同一通道)
func DefaultCSP ¶
func DefaultCSP() string
DefaultCSP 返回 ekit 推荐的严格 Content-Security-Policy 策略。
安全响应头中间件已迁移到 hertz-contrib/secure,调用方按需启用:
import "github.com/hertz-contrib/secure"
h.Use(secure.New(
secure.WithContentSecurityPolicy(contrib.DefaultCSP()),
secure.WithFrameDeny(true),
secure.WithContentTypeNosniff(true),
secure.WithReferrerPolicy("no-referrer"),
secure.WithSTSSeconds(31536000), // 可选 HSTS
))
策略说明:
- default-src/script-src/style-src: 仅限同源
- img-src: 同源 + data/blob(允许内联图片)
- connect-src: 同源 + ws/wss(WebSocket 调试与实时推送)
- frame-ancestors: 禁止任何嵌入(防点击劫持)
func ETagMiddleware ¶
func ETagMiddleware(opts ...etag.Option) app.HandlerFunc
ETagMiddleware 返回 ETag 条件请求中间件。
基于 hertz-contrib/etag。客户端首次请求获得响应体 + ETag 头; 后续请求携带 If-None-Match,若 ETag 未变则返回 304 Not Empty(不传响应体,节省带宽)。
透传 contrib 的 Option,常用项:
- etag.WithWeak() 使用弱 ETag(W/"..."),适用于可接受语义等价的场景
用法:
h.Use(contrib.ETagMiddleware()) // 或弱 ETag h.Use(contrib.ETagMiddleware(etag.WithWeak()))
func GzipMiddleware ¶
func GzipMiddleware(level int, opts ...gzip.Option) app.HandlerFunc
GzipMiddleware 返回 gzip 响应压缩中间件。
基于 hertz-contrib/gzip,压缩等级通过 level 指定(gzip.DefaultCompression 使用默认)。 透传 contrib 的 Option,常用项:
- gzip.WithExcludedExtensions([]string{".pdf", ".mp4"}) 跳过二进制扩展名
- gzip.WithExcludedPaths([]string{"/metrics"}) 跳过指定路径
- gzip.WithDecompressFn(gzip.DefaultDecompressHandle) 同时解压请求体
注意: gzip 会劫持响应写入器,建议仅在确有压缩需求的路由组上注册,而非全局。
用法:
h.Use(contrib.GzipMiddleware(gzip.DefaultCompression))
// 或排除二进制文件
h.Use(contrib.GzipMiddleware(gzip.DefaultCompression,
gzip.WithExcludedExtensions([]string{".pdf", ".mp4", ".png"}))
func JWTAuth ¶
func JWTAuth(opts ...JWTOption) app.HandlerFunc
JWTAuth 返回 hertz middleware 函数,验证请求 Authorization: Bearer {token}。 失败返回 401;成功把 claims 写入 ctx,hertz-contrib/jwt 内部用 c.Set("userID", ...)。
业务使用:
h.Use(contrib.JWTAuth(
mw.WithJWTSecret([]byte("my-secret-key-at-least-32-bytes-long-for-HS256")),
mw.WithJWTSkipPaths("/healthz", "/login"),
))
⚠️ fail-closed:构造失败(典型:漏传 WithJWTSecret)时返回的中间件会把 所有请求 500,而不是静默放行 — 认证中间件缺省方向必须是拒绝。补传 secret 后再次调用 JWTAuth 即恢复正常(构造可重试,无 once 毒化)。
⚠️ 与 BearerTokenAuth(静态 token)互补:JWT 用于签名 token 验证, BearerToken 用于简单预共享。两者可同时存在但通常只用一个。
官方依据:https://www.cloudwego.io/zh/docs/hertz/tutorials/third-party/middleware/jwt/ (Timeout "用于设置 token 过期时间,默认为一小时")
func JWTGenerateToken ¶
JWTGenerateToken 用当前配置签发 token(HS256/384/512 共享密钥模式)。 业务在登录 handler 调:cli.POST("/login", JWTGenerateToken(MapClaims{"user_id": uid}))
exp/iat 自动注入:claims 未显式带 exp 时注入 exp=now+WithJWTTimeout(默认 1h), 未带 iat 时注入 now。hertz-contrib/jwt 中间件要求 token 必须带 exp (缺失返回 400 ErrMissingExpField),官方登录签发的 payload 默认包含 "token 的过期时间和创建时间"(2026-09-05 复审修复:原实现不注入 exp, 签发的 token 被自家中间件 400 拒绝)。
RSA 模式需自行实现(本 helper 不覆盖 — 业务可用 HertzJWTMiddleware.TokenGenerator)。
⚠️ **签发配置取自当前 runtime(即验签用的那个 instance)**,不是取自可变 opts。
两者若不同源,轮换 secret 后就会出现「自家签的 token 被自家中间件 401」。 ⇒ 签发与验签读同一个对象 ⇒ 结构上不可能分裂。
func KeyAuth ¶
func KeyAuth(opts ...keyauth.Option) app.HandlerFunc
KeyAuth 返回 hertz API Key 认证中间件,桥接 hertz-contrib/keyauth。
业务必须提供 validator(无默认实现,因为 API key 验证逻辑业务特定)。
典型用法(简单 API key 验证):
keys := map[string]bool{
"client-a-key-abc123": true,
"client-b-key-xyz789": true,
}
h.Use(contrib.KeyAuth(
keyauth.WithKeyLookUp("header:X-API-Key", ""),
keyauth.WithValidator(func(_ context.Context, _ *app.RequestContext, key string) (bool, error) {
return keys[key], nil
}),
keyauth.WithFilter(func(_ context.Context, c *app.RequestContext) bool {
return string(c.Path()) == "/healthz"
}),
))
⚠️ 内置安全默认 errorHandler:上游默认实现在 validator 返回 (false, nil) 时直接 err.Error() → nil 指针 panic(keyauth v0.0.0-20221011 option.go:101, 已实测复现:无效 key 的拒绝路径必崩,只能靠 recovery 兜成 500)。ekit 前置 的默认 handler 按官方状态码语义映射(ErrMissingOrMalformedAPIKey → 400, 其余 → 401)并对 nil err 硬化为 401。⚠️ 与上游的 body 分歧:上游对非 nil 校验错误回传 err.Error() 原文,ekit 统一返回固定文案 "invalid API key" (避免泄漏校验器内部错误文本);业务可用 keyauth.WithErrorHandler 覆盖 (option 按序 Apply,后传生效)。
官方依据:https://www.cloudwego.io/zh/docs/hertz/tutorials/third-party/middleware/keyauth/ (默认 errorHandler:ErrMissingOrMalformedAPIKey → 400,其他校验失败 → 401, 均走 AbortWithMsg;WithErrorHandler 用于"设置校验 token 失败的自定义处理逻辑")
⚠️ KeyAuth 直接接受 keyauth.Option(不重新包装类型),业务需要 import hertz-contrib/keyauth(已在 ekit go.mod);ekit 提供 17 个 hertz-contrib 中间件的统一入口 KeyAuth,具体 option 用法以 hertz-contrib/keyauth 为准。
func LarkCardAction ¶
func LarkCardAction(h *server.Hertz, handler *LarkCardHandler, opts ...LarkEventOption)
LarkCardAction 注册飞书卡片交互回调到 hertz 路由,默认路径 "/lark/card",业务可用 hertz 自带 h.Handle 修改路径。
官方依据:https://github.com/hertz-contrib/lark-hertz + 飞书开放平台 卡片回调文档 https://open.feishu.cn/document/uAjLw4CM/ukzMukzMukzM/feishu-cards/card-callback
用法:
cardHandler := larkcard.NewCardActionHandler("verification_token", func(ctx context.Context, c *larkcard.CardAction) (interface{}, error) {
// 业务处理用户点卡片按钮
return nil, nil
})
contrib.LarkCardAction(h, cardHandler)
func LarkCardActionHandlerFunc ¶
func LarkCardActionHandlerFunc(handler *LarkCardHandler, opts ...LarkEventOption) func(c context.Context, ctx *app.RequestContext)
LarkCardActionHandlerFunc 透传 hertzlark.NewCardActionHandlerFunc 返 回的 app.HandlerFunc(给业务自己挂到自定义路径用)。
func LarkEvent ¶
func LarkEvent(h *server.Hertz, ed *LarkEventDispatcher, opts ...LarkEventOption)
LarkEvent 注册飞书事件回调到 hertz 路由,默认路径 "/lark/event"。 业务需先构造 EventDispatcher 注册各类事件 handler。
官方依据:https://github.com/hertz-contrib/lark-hertz + 飞书事件订阅 文档 https://open.feishu.cn/document/uAjLw4CM/ukzMukzMukzM/event-subscription
用法:
ed := dispatcher.NewEventDispatcher("verification_token", "encrypt_key")
ed.OnP2MessageReceivedV1(func(ctx context.Context, event *larkevent.EventV2) {
// 处理消息事件
})
contrib.LarkEvent(h, ed)
func LarkEventHandlerFunc ¶
func LarkEventHandlerFunc(ed *LarkEventDispatcher, opts ...LarkEventOption) func(c context.Context, ctx *app.RequestContext)
LarkEventHandlerFunc 透传 hertzlark.NewEventHandlerFunc 返回的 app.HandlerFunc(给业务自己挂到自定义路径用)。
func MountReverseProxy ¶
func MountReverseProxy(h *server.Hertz, rp *ReverseProxy)
MountReverseProxy 把 rp 挂到 h 的 NoRoute 上(catch-all 反向代理)。 业务也可自己 h.GET/POST/Handle 单独挂。 ⚠️ h.NoRoute 是赋值语义(hertz 未透出当前 handler,无法检测冲突): 多次调用或与业务自设 NoRoute 混用时后者静默失效——一个 engine 只挂一个。
func RegisterDebug ¶
func RegisterDebug(h *server.Hertz, opts ...DebugOption)
RegisterDebug 在 h *server.Hertz 上注册带鉴权 + fgprof 选项的 pprof 端点。
与 RegisterPprof 区别:支持鉴权(防止公网被扫到)和 fgprof(非阻塞 CPU profiling)。默认无鉴权、无 fgprof,业务按需 WithDebugAuth/WithDebugFgprof。
用法:
h := server.New()
RegisterDebug(h,
WithDebugPrefix("/internal/pprof"),
WithDebugAuth(os.Getenv("PPROF_TOKEN")),
WithDebugFgprof(),
)
官方依据:https://github.com/hertz-contrib/pprof + hertz 官方扩展列表 https://github.com/cloudwego/hertz#extensions。
func RegisterDebugGroup ¶
func RegisterDebugGroup(g *route.RouterGroup, prefix string, token ...string)
RegisterDebugGroup 在已有 router group 上注册 debug 端点,可选 token 鉴权。
用法:
admin := h.Group("/admin")
RegisterDebugGroup(admin, "/debug", "secret-token")
token 可省略,省略时不启用鉴权(等同于 RegisterPprofWithGroup)。
func RegisterSentinelServer ¶
func RegisterSentinelServer(h *server.Hertz, opts ...SentinelServerOption)
RegisterSentinelServer 业务用 server 直接挂载的便捷 helper(等同 SentinelServerMiddleware + h.Use)。
func RegisterSessions ¶
RegisterSessions 跟 Sessions 等价,只是用 h *server.Hertz 直接调, 跟 RegisterPprof/RegisterDebug 风格统一。
func RegisterSessionsMany ¶
RegisterSessionsMany 跟 SessionsMany 等价,Server 风格。
func RegisterSwaggerV2 ¶
func RegisterSwaggerV2(h *server.Hertz, opts ...func(*httpSwagger.Config))
RegisterSwaggerV2 在 h *server.Hertz 上挂载 swagger UI 路由,prefix 默认 /swagger/*any,specURL 默认 /swagger/doc.json。
完整示例:
contrib.RegisterSwaggerV2(h,
mw.WithSwaggerURL("http://localhost:8888/swagger/doc.json"),
httpSwagger.DeepLinking(true),
)
func RegisterSwaggerV2WithPrefix ¶
func RegisterSwaggerV2WithPrefix(h *server.Hertz, prefix string, opts ...func(*httpSwagger.Config))
RegisterSwaggerV2WithPrefix 在自定义前缀挂载 swagger UI(例如隐藏到 /internal/debug/swagger 避免公网被扫到),specURL 自动推导为 <prefix>/doc.json(上游 doc.json handler 跟随注册路径,无需业务手写)。
contrib.RegisterSwaggerV2WithPrefix(h, "/internal/debug/swagger",
httpSwagger.DeepLinking(true))
func SentinelClientMiddleware ¶
func SentinelClientMiddleware(opts ...SentinelClientOption) client.Middleware
SentinelClientMiddleware 透传 opensergosentinel.SentinelClientMiddleware, 启用 hertz 客户端限流。
func SentinelServerMiddleware ¶
func SentinelServerMiddleware(opts ...SentinelServerOption) app.HandlerFunc
SentinelServerMiddleware 透传 hertz-contrib/opensergo/sentinel/adapter 的 SentinelServerMiddleware,启用 hertz 服务端 sentinel 限流/熔断。
官方依据:https://github.com/hertz-contrib/opensergo (sentinel adapter for hertz) + OpenSergo 微服务治理 spec。
用法:
h.Use(contrib.SentinelServerMiddleware(
mw.WithSentinelServerResourceExtractor(func(ctx context.Context, c *app.RequestContext) string {
return string(c.Path()) // 按 URL path 限流
}),
mw.WithSentinelServerBlockFallback(func(ctx context.Context, c *app.RequestContext) {
c.AbortWithStatus(429)
}),
))
业务需先调 sentinel.InitWithConfig 或 sentinel.InitDefault 初始化 sentinel 规则(流控/熔断/系统保护等),ekit 不替业务写规则。
func Sessions ¶
func Sessions(name string, store Store) app.HandlerFunc
Sessions 注册 session 中间件,把请求 cookie 解析为 hertz-contrib sessions.Session 注入到 handler context。
用法:
import "github.com/hertz-contrib/sessions/cookie"
import contrib "github.com/oekit/middleware/contrib"
store := cookie.NewStore([]byte("secret"))
h.Use(contrib.Sessions("mysession", store))
h.GET("/hello", func(ctx context.Context, c *app.RequestContext) {
s := mw.DefaultSession(c)
s.Set("hello", "world")
s.Save()
c.JSON(200, utils.H{"hello": s.Get("hello")})
})
官方依据:https://github.com/hertz-contrib/sessions + hertz 官方扩展 列表 https://github.com/cloudwego/hertz#extensions。
func SessionsMany ¶
func SessionsMany(names []string, store Store) app.HandlerFunc
SessionsMany 注册多个 session(同一个 store,不同 cookie 名),业务 通过 DefaultMany(c, "name") 取具体 session。
func SwaggerV2 ¶
func SwaggerV2(opts ...func(*httpSwagger.Config)) app.HandlerFunc
SwaggerV2 透传 httpSwagger.Handler(opts...),等价 SwaggerV2WithPrefix 但不强制传 specURL(specURL 可通过 opts 里的 httpSwagger.URL 注入)。
func SwaggerV2WithPrefix ¶
func SwaggerV2WithPrefix(prefix, specURL string, opts ...func(*httpSwagger.Config)) app.HandlerFunc
SwaggerV2WithPrefix 把 specURL 注入 httpSwagger.Handler 配置并返回 app.HandlerFunc;业务用 h.GET / h.Handle 挂载即可。
参数语义(2026-09-05 复审修复:原实现把 specURL 组装后丢弃,UI 打不开 指定的 spec):
- specURL:传给 httpSwagger.URL,swagger UI 以它加载 API 定义。上游 Handler(configFns...) 由 configFns 构造 Config(swaggo/http-swagger v1.3.4 swagger.go:151),默认 URL="doc.json"。
- prefix:只由业务 h.GET 的路由路径体现,http-swagger 本身没有 prefix 配置(上游 API 决定),传什么都不会改写 handler 行为。要挂到自定义 前缀用 RegisterSwaggerV2WithPrefix。
挂载示例:
h.GET("/swagger/*any", mw.SwaggerV2WithPrefix(
"/swagger", "/swagger/doc.json", httpSwagger.DeepLinking(true)))
Types ¶
type Accounts ¶
type Accounts = hertzbasicauth.Accounts
Accounts 是 hertz 框架内置 basicauth 的账号表,key=username,value=password。 业务用 `Accounts{"alice": "secret", "bob": "s3cret"}` 初始化。
type CSRFOption ¶
type CSRFOption func(*CSRFOptions)
CSRFOption 配置 CSRFMiddleware。
func WithCSRFIgnoredMethods ¶
func WithCSRFIgnoredMethods(methods ...string) CSRFOption
WithCSRFIgnoredMethods 设置不校验的 HTTP 方法。
func WithCSRFKeyLookUp ¶
func WithCSRFKeyLookUp(lookup string) CSRFOption
WithCSRFKeyLookUp 设置 token 的查找位置。 格式 "<source>:<key>",如 "header:X-CSRF-Token"。
func WithCSRFSecret ¶
func WithCSRFSecret(secret string) CSRFOption
WithCSRFSecret 设置 CSRF token 密钥。
type CSRFOptions ¶
type CSRFOptions struct {
// Secret 用于签发/校验 CSRF token 的密钥(必填,建议 32 字节随机串)。
Secret string
// IgnoredMethods 不校验的 HTTP 方法,默认 ["GET","HEAD","OPTIONS","TRACE"]。
IgnoredMethods []string
// KeyLookUp token 的查找位置,格式 "<source>:<key>",默认 "header:X-CSRF-Token"。
// source 可选: header / form / query。
KeyLookUp string
}
CSRFOptions 是 CSRF 防护中间件的配置。
type CacheOption ¶
type CacheOption func(*cacheOptions)
CacheOption 是 Cache 的配置选项函数类型。
func WithBeforeReplyWithCache ¶
func WithBeforeReplyWithCache(cb cache.BeforeReplyWithCacheCallback) CacheOption
WithBeforeReplyWithCache 写入响应前的回调(用于脱敏等)。
func WithCacheExpiration ¶
func WithCacheExpiration(d time.Duration) CacheOption
WithCacheExpiration 设置默认缓存过期时间,默认 1 分钟。
func WithCachePrefix ¶
func WithCachePrefix(prefix string) CacheOption
WithCachePrefix 设置缓存 key 前缀(多服务共用 Redis 时防冲突),默认 "ekit"。
func WithCacheStore ¶
func WithCacheStore(store persist.CacheStore) CacheOption
WithCacheStore 注入自定义 CacheStore(Redis 等)。 业务需先构造 persist.NewRedisStore(client) 再传入。 未设置时默认用 persist.NewMemoryStore。
func WithCacheStrategyByRequest ¶
func WithCacheStrategyByRequest(fn cache.GetCacheStrategyByRequest) CacheOption
WithCacheStrategyByRequest 自定义"是否缓存"判定。 返回 (cacheable, strategy) — cacheable=false 直接放行不缓存, strategy 用作 cache key + expire。
func WithIgnoreQueryOrder ¶
func WithIgnoreQueryOrder() CacheOption
WithIgnoreQueryOrder 使用 NewCacheByRequestURIWithIgnoreQueryOrder (缓存 key 不计 query 顺序 — GET /a?x=1&y=2 与 /a?y=2&x=1 命中同一缓存)。
func WithOnHitCache ¶
func WithOnHitCache(cb cache.OnHitCacheCallback) CacheOption
WithOnHitCache 缓存命中时回调(用于打点等)。
func WithOnMissCache ¶
func WithOnMissCache(cb cache.OnMissCacheCallback) CacheOption
WithOnMissCache 缓存未命中时回调。
func WithOnShareSingleFlight ¶
func WithOnShareSingleFlight(cb cache.OnShareSingleFlightCallback) CacheOption
WithOnShareSingleFlight 共享 single-flight 时的回调(防缓存击穿)。
type DebugOption ¶
type DebugOption func(*debugConfig)
DebugOption 配置 RegisterDebug/RegisterDebugGroup。
func WithDebugAuth ¶
func WithDebugAuth(token string) DebugOption
WithDebugAuth 启用鉴权:请求必须带 query ?token=<value>(或 header X-Debug-Token: <value>)才允许访问 pprof 端点。适合公网暴露前的最后 一道简单防线;生产推荐走前置 gateway。
⚠️ 空 token 不会启用鉴权,并输出一条 Warn 日志 — 典型踩坑是 WithDebugAuth(os.Getenv("PPROF_TOKEN")) 在 env 未设置时静默裸奔, 日志就是给这个场景的信号(2026-09-05 复审修复)。
func WithDebugFgprof ¶
func WithDebugFgprof() DebugOption
WithDebugFgprof 额外注册 fgprof 端点(非阻塞 profiling,避免长采样把 STW 拖到秒级)。
官方依据:https://github.com/hertz-contrib/pprof/tree/main(README 提到 fgprof 是独立 API,需要单独调用 FgprofRegister)。
func WithDebugPrefix ¶
func WithDebugPrefix(prefix string) DebugOption
WithDebugPrefix 自定义 pprof URL 前缀,默认 /debug/pprof。
type JWTOption ¶
type JWTOption func(*jwtOptions)
JWTOption 是 JWTAuth 的配置选项函数类型。
func WithJWTAlgorithm ¶
WithJWTAlgorithm 设置签名算法,默认 HS256。 支持:HS256, HS384, HS512, RS256, RS384, RS512。
func WithJWTSecret ¶
WithJWTSecret 设置 HS256/384/512 共享密钥(对称加密用)。 必须设置:缺失时 JWTAuth 构造失败并 fail-closed(所有请求 500), 补传 secret 后再次调用 JWTAuth 即恢复。
func WithJWTSkipFunc ¶
WithJWTSkipFunc 自定义跳过逻辑(同 BearerTokenAuth)。
func WithJWTSkipPaths ¶
WithJWTSkipPaths 设置不需要认证的路径(同 BearerTokenAuth)。
func WithJWTTimeout ¶
WithJWTTimeout 设置 token 有效期,默认 1 小时。 对 JWTGenerateToken 生效:未显式传 exp 的 claims 会注入 exp=now+timeout (hertz-contrib/jwt 中间件要求 token 必须带 exp,缺失返回 400)。
type LarkCardHandler ¶
type LarkCardHandler = larkcard.CardActionHandler
LarkCardHandler 是 larkcard.CardActionHandler 的 type alias(飞书 卡片交互回调 handler,业务处理用户点卡片按钮的事件)。
type LarkEventDispatcher ¶
type LarkEventDispatcher = dispatcher.EventDispatcher
LarkEventDispatcher 是 dispatcher.EventDispatcher 的 type alias(飞书 事件分发器,业务注册所有事件类型 handler)。
type LarkEventOption ¶
type LarkEventOption = larkevent.OptionFunc
LarkEventOption 是 larkevent.OptionFunc 的 type alias。
type Loadbalancer ¶
type Loadbalancer = loadbalance.Loadbalancer
Loadbalancer 是 hertz 客户端 loadbalance.Loadbalancer 的 type alias (注意:不是 kitex 的 loadbalance.Loadbalancer,接口不通用)。 ekit 业务用 mw.Loadbalancer 直接拿上游接口。
官方依据:https://github.com/hertz-contrib/loadbalance (v0.1.0)
⚠️ 当前 hertz-contrib/loadbalance 只提供 round-robin 一种算法(无 weighted/consistent hash 变体)。如需这些算法,推荐用 ekit `network/httpx` + 自定义 LB,或参考 kitex 端的丰富算法集 (https://github.com/kitex-contrib/resolver-dns)。
func NewRoundRobinBalancer ¶
func NewRoundRobinBalancer() Loadbalancer
NewRoundRobinBalancer 构造 hertz 客户端 round-robin 负载均衡器。
用法(配合 hertz client):
import hertzclient "github.com/cloudwego/hertz/pkg/app/client" import hertzsd "github.com/cloudwego/hertz/pkg/app/client/discovery" lb := contrib.NewRoundRobinBalancer() cli, _ := hertzclient.NewClient(hertzclient.WithLoadBalancer(lb))
局限: round-robin 忽略权重,业务如需 weighted 推荐自己实现。
type PprofInfo ¶
type PprofInfo struct {
Prefix string
}
PprofInfo 返回 RegisterPprof 实际生效的注册信息,供业务侧日志/健康检查 等场景使用。
func RegisterPprof ¶
func RegisterPprof(h *server.Hertz, opts ...PprofOption) PprofInfo
RegisterPprof 在 h *server.Hertz 上注册 11 个 pprof 端点(无鉴权无 fgprof)。
与 hertz-contrib/pprof.Register 等价,仅做 Option 包装,让 ekit 调用方 享受函数选项 + 统一默认值。
官方依据:https://github.com/cloudwego/hertz#extensions 与 https://github.com/hertz-contrib/pprof(README)。
注意:这会向 h 注册 11 条 GET/POST 路由(/, /cmdline, /profile, /symbol, /trace, /allocs, /block, /goroutine, /heap, /mutex, /threadcreate), 务必仅在内部网络或鉴权之后暴露;公网部署请改用 RegisterDebug(支持 WithDebugAuth 鉴权)。
type PprofOption ¶
type PprofOption func(*pprofConfig)
PprofOption 配置 RegisterPprof(纯 pprof 桥接,无鉴权无 fgprof)。
func WithPprofPrefix ¶
func WithPprofPrefix(prefix string) PprofOption
WithPprofPrefix 自定义 pprof URL 前缀,默认 /debug/pprof。
type ReverseProxy ¶
type ReverseProxy = hertzreverseproxy.ReverseProxy
ReverseProxy 是 hertz-contrib/reverseproxy ReverseProxy 的 type alias, 业务用 mw.ReverseProxy 直接拿上游结构体类型做高级定制(自定义 Director / Transport / ErrorHandler 等)。
官方依据:https://github.com/hertz-contrib/reverseproxy
func NewSingleHostReverseProxy ¶
func NewSingleHostReverseProxy(target string, options ...hertzconfig.ClientOption) (*ReverseProxy, error)
NewSingleHostReverseProxy 构造单 host 反向代理(常用:网关层把 内部服务反向代理到外部端点,或本地开发代理到生产 API)。
内部基于 hertz client 实现,自动透传请求头 + 响应头,无需业务 写 Director。
用法:
rp, _ := mw.NewSingleHostReverseProxy("http://internal-service:8080")
h.NoRoute(func(c context.Context, ctx *app.RequestContext) {
rp.ServeHTTP(c, ctx)
})
进阶定制:
rp.SetDirector(func(req *protocol.Request) {
// 改写 path,例如剥前缀
req.URI().SetPath(strings.TrimPrefix(string(req.URI().Path()), "/api"))
})
rp.SetClient(myHertzClient) // 自定义 client,带鉴权/熔断
type SentinelClientOption ¶
type SentinelClientOption = opensergosentinel.ClientOption
SentinelClientOption 是 opensergosentinel.ClientOption 的 type alias。
func WithSentinelClientBlockFallback ¶
func WithSentinelClientBlockFallback(fn func(ctx context.Context, req *protocol.Request, resp *protocol.Response, blockError error) error) SentinelClientOption
WithSentinelClientBlockFallback 透传 WithClientBlockFallback (上游签名 fn(ctx, req, resp, err) error — 业务写自定义降级逻辑)。
func WithSentinelClientResourceExtractor ¶
func WithSentinelClientResourceExtractor(fn func(ctx context.Context, req *protocol.Request, resp *protocol.Response) string) SentinelClientOption
WithSentinelClientResourceExtractor 透传 WithClientResourceExtractor (上游签名 fn(ctx, req, resp) string — 同时拿到 request/response 决定资源名)。
type SentinelServerOption ¶
type SentinelServerOption = opensergosentinel.ServerOption
SentinelServerOption 是 opensergosentinel.ServerOption 的 type alias。
func WithSentinelServerBlockFallback ¶
func WithSentinelServerBlockFallback(fn func(ctx context.Context, c *app.RequestContext)) SentinelServerOption
WithSentinelServerBlockFallback 透传 WithServerBlockFallback。
func WithSentinelServerResourceExtractor ¶
func WithSentinelServerResourceExtractor(fn func(ctx context.Context, c *app.RequestContext) string) SentinelServerOption
WithSentinelServerResourceExtractor 透传 WithServerResourceExtractor。 转接器:ekit 提供显式函数签名,业务不需要 import sentinel 子包。 用法见 SentinelServerMiddleware 注释。
type Session ¶
type Session = hertzcontribsessions.Session
Session 是 hertz-contrib/sessions 的 Session 类型别名,业务拿到 Session 后可调 Get/Set/Save/Delete/AddFlash 等 API,不需要 import 完整的 hertz-contrib/sessions 路径。
func DefaultSession ¶
func DefaultSession(c *app.RequestContext) Session
DefaultSession 透传上游 Default(c),从 handler context 取默认 session。
func DefaultSessionMany ¶
func DefaultSessionMany(c *app.RequestContext, name string) Session
DefaultSessionMany 透传上游 DefaultMany(c, name),从 handler context 取指定 name 的 session。
type SessionOptions ¶
type SessionOptions = hertzcontribsessions.Options
SessionOptions 是 hertz-contrib/sessions 的 Options 类型别名,业务 在 Session.Options(...) 调用时使用。
type Store ¶
type Store = hertzcontribsessions.Store
Store 是 hertz-contrib/sessions 的 Store 类型别名,业务按需 import cookie/redis 子包构造具体 store。
type SwaggerV2Option ¶
type SwaggerV2Option = func(*httpSwagger.Config)
SwaggerV2Option 是 httpSwagger.Config Option 的别名(避免业务 import 长路径)。业务用 WithSwaggerXxx 系列拿 Option 再传给 RegisterSwaggerV2。
func WithSwaggerDeepLinking ¶
func WithSwaggerDeepLinking(b bool) SwaggerV2Option
WithSwaggerDeepLinking 透传 httpSwagger.DeepLinking(b)。
func WithSwaggerURL ¶
func WithSwaggerURL(specURL string) SwaggerV2Option
WithSwaggerURL 透传 httpSwagger.URL(specURL)。