这是我参与「第三届青训营 -后端场」笔记创作活动的第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
设计流程
- 数据库,表设计
- 模型层实体类对应着表挨个设计
- 如有公共字段可单出抽离成一个结构体
- 使用匿名嵌套结构体附上
- 接口、路由设计
- 使用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()
- 公共组件的搭建
- 错误码标准化
- 配置管理和解析
- 数据库连接统一化
- 日志组件
- 返回请求的响应统一处理
- Swagger 接口文档和引入 validator 库的接口校验
模块开发
-
model 层封装对实体操作的增删改查方法
-
dao 层封装数据库操作引擎,直接使用该引擎调用 model 操作方法,并组织好结构体数据返回。
-
service 层封装 一个context上下文 和 dao 层对象, 直接调用 dao 中的方法
- 可以在这里组织 request 结构体,用于接收参数绑定和校验
- 方法需要接收 request 结构体作为参数
- context 通常是 *gin.Context 中的Request.Context()
-
创建相关错误码
-
新增路由方法
-
创建该接口的 request 结构体
-
创建响应对象
-
绑定和校验参数到request结构体中
- 错误处理:打印日志,相应错误码和错误信息,返回
-
创建 service 实例
-
调用 service 实例相关业务方法
- 错误处理
-
响应正确的信息
-