编者荐语:
最有趣的开源项目,最前沿的开源技术,最一手的开源故事。
以下文章来源于Gitee星球 ,作者马建仓
网罗Gitee星球上一切好玩儿的事物
根据《2021年中国数字经济发展白皮书》统计,2020年中国数字经济规模达 39.2 万亿元,占 GDP 的 38.6% 。
伴随数字化社会的来临,数据的体量不断激增。越来越多的企业业务系统亟待驱动数据引领业务创新,进行数字化转型。
在此背景之下,云原生成为企业数字化进程的助推力。那么,在海量数据云原生场景落地的大爆发时刻,企业和开发者们应该如何把握先机?
CNCF调研报告显示,存储系统是企业云原生场景使用/部署容器面临的最主要的障碍之一。
其中,存储成为基础软件领域的重要一环。同时,在云原生的技术架构之下,存储正在被重新定义。
具体来看,企业若是要想将云原生技术落地,需要将企业应用负载从原来的虚拟化平台和云平台迁移到容器平台上。然而面对海量的数据存储,存储容器平台的存储能力面临更高要求的挑战。
基于此,被称作「混合云第一股」的 QingStore 开始了一个全新的创新。
2021年起,QingStor 牵头建立了一个厂商中立的开源存储社区—— BeyondStorage 。这是一个以厂商中立的开源存储社区,专注于提供跨云数据服务,当前社区内共有 40 多个开源项目。
这些开源项目的构建思路是建设一套统一的存储抽象层(SAL),即逻辑层,在这里能够将数据存储和 SQL 前端、事务、查询执行等进行隔离;然后再向下对接各式各样的存储服务,进而再向上为应用提供支持。
其中,在中间的接口层有一个 Golang 的实现,名为 go-storage 。这就是我们今天推荐的项目。
项目作者:BeyondStorage
开源许可证:Apache-2.0
项目简介: go-storage是一个开源的厂商中立的存储开发库。具体说,这是一个向下通过插件的方式,对接支持市场上所有主流的云存储产品和服务。项目地址:
https://gitee.com/beyondstorage/go-storage
BeyondStorage基于这个开发库,在接口层上构建了应用层,生长出了数据迁移、数据管理、FTP、FUSE等应用。
在未来,go-storage的愿景是只需一次编写,即可在任意存储服务中运行。
目前已经有 16 个稳定的服务通过了所有的 集成测试;另外还有3个公测版本的服务已实现了所需功能,但还没有通过集成测试,最后还有4个处于内测阶段的服务仍在开发中。
_ := meta.GetWorkDir() // 获取对象的工作目录
_, ok := meta.GetWriteSizeMaximum() // 获取写操作的最大尺寸
n, err := store.Read("path", w, pairs.WithOffset(1024), pairs.WithSize(2048))
n, err := store.Write("path", r, 2048)
if errors.Is(err, services.ErrObjectNotExist) {
// 对象不存在
}
length, ok := o.GetContentLength() // 获取对象的内容长度
err := store.Delete("path") // 删除对象 "路径"
for {
o, err := it.Next()
if err != nil && errors.Is(err, types.IteratorDone) {
// 列表结束
}
length, ok := o.GetContentLength() // 获取对象的内容长度
}
import (
"log"
"go.beyondstorage.io/v5/services"
"go.beyondstorage.io/v5/types"
// 添加 fs 支持
_ "go.beyondstorage.io/services/fs/v4"
// 添加 s3 支持
_ "go.beyondstorage.io/services/s3/v3"
// 添加 gcs 支持
_ "go.beyondstorage.io/services/gcs/v3"
// 添加 azblob 支持
_ "go.beyondstorage.io/services/azblob/v3"
// 更多支持,可在 BeyondStorage 下获取
_ "go.beyondstorage.io/services/xxx"
)
func main() {
// 使用连接字符串初始化 storager
store, err := services.NewStoragerFromString("s3://bucket_name/path/to/workdir")
if err != nil {
log.Fatalf("service init failed: %v", err)
}
// 将 io.Reader 中的数据写入 hello.txt
n, err := store.Write("hello.txt", r, length)
// 从 hello.txt 中读取数据到 io.Writer
n, err := store.Read("hello.txt", w)
// 检查 hello.txt 是否存在并获取其元数据
o, err := store.Stat("hello.txt")
// 使用对象的函数获取元数据
length, ok := o.GetContentLength()
// List 将创建路径下对象的迭代器
it, err := store.List("path")
for {
// 使用迭代器检索下一个对象,直到迭代完成
o, err := it.Next()
if errors.Is(err, types.IteraoorDone) {
break
}
}
// 删除 hello.txt
err = store.Delete("hello.txt")
}
听说,点完下面4个按钮,就不会碰到bug了