赋予你的 Go 应用 Tigris 超能力Giving your Go apps Tigris superpowers
Tigris 是一个兼容 S3 的存储服务,直接使用 AWS SDK 无法调用其特有的高级功能。为了解决这个问题,官方专门开发了一个全新的 Go SDK。该 SDK 提供了两个版本的包:一个是可直接替代标准 S3 客户端的 storage 包,另一个是提供更高级抽象的 simplestorage 包。开发者可以借此无缝支持存储桶分叉、快照和对象重命名等独家操作。
Xe Iaso
如果你使用 Go 开发 Web 服务,并希望利用 Tigris 的高级功能(如存储桶分叉、快照和对象重命名),通常你的代码必须像这样:
func WithRename() func(*s3.Options) { return func(options *s3.Options) { options.APIOptions = append(options.APIOptions, http.AddHeaderValue("X-Tigris-Rename", "true")) }}// rename the object in the bucket_, err = client.CopyObject(ctx, &s3.CopyObjectInput{ Bucket: aws.String(bucketName), CopySource: aws.String(bucketName + "/" + keyName), Key: aws.String(targetName),}, WithRename())if err != nil { log.Fatalf("Unable to rename object. Here's why: %v", err)}使用新的 SDK,它看起来像这样:
_, err := client.RenameObject(ctx, &s3.CopyObjectInput{ Bucket: aws.String(bucketName), CopySource: aws.String(bucketName + "/" + keyName), Key: aws.String(targetName),})if err != nil { log.Fatalf("Unable to rename object. Here's why: %v", err)}Go Storage SDK 解决了这个问题。它通过两种模式为你提供了用于 Tigris 功能的专用方法:
如果你想今天就上手,请运行以下命令获取:
go get github.com/tigrisdata/storage-go@latest一款好用到让我们做了两次的 SDK
理解 Tigris 最好的方式之一就是把它看作是功能更丰富的 S3。Tigris 会为你处理全局复制,为你处理数据迁移。Tigris 还允许你创建快照、进行分叉以及一次性下载对象包。这些操作扩展了 S3,因此该 SDK 也对 S3 客户端进行了扩展。以下是你将获得的功能:
随着 Tigris 获得更多功能,我们计划直接添加更多方法。
这种模式旨在成为你现有 S3 客户端的直接替代品,让迁移变得轻而易举。当我将自己的一些项目从 AWS S3 库迁移到 storage 包时,最多只花了大约 30 秒。一切编译正常,所有功能都按预期工作,而且我还获得了所需的额外功能。绝对的共赢!
但是等等,还有更多内容
坦白说,我们本可以到此为止,但我们并没有。与此同时,我还添加了 simplestorage 包:一个全新的对象存储接口。大多数时候,你的应用程序最终只会使用一个存储桶。为什么你每次执行操作时都必须传递存储桶名称呢?来看看从 Tigris 复制文件到本地文件系统有多么简单:
client, err := simplestorage.New(ctx)if err != nil { panic(err) }obj, err := client.Get(ctx, "my/key")if err != nil { panic(err) }defer obj.Body.Close()slog.Info( "object metadata", "key", "my/key", "size", obj.Size, "content-type", obj.ContentType,)fout, err := os.Create("./var/object-data")if err != nil { panic(err) }defer fout.Close()io.Copy(fout, obj.Body)存储桶名称和凭证是从环境变量中读取的:
如果你不想更改环境变量名称,simplestorage 将使用你已经习惯的标准 AWS 配置解析流程。
分叉存储桶可以通过 For 方法来操作:
newBucket, err := client.ForkBucket("my-bucket", "my-agents-bucket")if err != nil { panic(err) }newBucketClient := client.For(newBucket.Name)// do whatever you want here这里的主要创新在于降低了认知负担,这样你就可以专注于对存储桶的操作,而不是去处理那些由 Java 类自动生成的对象存储 API 的繁琐细节。此外,你也完全可以将其与 AWS S3 或其他对象存储提供商(如 Hetzner 对象存储)一起使用:
s3Client, err := simplestorage.New(ctx, simplestorage.WithRegion("fsn1"), simplestorage.WithEndpoint("https://fsn1.your-objectstorage.com"), simplestorage.WithAccessKeypair(accessKeyID, secretAccessKey),)if err != nil { panic(err) }Tigris 的高级功能(如存储桶分叉)将无法使用(因为 Hetzner 没有实现我们对 S3 API 的扩展),但基本的对象操作完全可以正常运行。
请注意,任何对象操作函数都将使用客户端的默认存储桶,但任何存储桶操作函数都需要你明确指定存储桶的名称,以确保你操作的是正确的存储桶。
今天就开始你的 Go 之旅
如果你想亲自体验,可以通过 go get 将其安装到你的 Go 项目中:
go get github.com/tigrisdata/storage-go@latest请在 storage-go 仓库向我们提供反馈。我们希望将其打造成 Go 开发者使用 Tigris 的最佳方式,而您的反馈将使其更加完善。
准备好让你的 Go 应用如虎添翼了吗?
Go Storage SDK 为你提供对存储桶分叉、快照等功能的一流支持——相比直接进行原生 S3 调用,大幅减少了样板代码。
需要完整排版与评论请前往来源站点阅读。