一、功能需求
1.基於golang實現分佈式文件上傳服務
2.ceph和阿里雲oss
3.支持斷點續傳和秒傳功能
4.微服務化和容器部署
二、項目使用到的技術
redis
mysql
rabbitmq
docker部署微服務
ceph分佈式存儲
阿里雲oss
三、收穫乾貨
文件分塊斷點續傳/秒傳
對象從私有云遷移到阿里雲oss的經驗
四、項目進度
4.1 系統設計和搭建框架
接口列表
接口描述 |
接口url |
文件上傳接口 |
POST /file/upload |
文件查詢接口 |
GET /file/query |
文件下載接口 |
GET /file/download |
文件刪除接口 |
POST /file/delete |
文件重命名接口 |
POST /file/update |
這塊的命令是可以進行優化的,增刪改查是對應http restful api的
定義文件元信息的結構fileMeta
文件的唯一標識是什麼?可用文件內容計算的md5值或sha1值作爲文件名
4.2 文件上傳功能
1.用戶請求是HTTP GET,則返回上傳頁面
2.用戶請求是HTTP Post,則解析form信息,生成fileMeta文件元信息
3.真實文件存儲到本地磁盤,文件元信息(如文件名稱,文件大小,文件sha1,存儲位置,更新時間等)存儲到mysql數據庫中
4.上傳成功後,http重定向到“上傳成功頁面”
4.3 文件下載功能
1.解析用戶請求中的filehash值
2.根據filehash從mysql數據庫中獲取文件元信息
3.根據文件元信息中的文件位置FileLocation,讀取文件內容返回給客戶端
3.設置http的header頭部,客戶端接收到迴應後纔會當成是文件下載(而不是數據內容)
w.Header().Set("Content-Type", "application/octect-stream")
w.Header().Set("Content-Description", "attachment;filename=\""+fm.FileName+"\"")
4.4 獲取及更新文件元信息
從mysql數據庫獲取文件元,以json形式返回給客戶端
更新文件元信息,包括更改文件名,文件大小,文件路徑
4.5 刪除文件元信息
1.從Form表單中,解析出filehash值
2.根據filehash值,獲取文件元信息
3.根據文件元信息,刪除磁盤上的真實文件
4.從mysql數據庫中刪除該文件的信息
4.6 用戶註冊和登錄功能
註冊功能
1.獲取Post請求中Form表單的用戶名和密碼
2.將密碼+固定字符串經過sha1處理,加強安全性,即使數據庫泄漏了,密碼也不會泄漏
3.將用戶名密碼以及其他信息都寫入到mysql數據庫中
登錄功能
1.解析用戶請求中Form,得到用戶名和密碼
2.將密碼和固定字符串進行sha1運算,得出加密後的密碼
3.從mysql數據庫中獲取用戶名和密碼
4.兩者對比,看是否符合