这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记。
单体服务
微服务
主要使用KiteX、gin和GORM框架,在官方demo的基础上参考EasyNote项目将单体服务转换为微服务架构。根据项目接口和功能依赖关系,拆分为3个微服务和1个网关。项目中采用Docker部署MySQL数据库、OSS存储、Etcd注册中心和Redis。OSS资源由容器MinIO托管,Redis主要用于缓存用户操作。
架构关系图:
数据表E-R关系图:
本项目主要在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