Skip to content

第六届字节青训营项目:使用 Gin 作为web框架,MySQL 作为数据存储并使用 Gorm 操作数据库。使用Etcd作为注册中心,Grpc 进行服务之间的通信。 采用 redis 作为缓存;消息中间件 RabbitMQ

Notifications You must be signed in to change notification settings

marinezz/Tiny-TikTok

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Tiny-TikTok

Static Badge Static Badge Static Badge Static Badge Static Badge

1 项目介绍

简易抖音项目后端实现,使用 Gin 作为web框架,MySQL 作为数据存储并使用 Gorm 操作数据库。整个项目分为用户服务、视频服务、社交服务,使用 Etcd 作为注册中心,Grpc 进行服务之间的通信。 采用 Redis 作为缓存,提高读写效率;使用消息中间件 RabbitMQ,达到上游服务和下游服务的解耦。

第一部分:项目简介

第二部分:项目概览。包括整个项目的技术选择、整体设计、目录结构设计与数据库设计

第三部分:项目详细设计。包括对项目的思考以及一些关键点的设计思路

第四部分:项目测试

第五部分:启动说明。拿到整个项目,应该如何让它跑起来


2 项目概览

2.1 技术选型与设计

image

  • Gin:Web框架。高性能、轻量级、简洁,被广泛用于构建RESTful API、网站和其它HTTP服务

  • JWT:用于身份的验证和授权,具有跨平台、无状态的优点,不需要再会话中保存任何信息,减轻服务器的负担

  • Hystrix:服务熔断,防止由于单个服务的故障导致整个系统的崩溃

  • Etcd + grpc:etcd实现服务注册和服务发现,grpc负责通信,构建健壮的分布式系统

  • OSS:对象存储服务器,用于存储和管理非结构化数据,比如图片、视频等

  • FFmpeg:多媒体开源工具,本项目用于上传视频时封面的截取

  • Gorm:ORM库,用于操作数据库

  • MySQL:关系型数据库,用于存储结构化数据

  • Redis:键值存储数据库,以内存作为数据存储介质,提供高性能读写

  • RabbitMQ:消息中间件,用于程序之间传递消息,支持消息的发布和订阅,支持消息异步传递,实现解耦和异步处理


2.2 总体设计

image

  • 请求到达服务器前会对token进行校验
  • 通过Api_Router对外暴露接口,进入服务,网关微服务对其它服务进行服务熔断和服务限流
  • 各个服务先注册进入ETCD,api_router对各个服务进行调用,组装信息返回给服务端
  • api_router通过gprc实现服务之间的通讯
  • 服务操作数据库,将信息返回给上一层

2.3 项目结构设计

  • 总目录结构
├─api_router       # 路由网关
├─docs             # 项目文档
├─social_service   # 社交服务
├─user_service     # 用户服务
├─utils            # 工具函数包
└─video_service    # 视频服务

  • 路由网关
├─api_router   
│  ├─cmd  
│  ├─config       # 项目配置文件
│  ├─discovery     # 服务注册与发现
│  ├─internal
│  │  ├─handler
│  │  └─service
│  │      └─pb   
│  ├─pkg  
│  │  ├─auth
│  │  └─res
│  └─router        # 路由和中间件  
│      └─middleware

/cmd:一个项目可以有很多个组件,吧main函数所在文件夹同一放在/cmd目录下

/internal:存放私有应用代码。handler类似三层架构中的控制层,service类似服务层,路由不用操作数据库,所以没有持久层

/pkg:存放可以被外部使用的代码库。auth中存放token鉴权,res存放对服务端的统一返回


  • 具体服务
├─user_service
│  ├─cmd
│  ├─config
│  ├─discovery
│  ├─internal
│  │  ├─handler
│  │  ├─model
│  │  └─service       # 持久化层  
│  │      └─pb
│  └─pkg
│      └─encryption   # 密码加密

  • 工具函数包
├─utils  
│  ├─etcd             # etcd服务注册与发现组件
│  ├─exception		 
│  └─snowFlake        # 雪花算法生成ID

2.4 数据库设计

image

用户表:用于存储用户名称、密码、头像、背景、用户简介信息,以由雪花算法生成的分布式id作为主键(其余表的ID同理),密码由bcrypt函数进行加密。

视频表:用于存储视频的作者、标题、封面路径、视频路径、获赞数量以及评论数量,以视频作者的id关联用户表。

评论表:用于存储视频的评论信息、评论创建时间、评论状态,通过用户id以及视频id关联用户表和视频表,通过评论状态作为软删除判断当前评论是否存在。

消息表:用于存放用户发送的消息以及消息的创建时间,通过用户id关联用户表,记录消息的发生者和消息的接收者

关注表:用户存放用户的关注信息,通过用户id关联用户表获取关注者和被关注者

点赞表:用于存放视频的点赞信息,通过用户id关联用户表获取点赞的用户,视频id关联视频表获取被点赞的视频


3 详细设计

本部分包含:认证鉴权分布式唯一ID密码加密数据库操作视频上传日志打印服务熔断统一错误处理高性能读写异步解耦的设计

详细设计参考答辩文档第三部分:说明文档


4 测试

本部分包含:单元测试、接口测试(功能测试)、性能测试(压力测试)

测试详情查看测试文档:测试报告


5 启动说明

5.1 启动之前

项目启动之前,了解各个组件的版本,一直觉得版本是一个很大的问题,先搞清楚每一个组件版本,后续才能有条不紊的进行

名称 版本 作用
Go 1.19
MySQL 8.0 关系型数据库
Etcd 3.5.1 注册中心
Redis 缓存
RabbitMQ 消息中间件,异步解耦
FFmpeg 6.0 视频剪切为封面
Protoc 3.15 生成pb文件

确保每一个组件安装成功,并将ffmpeg和protoc配置进入环境变量

5.2 拉取项目

保证安装了git,直接克隆到本地

git clone https://github.com/marinezz/Tiny-TikTok.git

5.3 拉取依赖

将所有需要的依赖拉取到本地,进入每一个文件,拉取依赖。以api_router为例(其余文件操作相同):

cd api_router/
go mod tidy

5.4 启动项目

第一步:启动etcd。确保etcd注册中心启动成功。如果不放心可以下载ectdkeeper(参考网络),后续也可以参看服务是否注册进入注册中心

第二步:建立数据库。建立名为tiny_tiktok的数据库,不用建表,启动时gorm会自动建表

第三步:修改配置文件。参考配置文件example,根据自己的实际情况修改配置文件

第四步:正式启动项目。到每个文件的cmd文件中启动项目,或者使用命令 go run main.go

第五步:项目启动成功


6 总结与展望

About

第六届字节青训营项目:使用 Gin 作为web框架,MySQL 作为数据存储并使用 Gorm 操作数据库。使用Etcd作为注册中心,Grpc 进行服务之间的通信。 采用 redis 作为缓存;消息中间件 RabbitMQ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages