当您开始第一个项目的时候,可能对工程下面有这么多目录感觉困惑,没关系,您可以通过这个章节 工程目录设计🔥 先了解一下各个目录的作用。接下来我们会介绍一下项目是如何启动的,一个程序的启动串联了哪些目录,让大家对程序整体启动的经脉有所了解。
所有的程序入口都是由main.go进入,该文件主要是调用internal/cmd包的对应命令引导程序启动。在项目模板中,默认会执行internal/cmd包的Main对象Run命令引导程序启动。
main.go
internal/cmd
Main
Run
框架的核心组件均需要传递context上下文参数,这里使用gctx.New表示创建一个带链路跟踪特性的context上下文对象给下游链路。
context
gctx.New
Main对象的Run命令的主要作用是做引导启动,将一些动态初始化的逻辑放到Main的Run方法中。在项目模板中,默认创建一个HTTP Server,然后通过分组路由的方式注册路由,并启动HTTP Server。随后HTTP Server将会阻塞运行,它同时也会异步监听系统信号,直至收到退出信号后,它会优雅关闭连接随后退出进程。
HTTP Server
框架的命令行管理默认采用了结构化的对象管理方式,详细介绍感兴趣请参考章节:命令管理
在项目模板中使用了Group方法创建了分组路由,框架的HTTP Server支持多种路由注册方式,而分组路由也是最常见的路由注册方式。
Group
s := g.Server() s.Group("/", func(group *ghttp.RouterGroup) { group.Middleware(ghttp.MiddlewareHandlerResponse) group.Bind( controller.Hello, ) })
在分组路由的闭包方法内部,通过Middleware方法注册了一个中间件,该中间件是HTTP Server组件用于规范化路由的数据返回。随后通过Bind方法的规范化路由方式绑定一个Hello路由对象,该路由对象下的所有公开方法均会被自动注册会路由。
Middleware
Bind
Hello
详细的HTTP Server路由介绍请参考章节:路由管理🔥
在项目模板中的路由对象Hello只有一个路由Hello,仅用于模板示例作用。关于内部路由结构体的命名比较随意,大多数场景下我们简单地带了一个小写的前缀c表示controller的缩写。
c
controller
Hello方法对应的路由信息是定义到HelloReq输入参数对象中的,该对象的数据结构定义如下:
HelloReq
这种通过统一的中间件返回统一的数据结构,统一路由对象的方法管理路由的方式,叫做规范路由。更详细的介绍请参考章节:路由注册-规范路由 。
通过HTTP Server的Run方法启动HTTP Server,随后HTTP Server将会阻塞运行接收客户端请求,并监听进程信号,用于HTTP Server重启/关闭。
GoFrame框架的HTTP Server带有非常多的特性,具体请参考章节:WEB服务开发
GoFrame
文档更新的很频繁呀
真正的快速开始,再也不用找半天项目启动在哪写了
@郭强,目前使用的gin,看到goframe框架比较齐全,想试用一下!现在了解中,有一个地方,比较迷糊,为什么中间加一层cmd,我们目前的直接是在main.go中注册数据库、缓存、日志初始化,然后再加载router,启动server,现在中间加一层cmd有什么特殊的意义吗?没有看明白。
我觉得这个类似于路由前缀的想法,
我觉得是为了隐藏实现细节和接收外部参数。
cmd层是所有编译后生成的命令入口,里面只包含启动的入口比如prometheus中cmd,nsq中的cmd入口
@郭强 新手请教下大佬,在写路由对象方法Hello的时候,为什么要将入参的请求参数和返回参数声明成指针的形式,一般的形式不可以吗
指针传参,不需要复制内存数据。
现在启动项目,
cmd.Main.Run(gctx.GetInitCtx()),文档是不是改下了,不是gctx.New(),本质都是做一样的事情了
错别字:随后通过Bind方法的规范化路由方式绑定一个Hello路由对象,该路由对象下的所有公开方法均会被自动注册会路由。→ 回
GoFrame很强大。不过现在不少人反应 2.X版本目录层级和代码生成很复杂,越来越JAVA化了,失去GO简洁的本义。郭大佬 可能考虑 出一个 简版,即命令什么的 加一个 参数,生成的目录和代码 象1.X版一样。
复杂不是 JAVA 的问题,世界的各类业务本身就是复杂的。Go 本身语法简洁,但是写出的业务也是复杂的呀。至于简版,你不要用 gf-cli 生成就行了,自己捏出一个目录也是可以使用的
12 Comments
秦海龙
文档更新的很频繁呀
陈文俊
真正的快速开始,再也不用找半天项目启动在哪写了
eagle
@郭强,目前使用的gin,看到goframe框架比较齐全,想试用一下!现在了解中,有一个地方,比较迷糊,为什么中间加一层cmd,我们目前的直接是在main.go中注册数据库、缓存、日志初始化,然后再加载router,启动server,现在中间加一层cmd有什么特殊的意义吗?没有看明白。
小鹿
我觉得这个类似于路由前缀的想法,
赵登睿
我觉得是为了隐藏实现细节和接收外部参数。
admin888
cmd层是所有编译后生成的命令入口,里面只包含启动的入口
比如prometheus中cmd,nsq中的cmd入口
GuoLiangJun
@郭强 新手请教下大佬,在写路由对象方法Hello的时候,为什么要将入参的请求参数和返回参数声明成指针的形式,一般的形式不可以吗
neo
指针传参,不需要复制内存数据。
牛满仓
现在启动项目,
cmd.Main.Run(gctx.GetInitCtx()),文档是不是改下了,不是gctx.New(),本质都是做一样的事情了
Pan Li
错别字:随后通过Bind方法的规范化路由方式绑定一个Hello路由对象,该路由对象下的所有公开方法均会被自动注册会路由。→ 回
ljhljhljh
GoFrame
很强大。不过现在不少人反应 2.X版本目录层级和代码生成很复杂,越来越JAVA化了,失去GO简洁的本义。郭大佬 可能考虑 出一个 简版,即命令什么的 加一个 参数,生成的目录和代码 象1.X版一样。
王仁义
复杂不是 JAVA 的问题,世界的各类业务本身就是复杂的。Go 本身语法简洁,但是写出的业务也是复杂的呀。至于简版,你不要用 gf-cli 生成就行了,自己捏出一个目录也是可以使用的