这是我参与「第三届青训营 - 后端场」笔记创作活动的第5篇笔记
一、项目特点
-
采用RPC框架(Kitex)脚手架生成代码进行开发,基于 RPC 微服务 + Gin 提供 HTTP 服务
-
基于《接口文档在线分享- Apifox》提供的接口进行开发,使用《极简抖音App使用说明 - 青训营版 》提供的APK进行Demo测试, 功能完整实现 ,前端接口匹配良好。
-
代码结构采用 (HTTP API 层 + RPC Service 层+Dal 层) 项目 结构清晰 ,代码 符合规范
-
使用 JWT 进行用户token的校验
-
使用 ETCD 进行服务发现和服务注册;
-
使用 Minio 实现视频文件和图片的对象存储
-
使用 Gorm 对 MySQL 进行 ORM 操作;
-
使用 OpenTelemetry 实现链路跟踪;
-
数据库表建立了索引和外键约束,对于具有关联性的操作一旦出错立刻回滚,保证数据一致性和安全性
二、项目地址
三、项目说明
1. 项目模块介绍
| 服务名称 | 模块介绍 | 技术框架 | 传输协议 | 注册中心 | 链路跟踪 | 数据存储 | 日志 | 配置存取 | ||
|---|---|---|---|---|---|---|---|---|---|---|
| api | API服务将HTTP请求发送给RPC微服务端 | Gorm Kitex Gin | http | etcd | opentelemetry | 下一步计划采用Redis | zapklog | viper | ||
| user | 用户管理微服务 | Gorm Kitex Gin JWT | proto3 | MySQL gorm | ||||||
| relation | 用户关注微服务 | |||||||||
| feed | 视频流微服务 | |||||||||
| favorite | 用户点赞微服务 | |||||||||
| comment | 用户评论微服务 | |||||||||
| publish | 视频发布微服务 | MySQL gorm minio对象存储 | ||||||||
| dal | 用户管理微服务 | MySQL gorm | - | MySQL gorm |
2. 服务调用关系
3. 数据库 ER 图
4. 代码介绍
4.1 代码目录结构介绍
| 目录 | 子目录 | 说明 | 备注 |
|---|---|---|---|
| cmd | api | api 服务的 业务代码 | 包含 Gin和 RPC_client |
| comment | command 服务的业务代码 | ||
| favorite | favorite 服务的业务代码 | ||
| feed | feed 服务的业务代码 | ||
| publish | publish 服务的业务代码 | ||
| relation | relation 服务的业务代码 | ||
| user | user 服务的业务代码 | ||
| config | 微服务及 pkg 的 配置文件 | ||
| dal | db | 包含 Gorm 初始化 、Gorm 结构体及 数据库操作逻辑 | |
| pack | 将 Gorm 结构体 封装为 protobuf 结构体的 业务逻辑 | Protobuf 结构体由 Kitex自动生成 | |
| idl | proto 接口定义文件 | ||
| kitex_gen | Kitex 自动生成的代码 | ||
| pkg | dlog | 基于 klog 和 zap 封装的 Logger 及其接口 | |
| errno | 错误码 | 错误码设计逻辑:GitHub - a76yyyy/ErrnoCode: 适配于 github.com/a76yyyy/errors 错误包的错误码实现 | |
| jwt | 基于 golang-jwt的代码封装 | ||
| middleware | Kitex的中间件 | ||
| minio | Minio 对象存储初始化及代码封装 | ||
| ttviper | Viper 配置存取初始化及代码封装 |
4.2 代码运行
-
提前修改 config目录的相关配置
-
运行基础依赖
# 自行安装 docker 及 docker-compose docker-compose up -d | -
运行 user 服务
cd cmd/user sh build.sh sh output/bootstrap.sh | -
运行 comment 服务
cd cmd/comment sh build.sh sh output/bootstrap.sh | -
运行 favorite 服务
cd cmd/favorite sh build.sh sh output/bootstrap.sh | -
运行 feed 服务
cd cmd/feed sh build.sh sh output/bootstrap.sh | -
运行 publish 服务
cd cmd/publish sh build.sh sh output/bootstrap.sh | -
运行 relation 服务
cd cmd/relation sh build.sh sh output/bootstrap.sh | -
运行 api 服务
cd cmd/api chmod +x ./run.sh sh ./run.sh |
四. 下一步计划
-
目前已采用 FFmpeg-go 获取到了视频的封面图片流,但是保存为图片后显示解码错误,等待调试解决
-
编写 DockerFile 实现分布式容器部署
-
检查 自封装的 dlog 包中 callerSkip存在的问题
-
采用 Redis 作为 NoSQL 缓存,优化 JWT 鉴权,结合消息队列和 Redis 实现对定时更新 Token、各种操作数据 的缓存和持久性存储
-
使用 Jaeger 实现链路跟踪可视化