Gob 框架Gob 框架
主页
快速开始
使用文档
服务提供者
提供命令
Github
主页
快速开始
使用文档
服务提供者
提供命令
Github
    • 介绍
    • 安装
    • 运行
    • 目录结构
    • 服务提供者
    • 中间件
    • 命令
    • 编译
    • 调试模式
    • 环境变量
    • 版本
    • 模型
    • swagger
    • grpc支持
    • 自动部署
    • 定时
    • 辅助函数
    • 待办

目录结构

gob 框架不仅仅是一个类库,也是一个定义了开发模式和目录结构的框架。

gob 希望所有使用这个框架的开发人员遵照统一的项目结构进行开发。

默认目录结构

默认创建的项目结构为:

> tree
.
├─app               // 服务端应用地址
│  ├─console        // 存放自定义命令
│  │  └─command
│  │      └─demo
│  ├─http           // 存放http服务
│  │  ├─module      // 业务模块
│  │  │  └─demo
│  │  │     ├── api.go        // 业务模块接口
│  │  │     ├── dto.go        // 业务模块输出结构
│  │  │     ├── mapper.go     // 将服务结构转换为业务模块输出结构
│  │  │     ├── model.go      // 数据库结构定义
│  │  │     ├── repository.go // 数据库逻辑封装层
│  │  │     └── service.go    // 服务层
│  │  └─swagger     // swagger文件自动生成 
│  └─provider       // 服务提供方
│      └─demo
│          ├── contract.go  // 服务接口层
│          ├── provider.go  // 服务提供方
│          └── service.go   // 服务实现层
├─config            // 配置文件
│  ├─dev
│      ├── app.yaml         // app主应用的配置
│      ├── database.yaml    // 数据库相关配置
│      ├── deploy.yaml      // 部署相关配置
│      ├── log.yaml         // 日志相关配置
│      └── swagger.yaml     // swagger相关配置
│  ├─prod
│  └─test
├─gob_frontend      // 前端应用地址
│  └─src
│      ├─App.vue    // vue入口文件
│      ├─main.js    // 前端入口文件
│      ├─assets
│      ├─components // vue组件
│      ├─router
│      ├─stores
│      └─views
├─storage
│  ├─log            // 存放业务日志
│  ├─cache          // 存放本地缓存
│  ├─coverage       // 存放覆盖率报告
│  └─runtime        // 存放运行时文件
└─test              
    └── env.go      // 设置测试环境相关参数

这里主要介绍下业务模块的分层结构

业务模块分层

业务模块的分层设计两种分层模型:简化模型和标准模型。基本稍微复杂一些的业务,都需要使用标准模型开发。

简化模型

对于比较简单的业务,每个模块各自定义自己的 model 和 service,在一个 module 文件的文件夹中进行各自模块的业务开发

├── api.go      // 业务模块接口
├── dto.go      // 业务模块输出结构
├── mapper.go   // 将服务结构转换为业务模块输出结构
├── model.go    // 数据库结构定义
├── repository.go   // 数据库逻辑封装层
└── service.go  // 服务

具体实现可以参考初始化代码的 Demo 接口实现

标准模型

对于比较复杂的业务,模块与模块间的交互比较复杂,有很多公用性,所以提取 service provider 服务作为服务间的相互调用。

强烈建议使用这种开发模型

第一步:创建当前业务的 provider。可以使用命令行 ./gob provider new 来创建。

> ./gob provider new
create a provider
? please input provider name car
? please input provider folder(default: provider name):
create provider success, folder path: /path/app/provider/car
please remember add provider to kernel

定义好 provider 的协议

package demo

const DemoKey = "demo"

type IService interface {
	GetAllStudent() []Student
}

type Student struct {
	ID   int
	Name string
}

实现对应协议:

package demo

import "github.com/chenbihao/gob/framework"

type Service struct {
	container framework.Container
}

func NewService(params ...interface{}) (interface{}, error) {
	container := params[0].(framework.Container)
	return &Service{container: container}, nil
}

func (s *Service) GetAllStudent() []Student {
	return []Student{
		{
			ID:   1,
			Name: "foo",
		},
		{
			ID:   2,
			Name: "bar",
		},
	}
}

第二步:创建当前业务的模块。

可以按照demo文件夹中文件编写。

第三步:在当前业务中挂载业务模块。

第四步:使用 provider 来开发当前业务。

// Demo godoc
// @Summary 获取所有学生
// @Description 获取所有学生
// @Produce  json
// @Tags demo
// @Success 200 array []UserDTO
// @Router /demo/demo2 [get]
func (api *DemoApi) Demo2(c *gin.Context) {
	demoProvider := c.MustMake(demoService.DemoKey).(demoService.IService)
	students := demoProvider.GetAllStudent()
	usersDTO := StudentsToUserDTOs(students)
	c.JSON(200, usersDTO)
}

具体实现可以参考初始化代码的 Demo2 接口实现

Last Updated:
Contributors: 被水淹没, 陈壁浩
Prev
运行
Next
服务提供者