基于 Golang 实现的分布式云存储服务
本项目的构建初衷是想开发一个私密的家庭相册产品,随着对项目的梳理,感觉自己应该先做一个独立的云存储项目,于是有了本项目的初步规划。在立项,技术选型时,本着边学边练的精神,将自己感兴趣而没有实践过的技术运用一下,岂不美哉。于是选择了Golang,MySQL(对,你没看错,我工作用的是MongoDB),gRPC 等技术栈。
该项目计划实现的功能是:
-
账号体系
- 用户需要注册、登陆,才能上传文件
- 用户只能看到自己上传的文件
-
文件上传服务
- 用户可以自由上传文件,小文件,大文件均可
- 用户上传文件的流程应该是顺滑的,大文件需要分片上传,断电续传
- 用户上传一份已经在云端的文件,应该要做到秒传,无论这个文件是谁传上来的
- 用户上传的文件不能随意丢失,需要连接到云端OSS服务
-
文件下载服务
- 用户可以下载自己传过的文件
-
Gin
- 基于 Golang 的一个 Web 应用框架
- 底层是基于 Go 的 net/http 包
- 更好的性能和更快的路由
- 编程体验优秀。只需要引入包、定义路由、编写Handler即可开发应用
- 简单,理解了核心结构 gin.Context 即可使用 Gin 流畅编程
- 简洁,没有提供 ORM,CONFIG 等组件,把选择权留给开发者
-
MySQL
- 使用 MySQL 作为持久化数据库
- 主要存储用户账户信息,用户文件关系,文件元信息等数据
-
Redis
- 使用 Redis 作为缓存数据库
- 主要缓存在分片上传大文件时的状态信息 uploadID, chunkID, index, filesize 等
-
RabbitMQ
- 使用 RabbitMQ 作为消息队列
- 将文件异步存储至OSS
-
go-micro
- 基于 Golang 的一个插件式微服务框架
- 提供服务发现、负载均衡、同步/异步通信、服务接口等,所有组件均为 Interface,便于扩展
- 服务间传输数据格式为 protobuf,效率高,安全
- 主要组件
- Registry
- 服务发现、发现、注销、监测机制
- 服务注册中心支持 consul、etcd、zookeeper、gossip、k8s、eureka等
- Select
- 选择器提供了负载均衡,可以通过过滤方法对微服务进行过滤,并通过不同路由算法选择微服务,以及缓存等
- Transport
- 微服务间同步请求/响应通信方式,相对Go标准net包做了更高的抽象,支持更多的传输方式,如http、grpc、tcp、udp、Rabbitmq等
- Broker
- 微服务间异步发布/订阅通信方式,更好的处理分布式系统解耦问题,默认使用http方式,生产环境通常会使用消息中间件,如Kafka、RabbitMQ、NSQ等
- Codec
- 服务间消息的编解码,支持json、protobuf、bson、msgpack等,与普通编码格式不同都是支持RPC格式
- Server
- 用于启动服务,为服务命名、注册Handler、添加中间件等
- Client
- 提供微服务客户端,通过Registry、Selector、Transport、Broker实现以服务名来查找服务、负载均衡、同步通信、异步消息等
- Registry
-
Docker
- 容器化是必须的
-
Kubernetes
- 既上次搭建完K8S集群后,好久没接触过了,这次重新熟悉一下
-
Istio (TODO)
- Service Mesh 据说好像很不错
-
Kafka (TODO)
- 如果未来有日志处理需求了的话,可以考虑
-
React (TODO)
- 前端界面很丑,我得用 React Ant Design 美化一下