项目开源地址:butane123/butane-netdisk: 一个基于go-zero框架的微服务网盘系统 (github.com)
这是一个轻量级云盘微服务系统,基于go-zero实现,官网:go-zero帮助文档
butane-netdisk的开发初衷,是通过设计一个云盘系统,解决资源上传共享问题,为用户提供一个高效的资源存储平台,使用户能够更方便快捷地进行资源分享。
go-zero
Mysql
Redis
Golang 1.18
Docker-Compose
Etcd
Prometheus
、Grafana
Jaeger
COS
,官网:腾讯云COS帮助文档使用JWT Token工具,生成了接口验证Auth的token,保证用户数据传输的安全
使用Squirrel工具,在go-zero框架中简化了Sql语句的编写
使用jordan-wright写的email工具,进行邮箱验证码的发送
使用go-uuid工具,方便UUID的生成
使用ApiFox工具,生成了在根目录下的接口测试导出文件butane-netdisk.openapi.json,标准是openapi-3.0.1版本
使用Goctl-Swagger插件,可以自行生成用于接口介绍的swagger网页
butane-netdisk:.
├─common //通用工具包
│ └─utils
└─service //服务层
├─repository //中心存储池服务
│ ├─api
│ ├─filePath
│ ├─model
│ └─rpc
├─share //文件分享服务
│ ├─api
│ └─model
├─user //用户信息服务
│ ├─api
│ ├─model
│ └─rpc
└─user_repository //个人存储池服务
├─api
├─model
└─rpc
该项目的业务逻辑思想来源于当前市场上的其他主流网盘。
存储所有上传文件(注意不含文件夹)。
根据网盘存储系统的思想,文件分享保存后,不需要在中心存储池中复制一份,只需要在个人存储池复制即可,即不同个人存储池的文件共享一个中心存储池的文件。
将用户个人存储池中的文件分享等服务。
用户的信息相关等服务。
存储用户上传文件、文件夹的简单信息。
存储结构就像一颗树一样,存储的每个值可能对应是文件夹或者文件,如果是文件夹则repository_id值为空,ext是0; 如果是文件,则repository_id可以去关联中心存储池的id,ext表示文件后缀,parent_id就表示该节点的父母节点的id。
根据网盘存储系统的思想,中心存储池的文件,映射到个人存储池中对应的userId数目可能为0,也可能不止1,即拥有同一个文件的用户可能不止一个,也可能一个也没有。 但个人存储池中的文件一定在中心存储池中找得到,即一定拥有repositoryId。
fileListQuery
是指在指定的文件夹里查询文件。shareBasicSave
是指把中心存储池的文件保存到自己的存储池下。fileUpload
中的文件秒传思想就是根据文件的md5码判断该文件在中心存储池是否存在,若存在则秒传成功,不存在则继续传。感谢GetcharZp/cloud-disk: 基于go-zero实现的网盘系统作者的贡献。
本项目是作者学习golang的项目。在构造并完善该项目的过程中,还是学习到了很多内容的。
若有其他问题的欢迎指出。