通用Restful API项目模板
欢迎使用,这是一个用Go编写的简单通用的Restful API项目,遵循SOLID原则。
部分灵感来自于 service-pattern-go
依赖
- Gin
- Gorm
- Testify (Test & Mock framework)
- Mockery (Mock generator)
- Hystrix-Go (Circuit Breaker)
开始
- 安装
- 介绍
- 目录结构
- Mocking
- Tesing
- 能力支持
安装
克隆项目代码
1 | git clone https://github.com/likakuli/generic-project-template.git |
---|
启动mysql服务并初始化数据库
1 | docker run --name=mysql -it -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d registry.cn-beijing.aliyuncs.com/likakuli/mysql |
---|
注意:如果是在MacOS上使用Docker for Mac启动的容器,则需要安装 docker-connector ,否则无法在本机通过容器IP访问容器,原因参考这里。安装命令如下
1 2 3 4 5 6 7 8 | # 安装 docker-connector brew install wenjunxiao/brew/docker-connector # 把 docker 的所有 bridge 网络都添加到路由中 docker network ls --filter driver=bridge --format "{{.ID}}" | xargs docker network inspect --format "route {{range .IPAM.Config}}{{.Subnet}}{{end}}" >> /usr/local/etc/docker-connector.conf # 启动服务 sudo brew services start docker-connector # 在 docker 端运行 wenjunxiao/mac-docker-connector,需要使用 host 网络,并且允许 NET_ADMIN docker run -it -d --restart always --net host --cap-add NET_ADMIN --name connector wenjunxiao/mac-docker-connector |
---|
镜像涉及到的Dockerfile与sql放置在docker
文件夹下
运行单元测试
1 | make test |
---|
编译程序
1 | make build |
---|
运行程序
1 2 3 4 | # 替换配置文件MySQL connectionString ./docker/replace_ip.sh # 启动程序 ./generic-project-template --config=./conf/config.toml --log_dir=./logs --v=1 |
---|
访问程序
1 | curl http://localhost:8080/api/v1/score/Lucy/vs/Lily |
---|
介绍
这是一个简单通用的Restful API项目,内置依赖注入、Mocking等功能,旨在方便快速的编写安全可靠的Restful API代码。不同的数据结构之间通过接口来访问,避免直接引用具体的实现,这样就可以实现依赖注入及采用Mock结构进行单元测试的效果。
举例来说:
IPlayerServie --> IPlayerRepository
1 2 3 4 5 6 7 | type PlayerController struct { service interfaces.IPlayerService } type playerService struct { repo interfaces.IPlayerRepository } |
---|
目录结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /cmd /- apiserver /conf /pkg /- config /- controllers /- interfaces /- models /- repositories /- server /- middlewares |- container.go |- router.go |- server.go /- services /- viewmodels |
---|
controllers
控制器文件夹下包含所有Gin Route Handler
,里面只包含处理Request
和Response
的逻辑,不包含任何业务逻辑和数据访问逻辑。仅依赖于interfaces
下的IService
接口,不依赖于具体实现。
interafces
接口文件夹下存放所有IService
和IRepository
接口定义及通过Mockery
自动生成的用于单元测试的文件,不包含具体接口实现。
models
模型文件下下存放所有与数据库映射的实体模型对应的Go Struct
,只包含数据结构,不包含数据访问逻辑。可以由 gen 根据数据库表结构自动生成,详情参考这里
repositories
仓库文件夹下存放所有数据库访问逻辑,且实现了interfaces
下定义的IRepository
接口,主要用到models
文件夹下定义的实体结构。
services
服务文件夹下存放所有实现了services
下定义的IService
接口的逻辑,供controllers
直接使用。其中涉及到的数据库访问部分均通过调用interfaces
下的IRepository
接口实现,不依赖任何具体实现。
viewmodels
视图模型文件夹下存放所有需要与API交互的实体,主要包含从API获取到的结构和返回值的结构。与models
的区别在于前者对应api层,后者对应数据库层。
router
路由文件夹下包含了所有可以对外提供服务的Restful API
的路由注册逻辑。
container
容器文件下包含了所有依赖注入需要的Provider
的逻辑,且在此选择具体使用的接口实现类型。
Mocking
为方便进行单元测试,使用Mockery
自动interfaces
下接口实现,例如生成IPlayerService的实现
,只需要进入interfaces
文件夹下执行如下命令即可,最后会在interfaces
下自动创建mocks
文件夹来存放自动生成的文件。
1 | mockery -name=IPlayerService |
---|
需要提前安装mokery
工具
Testing
有了依赖注入和Mock
功能后,就可以针对任意接口实现编写单元测试了,示例中添加了针对services
hecontrollers
的单测,供参考。
能力支持
- Tracing
- PProf
- Prometheus Metrics
- Health Check
- Mock
- Testing
- Circuit Breaker
- Rate Limit
- Common go-utils
- …