Dtpark's blog 磨刀不误砍柴工,读完硕士再打工

抖音项目笔记——Gin 的模块拆分 | 青训营笔记

2022-06-13
 

一、背景

看大家提交的抖音项目不论使用单体架构还是微服务架构,都使用了 Gin 框架 (赫兹开源晚了🤏)。因为 Gin 框架不自带模块拆分,为了便于阅读和扩展,一般要对 web 框架各模块进行拆分。本文分享一下笔者所在小组的拆分方法。

二、各模块调用关系

UML 图-2.jpg

本项目使用的是微服务架构,故视图层直接调用微服务,若是单体应用则微服务部分替换为逻辑层与数据层。

三、目录结构

.
├── handlers                            # 各 API 的 handler
│   ├── comment_action.go               # 评论操作(评论/删除评论)
│   ├── comment_list.go                 # 获取评论列表
│   ├── common.go                       # 各 handler 需要使用的公共代码
│   ├── favorite_action.go              # 点赞/取消点赞
│   ├── favorite_video_list.go          # 喜欢列表
│   ├── feed.go                         # 视频流
│   ├── login.go                        # 登录
│   ├── register.go                     # 注册
│   ├── relation_action.go              # 关注/取消关注
│   ├── relation_follow_list.go         # 关注列表
│   ├── relation_follower_list.go       # 粉丝列表
│   ├── user_info.go                    # 用户信息
│   ├── video_list.go                   # 发布列表
│   └── video_publish.go                # 发布视频
├── main.go
├── middleware                          # 中间件
│   └── auth                            # 鉴权中间件
│       ├── auth.go                     # 继承 appleboy/gin-jwt 插件
│       ├── config.go                   # 实例化 jwt 时的配置
│       ├── form_auth.go                # 针对 gin-jwt 无法获取 form-data 中 token 做的扩展
│       └── select.go                   # 对 登录/未登录 用户视频流分别处理对中间件
├── router                              # 路由
│   └── router.go
├── rpc                                 # 封装其他微服务的 client 接口
│   ├── comment.go
│   ├── favorite.go
│   ├── init.go
│   ├── relation.go
│   ├── user.go
│   └── video.go
├── run.sh                              # 启动脚本
└── utils                               # 工具函数
    ├── upload.go                       # 上传视频方法
    └── validate_file.go                # 验证待上传文件类型&生成新的文件名

若为单体应用则 rpc 目录替换为 service 与 dao

四、main 文件

func Init() {
   tracer.InitJaeger(constants.APIServiceName)
   rpc.InitRPC()
}

func main() {
   r := gin.New()
   // 各种模块的初始化
   Init()
   // 注册路由
   router.Router(r)
   // 监听并启动
   if err := http.ListenAndServe(":8080", r); err != nil {
      klog.Fatal(err)
   }
}

其他文件见文末代码仓库:cmd/api/


看到这儿了都,可以求个 star 吗,23333: github.com/ByteDanceCa…


Similar Posts

Comments