目录

通用Restful API项目模板

https://travis-ci.com/likakuli/generic-project-template.svg?branch=master

通用Restful API项目模板

欢迎使用,这是一个用Go编写的简单通用的Restful API项目,遵循SOLID原则。

部分灵感来自于 service-pattern-go

依赖

开始

安装

克隆项目代码

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,里面只包含处理RequestResponse的逻辑,不包含任何业务逻辑和数据访问逻辑。仅依赖于interfaces下的IService接口,不依赖于具体实现。

interafces

接口文件夹下存放所有IServiceIRepository接口定义及通过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功能后,就可以针对任意接口实现编写单元测试了,示例中添加了针对serviceshecontrollers的单测,供参考。

能力支持

  • Tracing
  • PProf
  • Prometheus Metrics
  • Health Check
  • Mock
  • Testing
  • Circuit Breaker
  • Rate Limit
  • Common go-utils