一个项目的组成 - youngperson/study-100 GitHub Wiki
项目的组成
- 路由框架(比如gin、echo、beego、yii2)
- 操作各种数据库(go-xorm、orm)
- 包的管理引用(govendor、composer)
- 配置文件/配置的管理(toml、yaconf)
- 日志的记录(zerolog、monolog)
- 从PHP转Go2个多月后体会到了语言之间的思路是相通的
- 基于上面的这些(其实就是一个base框架了),我们只需要去写我们的具体业务就好了
- 写框架的时候会用了设计模式,写出来的框架要易用、高性能、可以扩展性好
- 去读一个框架,也是需要去关注路由、操作数据库、包的管理、配置、日志怎么实现的,又是怎么串在一起协调完成工作的
学习资料
- https://github.com/avelino/awesome-go
- https://gin-gonic.github.io/gin/
- http://xorm.io/docs/
- https://github.com/rs/zerolog/
- https://github.com/BurntSushi/toml/
- https://github.com/weisd/gofront
base框架目录
[Project Name]
├── base/public 服务使用的静态资源,如定义的一些常量
├── common 服务自用的通用函数,更加通用的函数放在 common 库中
├── dao 数据抽象层,对数据的CRUD操作放这里
├── doc 服务详细的文档,包括更新修复提交等记录
├── docker Docker 相关的启动文件
├── models 数据模型,一般是从数据库生成的数据结构
├── service 业务逻辑(调度、判断、校验等等),根据情况分文件夹
├── vendor 依赖库
├── build.sh 仿真/线上构建脚本
├── conf.toml 本地测试的配置脚本
├── main.go 服务的入口文件
├── readme.md 服务简单的说明,简要说明服务功能,依赖关系等
└── api 服务 API 接口定义,根据业务/版本号分文件夹(api/user/v1)
├── api.go 接口实现
└── router.go 由组定义
流程
- 程序入口(init工作)
- API路由(拿到请求后转发,返回数据给前端,controller层)
- API路由调用相关业务的service(接收输入,判断,过滤,组合不同的dao,return数据,业务logic层)
- service调用相关业务的dao(dao只做对各种数据库的crud,输入参数做基本的判断和过滤)
- dao调用相关业务的models(数据模型,一般是从数据库生成的数据结构,model层)
- 请求 ----> controller(调度层) ----> service(业务层) ----> dao(数据访问层) ----> model
为什么要这样分层
- 从项目的可扩展性、复杂性、分层角度
- 为什么调度层不直接操作dao层
- 随着业务需求的变更,某个接口代码特别多了。都是调度层里面去调用了很多个的dao层。也有了很多数据merge的各种操作,条件判断组合也很多。这个时候需要把代码进行拆分,把1000行代码拆成5个200行的函数,但是拆分后的5个人函数放在哪呢,放调度层?放dao层?
- 引入了业务层,把这5个函数放到业务层去,在调度层去调
- 体会高内聚低耦合,调度层不需要关注怎么操作dao,调度层只需要去调业务层。我们也专门去维护service层就行,service层中组合多个dao层
建议
- go的项目,包的引入都全部放到当前项目的vendor下。不去依赖GOPATH目录下的包
- go项目vendor下的包,由于维护的不到位。经常会出现包很旧导致的报错 -> 根据错误 -> 找到是哪个包 -> 删除vendor下对应的包 -> 重新下载该包
链接