返回 2026-06-08
🛠 工具 / 开源

赋予你的 Go 应用 Tigris 超能力Giving your Go apps Tigris superpowers

xeiaso.net·2026-06-09

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 功能的专用方法:

  • storage 包:封装了你现有 AWS S3 客户端的辅助方法。
  • simplestorage 包:专为 Go 应用程序重新设计的高级对象存储客户端。
  • 如果你想今天就上手,请运行以下命令获取:

    go get github.com/tigrisdata/storage-go@latest

    一款好用到让我们做了两次的 SDK

    理解 Tigris 最好的方式之一就是把它看作是功能更丰富的 S3。Tigris 会为你处理全局复制,为你处理数据迁移。Tigris 还允许你创建快照、进行分叉以及一次性下载对象包。这些操作扩展了 S3,因此该 SDK 也对 S3 客户端进行了扩展。以下是你将获得的功能:

  • BundleObjects:一次性获取一组对象。
  • CreateBucketFork:将存储桶分叉为新存储桶,以便你的代理拥有各自的沙箱环境。
  • CreateBucketSnapshot:为你的存储桶创建新的时间点快照,从而保护你的数据免遭破坏。
  • CreateSnapshotEnabledBucket:创建一个启用了分叉和快照功能的新存储桶。
  • HeadBucketForkOrSnapshot:获取存储桶的分叉或快照元数据。
  • ListBucketSnapshots:列出存储桶的所有快照,以便你可以从这些快照创建分叉。
  • RenameObject:将对象在存储桶中从一个位置重命名(移动)到另一个位置。
  • 随着 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)

    存储桶名称和凭证是从环境变量中读取的:

  • TIGRIS_STORAGE_BUCKET:要操作的默认存储桶。
  • TIGRIS_STORAGE_ACCESS_KEY_ID:你的应用程序密钥对的访问密钥 ID。
  • TIGRIS_STORAGE_SECRET_ACCESS_KEY:你的应用程序密钥对的秘密访问密钥。
  • 如果你不想更改环境变量名称,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 调用,大幅减少了样板代码。

    需要完整排版与评论请前往来源站点阅读。