1. Gin项目大致结构
1.1. Gin 后端项目结构
本结构大体参照于项目 , 实际使用时或有不同,暂时以该个人项目为准,后续可能会更换代码风格更好的项目作为参考。不过大体上的结构类似。
结合代码使用或许更佳。
值得注意的是,由于面向人群大多为初学Gin的同学,此处结构中没有出现/internal,/pkg
等文件夹,分别代表 私有应用程序和库代码以及 外部应用程序可以使用的库代码,具体理解和使用可见[2]。将功能按照文件夹所大致区分开。并且由于笔者并未进过企业后端实习,水平仍停留在学生水平。因此可能有亿点不成熟之处还行给出建议修改。
此外企业上的Go项目大多才用微服务的kit框架详解(基于go-kit),本例专注于小型后端开发,固也有所不同吧。
Gin-demo
├── api (api层)
│ └── v1 (v1版本接口)
│ └── user.go
├── config
│ ├── example.yml (配置文件样例)
│ ├── gorm.go (gorm数据库初始化)
│ └── viper.go (viper初始化)
├── demo.log
├── demo.yml (配置文件)
├── docs (swagger文档目录)
├── global (全局对象)
│ └── global.go
├── go.mod
├── go.sum
├── logs (日志存储)
│ ├── demo.log.20220427.log
├── main.go
├── middleware (中间件层)
│ ├── auth.goo (权限验证)
│ ├── cors.go
│ └── logrus.go (logrus日志)
├── model
│ ├── database (入参结构体)
│ │ └── user.go
│ └── response (出参结构体)
│ └── user.go
├── resource (静态资源文件夹)
├── router
│ └── router.go (路由信息)
├── service (service层,为api提供Helper或数据库服务)
│ └── user.go
├── storage
│ └── initialize.go (初始化)
├── test (测试)
└── utils (工具包)
此时以当前较新版本 为准,
1.1.1. 流程大致介绍
当前端发来请求,后端通过router
来找到对应的路由,并进行必要的中间件方法调用middleware
。简单中间件auth
鉴权后,进入API,当API接口来验证(BindAndValid) 参数response
格式是否正确。在API处适当的调用service
处的方法,为API提供Helper或是数据库操作,其中不免用到model/databse
数据库对象。并返回对应处理,顺便通过中间件记录日志到logs
。
后端开始运行时
运行main.go
调用config
中的各方法来初始化路由、全局变量(global)数据库DB
、Viper(读取配置文件),记录日志。
随后简单介绍Config 中的一些用作项目初始化的函数。
Config.InitRouter
初始化路由信息,将你的路由按照特定规则放置其中即可。具体会在第五章中讲到。
Config.InitViper
主要用于读取存储一些全局信息,viper 可直接读取各种类型的配置文件,本demo用于读取YAML文件。具体简单使用方式见config/viper.go
。
此时我们读取数据库信息用以连接数据库。在demo项目根目录创建demo.yaml
格式如下。
database:
ip: '127.0.0.1' # MySQL的IP地址
port: '3306' # MySQL的端口
user: 'username' # MySQL的用户名
password: 'password' # MySQL对应用户的密码
database: 'dbname' # 使用的MySQL数据库名称
jwt:
# token 密钥,生产环境时记得修改
secret: 'demo@'
# token 过期时间 单位:秒
timeout: 3600
server:
backend_url: 'http://127.0.0.1:8081/api/v1'
使用v.Set("root_path", rootPath)
在对全局变量viper中放置root_path
, 而读取则使用dbstr := global.VP.GetString("database.ip")
来访问上述数据库中的ip信息。其余类推即可。
Config.InitMySQL
用作初始化连接远程Mysql数据库。在填写好上述信息时,正常来讲便可直接运行项目了,访问http://127.0.0.1:8000/ 可看到如下提示:
而当你需要添加其他表到数据库中时,你需要在initialize/gorm.go
中 添加其他表的信息,类似如&model.Post{},
来让gorm生成其余表项。
err = db.AutoMigrate(
&model.User{},
)