一、背景
看大家提交的抖音项目不论使用单体架构还是微服务架构,都使用了 Gin 框架 (赫兹开源晚了🤏)。因为 Gin 框架不自带模块拆分,为了便于阅读和扩展,一般要对 web 框架各模块进行拆分。本文分享一下笔者所在小组的拆分方法。
二、各模块调用关系
本项目使用的是微服务架构,故视图层直接调用微服务,若是单体应用则微服务部分替换为逻辑层与数据层。
三、目录结构
.
├── 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…