当您开始第一个项目的时候,可能对工程下面有这么多目录感觉困惑,没关系,您可以通过这个章节 工程目录设计🔥 先了解一下各个目录的作用。接下来我们会介绍一下项目是如何启动的,一个程序的启动串联了哪些目录,让大家对程序整体启动的经脉有所了解。
程序启动
main.go
所有的程序入口都是由 main.go 进入,该文件主要是调用 internal/cmd 包的对应命令引导程序启动。在项目模板中,默认会执行 internal/cmd 包的 Main 对象 Run 命令引导程序启动。
框架的核心组件均需要传递 context 上下文参数,这里使用 gctx.New 表示创建一个带链路跟踪特性的 context 上下文对象给下游链路。

引导启动
Main 对象的 Run 命令的主要作用是做引导启动,将一些动态初始化的逻辑放到 Main 的 Run 方法中。在项目模板中,默认创建一个 HTTP Server,然后通过分组路由的方式注册路由,并启动 HTTP Server。随后 HTTP Server 将会阻塞运行,它同时也会异步监听系统信号,直至收到退出信号后,它会优雅关闭连接随后退出进程。
框架的命令行管理默认采用了结构化的对象管理方式,详细介绍感兴趣请参考章节: 命令管理

路由注册
在项目模板中使用了 Group 方法创建了分组路由,框架的 HTTP Server 支持多种路由注册方式,而分组路由也是最常见的路由注册方式。
s := g.Server()
s.Group("/", func(group *ghttp.RouterGroup) {
group.Middleware(ghttp.MiddlewareHandlerResponse)
group.Bind(
controller.Hello,
)
})
在分组路由的闭包方法内部,通过 Middleware 方法注册了一个中间件,该中间件是 HTTP Server 组件用于规范化路由的数据返回。随后通过 Bind 方法的规范化路由方式绑定一个 Hello 路由对象,该路由对象下的所有公开方法均会被自动注册会路由。
详细的HTTP Server路由介绍请参考章节: 路由管理🔥
路由对象
在项目模板中的路由对象 Hello 只有一个路由 Hello,仅用于模板示例作用。关于内部路由结构体的命名比较随意,大多数场景下我们简单地带了一个小写的前缀 c 表示 controller 的缩写。

Hello 方法对应的路由信息是定义到 HelloReq 输入参数对象中的,该对象的数据结构定义如下:

这种通过统一的中间件返回统一的数据结构,统一路由对象的方法管理路由的方式,叫做规范路由。 更详细的介绍请参考章节: 路由注册-规范路由 。
阻塞运行
通过 HTTP Server 的 Run 方法启动 HTTP Server,随后 HTTP Server 将会阻塞运行接收客户端请求,并监听进程信号,用于 HTTP Server 重启/关闭。
继续了解
GoFrame 框架的 HTTP Server 带有非常多的特性,具体请参考章节: WEB服务开发