青训营抖音项目开发记录 | 青训营笔记

231 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记。

单体服务

微服务

抖音微服务项目地址

主要使用KiteX、gin和GORM框架,在官方demo的基础上参考EasyNote项目将单体服务转换为微服务架构。根据项目接口和功能依赖关系,拆分为3个微服务和1个网关。项目中采用Docker部署MySQL数据库、OSS存储、Etcd注册中心和Redis。OSS资源由容器MinIO托管,Redis主要用于缓存用户操作。

架构关系图:架构关系图.png

数据表E-R关系图:数据表E-R关系图.png

本项目主要在Windows上使用WSL2和Docker Desktop相关虚拟机进行开发。

在项目根目录运行下列命令即可启动服务,但是由于容器启动较慢,建议等容器初始化完成再运行项目。

docker compose up -d
bash run.sh

项目IDL生成示例

kitex -module douyin-demo-micro -service user user.thrift

管理员权限运行将本机8080端口映射到WSL的8080端口

# 创建
# netsh interface portproxy add v4tov4 listenport=[win10端口] listenaddress=0.0.0.0 connectport=[虚拟机的端口] connectaddress=[虚拟机的ip]
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=172.24.171.176
# 删除
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0

本项目开发期间魔改了gin-jwt库的auth_jwt.go里面的ParseToken,增加了一个从request body的form获取token的方式,为了兼容所有接口。 目前相关PR已合并,go.mod 需要手动设置依赖为 github.com/appleboy/gin-jwt/v2 v2.8.1-0.20220605135842-8f9474155532 及以上。

功能说明

  • 静态资源模式下(util.STATIC=true)视频上传后会保存到本地 public 目录中,访问时用ip:8080/static/videos/video_name,封面在static/covers/
  • OSS存储模式下(util.STATIC=false),视频和封面会托管到MinIO,需要在本地生成一次封面,需要使用docker compose up启动若干容器

测试数据

测试数据写在若干fakedata.go

基于Docker部署方案

Windows Docker因端口占用启动容器失败

问题描述: An attempt was made to access a socket in a way forbidden by its access permissions

修改Windows动态端口

下面命令的效果是限制Windows系统服务自动分配端口的范围为49152-65535,默认条件下应该是1024开始,所以经常会和一些端口冲突,比如说ECTD的端口2379(引流之术)。

netsh int ipv4 set dynamic tcp start=49152 num=16384

有缺陷的方法,不建议使用,会影响Windows和WSL DNS解析

参考博客:docker启动容器,端口被占用:An attempt was made to access a socket in a way forbidden by its access permissions

慎用!!!下面的操作会导致WSL网络出问题

实践后证明该方法有用,而且似乎关闭过一次之后就不再受限制。

# 关闭Windows NAT服务
net stop winnat
# 启动容器
docker start container_name
# 启动Windows NAT服务器
net start winnat