Go Web项目设计流程总结| 青训营笔记

297 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记

现如今的 web 后端中,MVC 模式逐渐演变为 CLD 模式

MVC 模式的问题

  • 前端越来越复杂,引申出工程化前端的概念
    • 前端交互越来越复杂,MVC 不再适用前后端分离模式
    • 前端的展示不再是确定的某一端,无法通过后端渲染的方式实现
  • 前端交互越来越复杂,MVC 不再适用前后端分离模式
  • 前端的展示不再是确定的某一端,无法通过后端渲染的方式实现
  • 前后端分离只通过 JSON 数据交互,View 完全被抽离出来
  • Controller 只负责路由的处理
  • Model 的数据交互,业务逻辑越来越复杂

CLD 模式

  • C:Controller,服务的入口,只负责处理路由、参数校验、请求转发
  • L:Logic/Service,逻辑(服务)层,负责处理业务逻辑
  • D:DAO/Repository,负责数据和存储相关

项目结构

project
|--configs #配置文件
|--docs   #文档
|--global   #全局变量
|--internal  #内部业务模块
|--|--routers   #路由逻辑,处理接口的真正函数
|--|--middleware   #中间件层
|--|--service   #业务逻辑层,调用dao层封装核心业务
|--|--dao   #数据访问层,数据库操作
|--|--model     #实体模型层,数据表结构对应
|--pkg      #项目相关模块包,项目中用到的内部小功能模块
|--storage  #项目生成的临时存储的文件
|--(scripts)#构建、安装、分析等操作脚本
|--(third_part) #第三方资源工具,如 swaggerUI

设计流程

  1. 数据库,表设计
  2. 模型层实体类对应着表挨个设计
  • 如有公共字段可单出抽离成一个结构体
  • 使用匿名嵌套结构体附上
  1. 接口、路由设计
  • 使用RESTful风格设计接口,路由分组处理,分版本
  • 自定义http.Server,可以设置更多服务器参数
  • 使用自定义的路由方式:路由相关处理都在NewRouter函数中
    	r := routers.NewRouter()
    	s := &http.Server{
    		Addr:           ":8080",
    		Handler:        r,
    		ReadTimeout:    10 * time.Second,
    		WriteTimeout:   10 * time.Second,
    		MaxHeaderBytes: 1 << 20,
    	}
    	s.ListenAndServe()
    
  1. 公共组件的搭建
  • 错误码标准化
  • 配置管理和解析
  • 数据库连接统一化
  • 日志组件
  • 返回请求的响应统一处理
  1. Swagger 接口文档和引入 validator 库的接口校验

模块开发

  • model 层封装对实体操作的增删改查方法

  • dao 层封装数据库操作引擎,直接使用该引擎调用 model 操作方法,并组织好结构体数据返回。

  • service 层封装 一个context上下文 和 dao 层对象, 直接调用 dao 中的方法

    • 可以在这里组织 request 结构体,用于接收参数绑定和校验
    • 方法需要接收 request 结构体作为参数
    • context 通常是 *gin.Context 中的Request.Context()
  • 创建相关错误码

  • 新增路由方法

    1. 创建该接口的 request 结构体

    2. 创建响应对象

    3. 绑定和校验参数到request结构体中

      • 错误处理:打印日志,相应错误码和错误信息,返回
    4. 创建 service 实例

    5. 调用 service 实例相关业务方法

      • 错误处理
    6. 响应正确的信息