Documentation
¶
Overview ¶
Package hertz 为 Hertz HTTP 框架提供 ekit 生态集成。
覆盖以下能力(对称 kitex 包,治理配置热更新不适用 Hertz):
- 日志桥接:将 Hertz 框架内部日志通过 hlog → logx 归一,自动携带 trace_id 和结构化字段
- 生命周期管理:RunServer 将 Hertz server 注册到 bootstrap,一行完成 shutdown + 后台 Run; server 启动失败(如端口占用)时自动触发 RequestShutdown 优雅关机,避免进程"假活"
子包(推荐新代码直接使用子包):
- health: 健康检查端点(/ping、/health、/buildVersion)+ DB checker (Redis checker 在子包 health/redischeck)
- metrics: Prometheus /metrics 端点(gzip/OpenMetrics 协商透传)
- sse: Server-Sent Events 流式推送(官方 protocol/sse 的并发安全封装)
- OTel tracing 见 hertzotel / hertztracer(server/client 全量能力)
- trace_id 中间件见 middleware/hmw(FromRequestContext + Middleware)
完整生命周期示例 ¶
hlog.SetSilentMode(true) // 静默客户端不规范行为导致的读头错误日志(推荐生产开启)
hlog.SetLogger(hertz.NewLogger(logx.NewSlogLogger("my-http")))
b, _ := bootstrap.New(bootstrap.WithServiceName("svc")) // + nacos/obs WithXxx 按需注入
b.Run(func(app *bootstrap.App) error {
tracing := hertzotel.NewServerTracing()
h := server.New(
server.WithHostPorts(":8080"),
server.WithExitWaitTime(10*time.Second), // 排空等待上限,默认 5s
tracing.Option,
)
h.Use(tracing.Middleware)
h.Use(mw.DefaultMiddleware(mw.StackConfig{SkipPaths: []string{"/healthz"}})...)
// 健康检查 + 指标(在 RunServer 之前注册,确保端点随 server 一起就绪)
// Redis 检查器在子包 redischeck;软依赖用 health.Degraded(err) 降级
health.RegisterHealthRoutes(h, health.WithCheckers(
redischeck.NamedRedisChecker("redis", rdb),
health.NamedDBChecker("mysql", sqlDB),
))
hmetrics.InitAndRegister("my-http", h)
hertz.RunServer(app, "hertz", h)
<-app.Context().Done()
return nil
})
信号行为(对照官方 graceful-shutdown 文档) ¶
Hertz 内置信号处理(h.Run() 内的 waitSignal):
- v0.9.6+:SIGTERM/SIGINT/SIGHUP 均触发优雅退出(h.Shutdown)
- < v0.9.6:SIGTERM 立即退出;SIGINT/SIGHUP 触发优雅退出
ekit bootstrap 同时监听 SIGINT/SIGTERM,与 Hertz 内置处理并发触发。 RunServer 内部已容忍双路 Shutdown 竞态(hertz 返回 "engine is not running" 视为成功), 用户无需额外处理。
优雅退出流程(Hertz 内部,对照官方文档):
- engine 状态设为 closed
- 并发触发 OnShutdown 钩子(h.Engine.OnShutdown = append(h.Engine.OnShutdown, fn))
- 从注册中心注销
- 关闭网络库信号监听
- 进行中请求响应附带 Connection:Close 头
- netpoll:每秒检查直到 active conn = 0;go net:关闭监听
- 等待 ExitWaitTime(默认 5s)到期后退出
退出时间控制 ¶
server.WithExitWaitTime(d) — 排空等待上限(默认 5s),是官方文档的核心旋钮。 有长耗时请求时调大;与 bootstrap 的 ShutdownTimeout(单资源关闭预算)配合: bootstrap 关闭回调传入的 ctx 有 ShutdownTimeout 截断,Hertz 内部再以 ExitWaitTime 截断, 实际排空上限 = min(ShutdownTimeout, ExitWaitTime)。 保持 ExitWaitTime <= ShutdownTimeout 以确保排空不被 bootstrap 兜底截断。
与 kitex 包的差异 ¶
Hertz 使用中间件链(h.Use)而非 Suite 模式,因此不提供 ClientSuite/ServerSuite。 治理配置热更新(retry/rpc_timeout/circuit_breaker/limiter)是 Kitex RPC 框架级概念, Hertz 的对应能力由 mw.RateLimitMiddleware 等静态中间件覆盖,无需动态治理。
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AddShutdownHook ¶
AddShutdownHook 注册 Hertz 优雅退出钩子函数,等价于官方教程推荐的 h.Engine.OnShutdown = append(...) 写法,但放在 ekit hertz 包内提供 helper,避免用户在 bootstrap.Run userFn 中手拿 engine。
hertz 官方 OnShutdown 签名 func(ctx context.Context) 不接受 error, 本 helper 接受 func(ctx) error 并把 fn 返回的 error 通过 bootstrapLog 记录为 Warn 日志(hertz 调用栈会忽略 error,日志是唯一能见的位置)。
fn 在 RunServer 调用前后都可以注册(只是 append 切片,无副作用), 多个 hook 按 append 顺序执行(官方文档明确)。
⚠️ 与 RunServer 的关系:
ekit hertz.RunServer 内部用 lifecycle.App.AddResource 注册 h.Shutdown, OnShutdown hook 在 Shutdown 流程早期被调用(在 deregister 之前), 适合做"关停前刷数据/通知外部"类工作。 如果 hook 是"释放外部资源"(如关 DB),推荐直接用 lifecycle.App.AddResource + 显式 closer,语义更清晰、错误能上报 shutdown.Manager。
官方依据:https://www.cloudwego.io/zh/docs/hertz/tutorials/basic-feature/hooks/
"h.Engine.OnShutdown = append(h.Engine.OnShutdown, shutDownFunc)"
用法:
h := server.New(...)
hertz.AddShutdownHook(h, func(ctx context.Context) error {
// 关闭前的最后操作
return flushLastBatchToRemote(ctx)
})
hertz.RunServer(app, "my-svc", h)
func NewLogger ¶
func NewLogger(logger logx.Logger) hlog.FullLogger
NewLogger 将 ekit logx.Logger 适配为 Hertz hlog.FullLogger。
调用后 Hertz 框架内部日志(网络层、连接异常、路由警告等)将通过 logx 输出, 自动携带 trace_id、service name 和结构化字段。 本函数会把自身所在文件注册为 logx 内部帧(logx.SkipCallerFiles), 使经由适配器的框架日志 caller 归属真实调用方;副作用仅此一项。
使用方式:
hlog.SetLogger(hertz.NewLogger(logx.NewSlogLogger("my-http")))
⚠️ 按判据(而非函数名):**传入 `logx.IsHlogBacked(l) == true` 的 Logger 会形成 adapter → logx → hlog → adapter 的无限递归**(栈溢出 + 进程挂死), 本函数检测到即 panic 兜底(fail-fast,panic message 带实测值)。 常见触发路径:先 `hlog.SetLogger(...)` 改变了全局默认背端,随后 `logx.Default()` / `logx.WithService(...)` 取到的就是 hlog-backed 实例—— 默认背端未被改动时它们并非 hlog-backed,可以安全传入。 安全做法:`logx.IsHlogBacked(l)` 为 false 即可,或直接传 `logx.NewStdLogger(...)` / `logx.NewSlogLogger(...)`。
func RunServer ¶
RunServer 将 Hertz Server 注册到 ekit 生命周期管理(bootstrap.App 满足 lifecycle.App 接口;transport 适配层只依赖 lifecycle 契约,不依赖 bootstrap)。
该函数会:
- 通过 app.AddResource 注册 h.Shutdown 作为关闭回调(优雅关闭时自动调用)。
- 通过 app.GoBackground 在后台启动 h.Run()(阻塞直到 server 退出)。 设置 WithOnReady 时,先循环 TCP dial 探活全部 HostPort(默认超时 5s, WithReadyProbeTimeout 可调),全部可建连后执行 onReady——hertz 的 OnRun 钩子先于 listenAndServe 执行,无法用作就绪信号,故以探活近似真实就绪 (TCP 可建连 ≠ 业务健康,业务级健康门请配合 hertz/health 检查后再 Ready)。
- h.Run() 返回 error 或 panic(netpoll 传输层在监听失败如端口占用时 直接 panic 而非返回 error)时调用 app.RequestShutdown() 触发优雅关机, 避免进程无服务地"假活";探活超时同样触发关机(按启动失败处理)。
关闭语义(对照官方 graceful-shutdown 文档) ¶
信号路径:SIGTERM/SIGINT(SIGHUP 未被忽略时含之)由 h.Run() 内置 waitSignal 处理,直接触发 h.Shutdown(context.Background()),排空上限为 server.WithExitWaitTime(**默认 5s** — hertz 官方默认;未配时 netpoll 1s ticker 检 active conn / go net 立即关 listen)。同一信号也会让 bootstrap 走本函数注册的 关闭回调,第二次 Shutdown 因 engine 状态已非 running 返回 "engine is not running"——这是双路关闭的良性竞争而非故障,此处按成功处理, 避免每次信号关机都产生假错误日志。
程序化路径(userFn 返回 / RequestShutdown):走本函数注册的关闭回调, ctx 为 bootstrap 单资源预算(shutdown.New 的 defaultTimeout);hertz 内部 再以 ExitWaitTime 截断,实际排空上限 = min(两者)。需要更长排空时间时调大 server.WithExitWaitTime,并保持其小于 bootstrap 单资源预算。
⚠️ **推荐显式设置 server.WithExitWaitTime**(尤其长耗时 RPC):保持其小于 bootstrap 单资源关闭预算(shutdown.New 的 defaultTimeout),避免排空被 bootstrap 兜底截断。hertz Shutdown 接受传入 ctx 但内部还会以 ExitWaitTime 截断,二者取 min。
使用方式(在 bootstrap.Run 的 userFn 内,对称 kitex.RunServer):
b, _ := bootstrap.New(bootstrap.WithServiceName("svc")) // + nacos/obs WithXxx 按需注入
b.Run(func(app *bootstrap.App) error {
h := server.New(server.WithHostPorts(":8080"))
h.Use(mw.DefaultMiddleware(mw.StackConfig{})...)
hertz.RunServer(app, "hertz", h,
hertz.WithOnReady(func(ctx context.Context) { app.Ready() }))
<-app.Context().Done() // 阻塞直到收到 SIGINT/SIGTERM
return nil
})
⚠️ userFn 返回 = 主动关机。若 RunServer 后直接 return nil, bootstrap.Run 会立即执行 shutdown 序列,服务器启动即退出。
Types ¶
type RunServerOption ¶ added in v0.6.0
type RunServerOption func(*runServerConfig)
RunServerOption 配置 RunServer 的就绪回调行为。
func WithOnReady ¶ added in v0.6.0
func WithOnReady(fn func(ctx context.Context)) RunServerOption
WithOnReady 注册就绪回调:TCP 探活通过(全部 HostPort 可建连)后执行, 典型用途是触发延迟注册(app.Ready(),配合 bootstrap/nacos v0.3.0)。 设置本选项即默认启用 TCP 探活;未设置时行为与 v0.5.x 一致(无回调无探活)。
func WithReadyProbeTimeout ¶ added in v0.6.0
func WithReadyProbeTimeout(d time.Duration) RunServerOption
WithReadyProbeTimeout 配置探活超时(默认 5s)。设为负数禁用探活—— 直接在 GoBackground 启动前同步回调(不推荐:回调时端口可能尚未监听, hertz OnRun 钩子先于 listenAndServe 执行,无原生就绪信号可用)。
Directories
¶
| Path | Synopsis |
|---|---|
|
Package adaptor 提供 hertz-contrib/adaptor 常用 helper,让 ekit 业务 用 1 行代码把 net/http 生态(http.FileServer / embed.FS / gorilla/websocket)接入 hertz。
|
Package adaptor 提供 hertz-contrib/adaptor 常用 helper,让 ekit 业务 用 1 行代码把 net/http 生态(http.FileServer / embed.FS / gorilla/websocket)接入 hertz。 |
|
Package chainmw 把 core/chain 中间件栈接入 Hertz handler 链。
|
Package chainmw 把 core/chain 中间件栈接入 Hertz handler 链。 |
|
Package crudh 提供基于 Hertz 的通用 CRUD HTTP Handler。
|
Package crudh 提供基于 Hertz 的通用 CRUD HTTP Handler。 |
|
Package govhertz 把 governance.Store 消费成 hertz server 治理中间件 (audit 5.2 阶段 1:hertz 侧治理)。
|
Package govhertz 把 governance.Store 消费成 hertz server 治理中间件 (audit 5.2 阶段 1:hertz 侧治理)。 |
|
Package health 提供 Hertz 健康检查端点。
|
Package health 提供 Hertz 健康检查端点。 |
|
redischeck
Package redischeck 提供 Redis 健康检查器(go-redis 适配)。
|
Package redischeck 提供 Redis 健康检查器(go-redis 适配)。 |
|
Package hertzotel 提供 Hertz HTTP client/server 的 OpenTelemetry tracing 集成 helper,桥接 hertz-contrib/obs-opentelemetry/tracing。
|
Package hertzotel 提供 Hertz HTTP client/server 的 OpenTelemetry tracing 集成 helper,桥接 hertz-contrib/obs-opentelemetry/tracing。 |
|
Package hertztracer 提供 Hertz HTTP client/server 的 OpenTracing tracing 集成 helper,桥接 hertz-contrib/tracer。
|
Package hertztracer 提供 Hertz HTTP client/server 的 OpenTracing tracing 集成 helper,桥接 hertz-contrib/tracer。 |
|
Package metrics 提供 Hertz Prometheus 指标端点。
|
Package metrics 提供 Hertz Prometheus 指标端点。 |
|
Package nns 提供 nns 与 CloudWeGo Hertz 集成的适配器。
|
Package nns 提供 nns 与 CloudWeGo Hertz 集成的适配器。 |
|
Package registry 提供 ekit registry 抽象到 CloudWeGo Hertz 框架的适配器。
|
Package registry 提供 ekit registry 抽象到 CloudWeGo Hertz 框架的适配器。 |
|
Package render 提供业务特定的 hertz Render interface 实现,与 hertz 官方 render 子包(https://www.cloudwego.io/zh/docs/hertz/tutorials/basic-feature/render/) 风格一致。
|
Package render 提供业务特定的 hertz Render interface 实现,与 hertz 官方 render 子包(https://www.cloudwego.io/zh/docs/hertz/tutorials/basic-feature/render/) 风格一致。 |
|
Package sse 提供 Hertz SSE(Server-Sent Events)封装。
|
Package sse 提供 Hertz SSE(Server-Sent Events)封装。 |
|
Package transportx 把 Hertz RequestContext 适配为 core/transport 抽象。
|
Package transportx 把 Hertz RequestContext 适配为 core/transport 抽象。 |
|
Package validatorh 提供基于 Hertz 的请求参数绑定与验证。
|
Package validatorh 提供基于 Hertz 的请求参数绑定与验证。 |
|
Package versionh 提供版本信息的 HTTP Handler。
|
Package versionh 提供版本信息的 HTTP Handler。 |