Skip to content

Latest commit

 

History

History
73 lines (58 loc) · 3.69 KB

README.md

File metadata and controls

73 lines (58 loc) · 3.69 KB

通用对象存储服务客户端 oss

通用对象存储服务(Object Storage Service,OSS)客户端。

  • authored by sliveryou

背景

对象存储非常适合存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,
而一个对象文件可以是任意大小,一般从几 KB 到 5T 不等。

详细概述可参考如下地址:

支持服务

  • 付费服务:

  • 免费服务:

    • 开源对象存储 MinIO 一套开源的对象存储服务,支持单机部署和分布式部署,纯内网环境的微服务架构中可搭建 MinIO 集群提供对象存储服务
    • 本地存储 Local 推荐只在纯内网环境的单体服务架构中使用,本地存储实际是将文件对象存储在指定本地文件目录下,可以使用 nginx 或 gin 框架的 Static 路由对该文件目录进行服务
    • 模拟存储 Mock 不做任何文件对象的增删改查操作,一般在测试或不需要对象存储功能时使用

设计思路

// OSS 客户端接口
type OSS interface {
	// Cloud 获取云服务商名称
	Cloud() string
	// GetURL 获取对象在 OSS 上的完整访问 URL
	GetURL(key string) string
	// GetObject 获取对象在 OSS 的存储数据
	GetObject(key string) (io.ReadCloser, error)
	// PutObject 上传对象至 OSS
	PutObject(key string, reader io.Reader) (string, error)
	// DeleteObjects 批量删除 OSS 上的对象
	DeleteObjects(keys ...string) error
	// UploadFile 上传文件至 OSS,filePath:文件路径,partSize:分块大小(字节),routines:并发数
	UploadFile(key, filePath string, partSize int64, routines int) (string, error)
	// AuthorizedUpload 授权上传至 OSS,expires:过期时间(秒)
	AuthorizedUpload(key string, expires int) (string, error)
	// GetThumbnailSuffix 获取缩略图后缀,如果只传一个值则进行等比缩放,两个值都传时会强制缩放,可能会导致图片变形
	GetThumbnailSuffix(width, height int, size int64) string
}

关于文件的需求一般是:

  1. 前端上传文件
  2. 后端接收并存储
  3. 后端返回前端可访问文件的地址或提供文件下载接口

文件托管可以是一块很大的课题,获取文件服务一般不应该由业务服务器提供,主要文件属于一种静态的数据,
由服务器来处理不免显得有些浪费资源,并且,将文件托管于对象存储服务上,在容灾、分担业务服务器压力等方面具有不少的好处。

所以,OSS 客户端的接口设计主要从对文件对象的增删改查入手:

  • 增、改:PutObject,UploadFile,AuthorizedUpload
    • PutObject 上传较小的 io.Reader 对象
    • UploadFile 上传较大的文件对象,会并发的对文件进行分块和断点续传
    • AuthorizedUpload 授权给客户端上传,不经由服务端上传,减少传输文件的 IO 并分摊服务端压力
    • 当 key 相同时相当于执行覆盖更新操作
  • 删:DeleteObjects
    • DeleteObjects 批量根据 key 进行对象删除
  • 查:GetURL,GetObject
    • GetURL 根据 key 获取对象在 OSS 上的完整访问 URL
    • GetObject 根据 key 获取对象在 OSS 的存储数据