通用Restful API项目模板

2023-03-06 11:17:05 浏览数 (1)

通用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,里面只包含处理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

0 人点赞