这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记
1. 数据库设计
1.1 MySQL数据库设计
- 通用字段:
| 字段 | 属性 | 备注 |
|---|---|---|
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
| deleted_at | datetime | 删除时间,软删除 |
- 表1:sys_user
| 字段 | 属性 | 备注 |
|---|---|---|
| id | integer | 用户id,主键自增,在其他表中为uid |
| name | varchar(32) | 用户名称,唯一索引 |
| password | varchar(255) | 密码 |
- 表2:sys_video
| 字段 | 属性 | 备注 |
|---|---|---|
| id | integer | 视频id,主键自增,在其他表中为vid |
| uid | integer | 用户id,普通索引 |
| play_url | varchar(255) | 视频播放地址 |
| cover_url | varchar(255) | 视频封面地址 |
| title | varchar(255) | 视频标题 |
- 表3:sys_comment
| 字段 | 属性 | 备注 |
|---|---|---|
| id | integer | 评论id,主键自增,在其他表中为cid |
| uid | integer | 用户id,普通索引 |
| vid | integer | 视频id,普通索引 |
| content | varchar(255) | 评论内容 |
1.2 Redis设计
| 描述 | key | value |
|---|---|---|
| 用户关注列表 | follow:{uid}uid为用户id | uid其中uid为被关注用户id |
| 用户粉丝列表 | fans:{uid}uid为用户id | uid其中uid为被关注用户id |
| 用户赞列表 | favorite:{uid}uid为用户id | vid其中vid为被赞视频id |
- 缓存设计
| 描述 | key | value |
|---|---|---|
| Feed流列表 | videoZset {score}score为视频的创建时间/更新时间 | 视频基本信息,因为视频不存在更新操作,直接放在里面没有问题 |
| 用户基本信息 | user:{user_id} | 数据库用户信息 |
2. 框架选择
- web框架:gin
- rpc框架:kitex
- rpc协议:protobuf
- mysql数据库orm:gorm
- redis:go-redis
- 链路追踪:jaeger
3. 分层设计
-
根据需求共分为3个微服务,api网关、user服务、video服务,其中api层提供对外的http服务,user和video通过rpc调用实现实际的业务处理
-
项目分包:模仿kitex项目中的example-demo的easy-note
-
cmd
-
网关
- config:配置文件以及读取配置到全局配置变量中
- handler:对相应的http请求进行处理以及调用相应的方法并返回相应的结果及路由注册的功能
- pkg:放一些只有本服务用得到的工具类、中间件、响应封装等
- rpc:封装调用rpc服务的方法和对响应的一些处理
- main.go:启动服务
- Makefile:生成调用桩文件的可重复使用的一些命令
- run.sh:启动服务的脚本文件
-
rpc服务
- config
- dao:数据库CRUD封装
- pack:数据库对象转化为桩文件传输的对象以及对错误的封装
- script:kitex自动生成,包含用来测试启动服务的脚本文件
- service:具体服务的实现
- handler.go:对桩service服务的实现,主要用来调用service层及将数据打包进行返回
- main.go:服务启动文件
- Makefile:生成桩文件的可重复使用的脚本代码
- build.sh:生成可执行文件的脚本
-
-
idl:protobuf定义文件
-
kitex_gen:idl生成的桩文件
-
pkg:包含一些通用的代码,如一些通用的中间件、工具包、错误封装等等
-