GoWind 开源生态GoWind 开源生态
首页
框架
GoWind Admin
GoWind CMS
GoWind IM
GoWind UBA
GoWind IoT
GoWind Toolkit
GoWind Quant
GitHub
首页
框架
GoWind Admin
GoWind CMS
GoWind IM
GoWind UBA
GoWind IoT
GoWind Toolkit
GoWind Quant
GitHub
  • 介绍

    • GoWind 框架
    • 框架整体架构
  • go-wind 核心

    • go-wind 核心框架
    • App 生命周期管理
    • Context 传播
    • Transport 抽象
    • Log 门面接口
  • go-wind-plugins 插件

    • go-wind-plugins 插件总览
    • 插件配置系统
    • 插件注册机制(SPI)
    • 日志适配插件
    • 传输协议插件
    • 消息中间件插件
    • 编码解码插件
    • 安全与认证插件
    • 链路追踪插件
    • 缓存插件
    • 对象存储插件(OSS)
    • 限流插件
    • 指标监控插件
    • AI 插件
    • 工作流插件
    • 数据库与缓存插件
    • Bootstrap 集成与网关插件
    • 压缩与序列化插件
    • 模板渲染与验证插件
  • go-wind-bootstrap 启动器

    • go-wind-bootstrap 声明式启动器
    • Bootstrap 配置系统
    • Bootstrap SPI 机制
    • 声明式中间件编排
    • Bootstrap CLI 工具
    • Bootstrap 实战示例
  • 教程

    • 快速入门教程
    • 自定义插件开发教程
    • 多协议同时监听教程
    • 框架迁移指南

App 生命周期管理

App 是 go-wind 的引擎核心,负责管理所有 Server 的启动、运行和优雅停止。

一、生命周期阶段

二、启动流程

func (a *App) Run(ctx context.Context) error {
    // 1. 创建带取消的 context
    ctx, cancel := context.WithCancel(ctx)
    defer cancel()

    // 2. 启动所有 Server
    for _, srv := range a.servers {
        if err := srv.Start(ctx); err != nil {
            // 启动失败,级联停止已启动的 Server
            a.stopAll(ctx)
            return err
        }
        a.logger.Info("server started", "type", srv.Type(), "endpoints", srv.Endpoint())
    }

    // 3. 等待信号或错误
    select {
    case <-a.signalCh:
        a.logger.Info("received shutdown signal")
    case <-ctx.Done():
        a.logger.Info("context cancelled")
    case err := <-a.errCh:
        a.logger.Error("server error", "err", err)
    }

    // 4. 优雅停止
    return a.stopAll(ctx)
}

三、优雅停止

3.1 逆序停止

Server 按注册的逆序停止,确保依赖关系正确:

func (a *App) stopAll(ctx context.Context) error {
    var firstErr error
    for i := len(a.servers) - 1; i >= 0; i-- {
        srv := a.servers[i]
        if err := srv.Stop(ctx); err != nil && firstErr == nil {
            firstErr = err
        }
    }
    return firstErr
}

3.2 超时控制

app := wind.New(
    wind.WithShutdownTimeout(30 * time.Second),
)

// 停止时,每个 Server 有 30 秒完成清理

四、信号处理

app := wind.New(
    wind.WithSignalHandler(),  // 自动监听 SIGTERM/SIGINT
)

// 收到信号后自动触发优雅停止
// 适用于 Docker/K8s 环境的容器生命周期管理

五、级联崩溃

任何一个 Server 发生致命错误返回时,App 会自动停止所有其他 Server:

六、多 Server 示例

func main() {
    app := wind.New(
        wind.WithName("multi-server"),
        wind.WithServer(httpServer),    // 先启动
        wind.WithServer(grpcServer),
        wind.WithServer(wsServer),      // 最后启动
        wind.WithShutdownTimeout(15*time.Second),
        wind.WithSignalHandler(),
    )

    if err := app.Run(context.Background()); err != nil {
        log.Fatal(err)
    }
}

相关文档

  • 核心框架介绍
  • Context 传播
  • Transport 抽象
  • 声明式启动器介绍
Edit this page
Last Updated:: 6/21/26, 9:28 PM
Contributors: Bobo
Prev
go-wind 核心框架
Next
Context 传播