Help us shape the future of Go! Take the 2026 Go Developer Survey

lifecycle

package
v0.12.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 28, 2026 License: MIT Imports: 8 Imported by: 0

Documentation

Overview

Package lifecycle 定义 transport 适配层依赖的应用生命周期契约。

抽出本接口是为了解耦 transport 适配包(hertz/kitex)与 composition root (bootstrap):transport 适配层只需要注册资源、启动后台任务和读取根 context,不应反向 import bootstrap——否则任何只想用 hertz 日志桥接的 服务都会被连带引入 bootstrap → nacos 等完整依赖树,也阻塞未来的模块拆分。

bootstrap.App 隐式满足本接口,调用方无需任何适配代码。 本包为框架无关的底层契约包,不得引入任何 transport 或注册中心依赖。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type App

type App interface {
	// Context 返回应用的根 context,可传递给后台任务;关闭时被取消。
	Context() context.Context

	// AddResource 注册需要在优雅关闭时释放的资源,
	// name 用于日志标识,closer 是关闭函数。
	AddResource(name string, closer func(ctx context.Context) error)

	// GoBackground 启动一个带 panic recovery 的后台 goroutine,
	// 关闭时通过 ctx 取消信号通知退出并等待完成。
	GoBackground(name string, fn func(ctx context.Context))

	// RequestShutdown 请求应用进入关闭流程(幂等,可安全并发调用)。
	// 取消根 context 以解除 userFn 中对 Context().Done() 的阻塞,
	// 进而触发正常优雅关闭序列(资源按注册逆序释放)。
	// 典型用途:后台任务检测到不可恢复错误(如 server 端口占用启动失败)
	// 时主动触发关机,避免进程无服务地"假活"。
	RequestShutdown()
}

App 是 transport 适配层(如 hertz.RunServer / kitex.RunServer) 所需的最小应用生命周期契约。

type Manager added in v0.6.0

type Manager struct {
	// contains filtered or unexported fields
}

Manager 管理优雅关闭的资源。

func New added in v0.6.0

func New(defaultTimeout time.Duration, opts ...ManagerOption) *Manager

New 创建一个关闭管理器。defaultTimeout 是默认的单个资源关闭超时。 可选 WithLogger 注入宿主日志;不传则使用 stdlib slog。

func (*Manager) Acquire added in v0.6.0

func (m *Manager) Acquire() bool

Acquire 请求许可(返回 false 表示正在停机)。 在处理请求前调用,成功时必须调用 Release。 使用 acqMu 保证 accept 检查与 refCount 递增的原子性, 避免与 Shutdown 之间的竞态窗口。

func (*Manager) Add added in v0.6.0

func (m *Manager) Add(name string, closer func(ctx context.Context) error, timeout time.Duration)

Add 注册一个需要在关闭时清理的资源。 timeout 传 0 使用 Manager 的默认超时。

func (*Manager) AddCloser added in v0.6.0

func (m *Manager) AddCloser(name string, closer interface{ Close() error }, timeout time.Duration)

AddCloser 注册一个 io.Closer 资源。

func (*Manager) AddTeardown added in v0.6.0

func (m *Manager) AddTeardown(fn func())

AddTeardown 注册一个无参数的清理函数(不接受 context,不返回 error)。

func (*Manager) Drain added in v0.6.0

func (m *Manager) Drain(ctx context.Context)

Drain 等待所有进行中的请求完成。 应在停止接受新请求之后、关闭资源之前调用。 使用 Acquire/Release 管理请求生命周期时,Drain 会等待所有已 Acquire 的请求 Release。

func (*Manager) Errors added in v0.6.0

func (m *Manager) Errors() []error

Errors 返回 Shutdown 过程中收集的错误:teardown 失败(含 panic)与 closer job 失败(返回 error 或 panic),按发生顺序排列。 不会触发 Shutdown;如需触发请显式调用 Shutdown。 返回的是副本,调用方修改不影响内部状态。

func (*Manager) GetRefCount added in v0.6.0

func (m *Manager) GetRefCount() int64

GetRefCount 获取当前进行中的请求数(用于监控)。

func (*Manager) IsAccepting added in v0.6.0

func (m *Manager) IsAccepting() bool

IsAccepting 是否正在接受新请求。

func (*Manager) Listen added in v0.6.0

func (m *Manager) Listen(signals ...os.Signal)

Listen 监听系统信号,收到信号后执行关闭。 会阻塞直到所有资源关闭完成或超时。

func (*Manager) Release added in v0.6.0

func (m *Manager) Release()

Release 释放请求许可。 在请求处理完成后调用。

func (*Manager) SetDrainTimeout added in v0.6.0

func (m *Manager) SetDrainTimeout(d time.Duration)

SetDrainTimeout 设置 drain 阶段等待进行中请求完成的最长时长。 该旋钮独立于 per-job 超时(New 的 defaultTimeout):>0 显式超时; 0 使用默认 30s;负数表示不自行限时,仅由 Drain 收到的 ctx 结束等待。

func (*Manager) Shutdown added in v0.6.0

func (m *Manager) Shutdown(ctx context.Context)

Shutdown 执行所有注册的清理任务。 按注册顺序依次执行;每个任务拥有独立的超时预算(从 Background 派生), 前序任务的耗时不会挤占后续任务的超时。ctx 仅作为取消信号传播到正在 执行的任务(外部取消/超时会中止当前任务),不作为任务间共享的总预算; 需要全局兜底时请为每个任务设置合理超时(Add 的 timeout 参数)。 任务 panic 被隔离为错误记录,不会中断剩余清理。 多次调用是安全的,只有第一次调用会执行清理。

type ManagerOption added in v0.6.0

type ManagerOption func(*Manager)

ManagerOption 配置 Manager 的函数选项。

func WithLogger added in v0.6.0

func WithLogger(l *slog.Logger) ManagerOption

WithLogger 注入宿主 slog.Logger:Manager 内部日志(含 job 名等结构化字段) 写入该 logger,便于与宿主日志体系统一采集、告警。 未注入时保持默认行为(stdlib slog,component=shutdown)。 传入 nil 等同未注入。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL