使用 Azure SDK for Go 进行数据平面操作

了解如何使用 go 客户端库的 Azure SDK 以编程方式与存储在 Azure 服务中的数据进行交互。 有关管理库和客户端库如何结合在一起的更高级别介绍,请参阅 Azure SDK for Go 管理库的 Overview。 本文重点介绍在资源已存在后使用的 Go 数据平面模式,并指向用于预配和配置工作的 控制平面操作 。

什么是Azure数据平面?

Azure数据平面是一组 API,用于与Azure服务中的数据进行交互,包括上传 blob、发送消息、查询数据库和检索机密。 当控制平面预配和配置资源时,数据平面是应用程序代码在运行时调用的内容。 常见的 Go 工作流是在设置或自动化过程中使用控制平面代码一次,然后将数据平面客户端保留在每天运行的应用程序路径中。

Go 语言的 Azure SDK 通过特定服务的包公开数据平面,例如 azblob、azservicebus、azeventhubs、azsecrets 和 azcosmos。 每个包都连接到已预配的资源,并遵循一致的模式:

  1. 使用 azidentity 包进行身份验证。
  2. 使用服务终结点或连接字符串创建带有类型的客户端。
  3. 在客户端上调用方法来读取、写入或处理数据。
  4. 处理分页结果和错误。

Go 数据平面操作的常见方案包括:

  • 从Blob 存储上传和下载文件
  • 使用服务总线或事件中心发送和接收消息
  • 在 Cosmos DB 中存储和查询文档
  • 从密钥保管库检索机密、密钥和证书
  • 使用 Application Insights 监视应用程序性能

身份验证

数据平面操作支持用于控制平面操作的 azidentity 包中的相同凭据类型。 所有凭据类型都实现 azcore.TokenCredential 接口,因此无需更改客户端代码即可交换它们。

数据层客户端使用服务终结点(URL 或命名空间)和凭据,而不是订阅 ID。

// Create credential that auto-discovers authentication
cred, err := azidentity.NewDefaultAzureCredential(nil)

// Blob Storage - pass the storage account URL
blobClient, err := azblob.NewClient("https://mystorageaccount.blob.core.windows.net/", cred, nil)

// Key Vault secrets - pass the vault URL
secretClient, err := azsecrets.NewClient("https://mykeyvault.vault.azure.net/", cred, nil)

// Service Bus - pass the fully qualified namespace
sbClient, err := azservicebus.NewClient("mynamespace.servicebus.windows.net", cred, nil)

某些服务还支持那些无法使用基于令牌的身份验证的环境的连接字符串。

// Connection string authentication (when token auth is not available)
client, err := azservicebus.NewClientFromConnectionString(connectionString, nil)

对于在 Azure 中运行的生产工作负荷,请使用托管标识。 对于本地开发,DefaultAzureCredential 会自动发现来自 az login、环境变量或其他来源的凭据。

有关凭据类型和最佳做法的完整指南,请参阅使用 Azure SDK for Go 和 azidentity 包的文档。

分页

许多数据平面操作返回可能很大的集合。 SDK 使用分页模式进行这些操作:

// Create a pager for listing large result sets
pager := client.NewListSecretPropertiesPager(nil)

// Iterate through pages until no more results
for pager.More() {
	page, err := pager.NextPage(ctx)
	if err != nil {
		return err
	}

	for _, item := range page.Value {
		fmt.Println(*item.ID)
	}
}

返回 *Pager 类型的方法在所有数据平面包中遵循相同的迭代模式。

有关分页和其他常见模式的更多详细信息,请参阅 Azure SDK for Go 中的常用使用模式。

错误处理

数据平面操作返回格式化错误信息,可以查看特定错误代码:

import "github.com/Azure/azure-sdk-for-go/sdk/azcore"

// Check if the error is an Azure service error with structured details
var respErr *azcore.ResponseError
if errors.As(err, &respErr) {
	fmt.Printf("Error code: %s\n", respErr.ErrorCode)
	fmt.Printf("Status code: %d\n", respErr.StatusCode)
}

常见的数据平面错误代码包括BlobNotFound、MessageLockLost和SecretNotFoundRequestEntityTooLarge。 查看每个服务的文档,了解错误代码的完整列表。

上传 Blob 示例

此示例演示生产就绪模式:使用 DefaultAzureCredential 进行身份验证,创建 Blob 客户端,设置超时时限上传数据并验证。 此模式适用于所有数据平面客户端。 交换服务终结点和客户端类型,使其适用于服务总线、事件中心、Cosmos DB 或密钥保管库。

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

func main() {
	accountURL := "https://<storage-account-name>.blob.core.windows.net/"
	containerName := "demo"
	blobName := "hello.txt"
	data := []byte("hello from Go")

	// Create credential that auto-discovers authentication
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	if err != nil {
		log.Fatalf("failed to create credential: %v", err)
	}

	// Set a timeout to prevent hanging on network issues
	ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
	defer cancel()

	// Create a client for the storage account
	client, err := azblob.NewClient(accountURL, cred, nil)
	if err != nil {
		log.Fatalf("failed to create blob client: %v", err)
	}

	// Upload data directly from a byte slice
	_, err = client.UploadBuffer(ctx, containerName, blobName, data, nil)
	if err != nil {
		log.Fatalf("failed to upload blob: %v", err)
	}

	fmt.Printf("uploaded %s to container %s\n", blobName, containerName)
}

Blob 存储

azblob 包提供对可大规模缩放对象存储服务Azure Blob 存储的数据平面访问。 此包是应用程序在运行时用来读取和写入数据的内容。 使用单独的 armstorage 控制平面包来预配存储帐户和容器。

使用它上传和下载文件和文档、列出和管理 Blob 和容器、设置元数据和内容属性、实现大型文件的并行上传以及生成数据处理管道。

go get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob

若要开始,请参阅 Quickstart:Azure Blob 存储 Go 客户端模块。

有关包文档,请参阅 azblob 包参考。

Cosmos DB

azcosmos 包提供对全局分布式多模型数据库Azure Cosmos DB的数据平面访问。 使用它生成需要任何规模的低延迟读取和写入的应用程序。

使用它可对文档执行 CRUD 操作、针对容器运行 SQL 查询、管理分区策略以高效数据访问、处理大型结果集的分页和执行多项批处理操作。

go get github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos

若要开始,请参阅 快速入门:使用 Azure SDK for Go 配合 Azure Cosmos DB NoSQL。

有关包文档,请参阅 azcosmos 包参考。

事件中心

azeventhubs 包提供对Azure 事件中心的数据平面访问,这是用于高吞吐量事件流式传输的实时数据引入服务。

使用它通过批处理发送事件以实现高效的吞吐量、使用使用者组接收和处理事件、管理分区分配和检查点、使用分区键对事件进行排序,以及生成日志引入和遥测管道。

go get github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs

若要开始,请参阅 快速入门:使用 Go 向事件中心发送事件或从事件中心接收事件。

有关包文档,请参阅 azeventhubs 包参考。

密钥库 (密钥保管库)

azsecrets、azkeys 和 azcertificates 包提供对Azure 密钥保管库的数据平面访问。 应用程序在运行时使用的这些包用于检索机密和执行加密操作。 使用单独的 armkeyvault 控制平面组件来预配置和配置保管库实例。

使用它们检索和设置机密(数据库密码、API 密钥)、创建和管理用于签名和加密的加密密钥、使用自动续订管理 TLS/SSL 证书、跟踪机密版本并实施轮换策略,以及缓存机密以减少延迟和 API 调用。

go get github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets
go get github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys
go get github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azcertificates

若要开始使用 密钥保管库,请参阅 Quickstart:Azure 密钥保管库 Go 的证书客户端库。

有关包文档,请参阅 azsecrets、azkeys 和 azcertificates 包引用。

服务总线

azservicebus 包提供对 Azure 服务总线 的数据平面访问,这是一个完全托管的消息中转站,用于可靠的异步通信。

使用它在队列上发送和接收消息,用于点到点通信、发布和订阅用于扇出模式的主题、发送一批消息以实现高效吞吐量、计划将来传递的消息,以及实现消息完成和放弃的长期轮询使用者。

go get github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus

若要开始使用 Azure 服务总线,请参阅 Quickstart:向Azure 服务总线队列发送消息并从Azure 服务总线队列接收消息(Go)。

有关包文档,请参阅 azservicebus 包参考。

Application Insights

ApplicationInsights-Go 模块提供与 Azure 应用程序 Insights 的遥测集成 - Azure的应用程序性能监视 (APM) 服务。

使用它可以跟踪自定义事件和指标、监视 API 响应时间和故障、跨服务实现分布式跟踪、使用上下文属性记录异常,以及使用采样控制遥测卷。

go get github.com/microsoft/ApplicationInsights-Go

有关服务文档,请参阅 Application Insights 概述。

后续步骤