golang访问Google Cloud API服务的客户端插件库google-cloud的使用

Golang访问Google Cloud API服务的客户端插件库google-cloud的使用

Google Cloud Go客户端库

Go语言用于Google Cloud Platform服务的软件包。

Go Reference

安装

go get cloud.google.com/go/firestore@latest # 将firestore替换为您想使用的包

注意: 其中一些软件包正在开发中,可能会偶尔做出不兼容的更改。

支持的API

有关我们所有已发布API的最新列表,请参阅我们的参考文档。

支持的Go版本

我们的库与最近两个主要Go版本兼容,这与Go编程语言遵循的策略相同。目前支持的版本是:

  • Go 1.23
  • Go 1.24

认证

默认情况下,每个客户端库将使用应用程序默认凭据(ADC)自动配置调用API端点时使用的凭据。在Google Cloud Platform环境(如Compute Engine、Kubernetes Engine或App Engine)中使用库时,无需额外的认证步骤。

client, err := storage.NewClient(ctx)

对于在其他地方运行的应用程序,例如本地开发环境,您可以使用Google Cloud CLI中的gcloud auth application-default login命令在本地文件系统中设置用户凭据。应用程序默认凭据将自动检测这些凭据。

或者,您可能需要提供凭据的显式路径。要使用服务帐户密钥文件进行身份验证,可以将GOOGLE_APPLICATION_CREDENTIALS环境变量设置为密钥文件的路径,或者以编程方式将option.WithCredentialsFile传递给所需包的NewClient函数。例如:

client, err := storage.NewClient(ctx, option.WithCredentialsFile("path/to/keyfile.json"))

您可以使用credentials包创建auth.Credentials来对认证进行更多控制。然后将option.WithAuthCredentials传递给NewClient函数:

creds, err := credentials.DetectDefault(&credentials.DetectOptions{...})
...
client, err := storage.NewClient(ctx, option.WithAuthCredentials(creds))

完整示例

以下是一个使用Google Cloud Storage的完整示例:

package main

import (
	"context"
	"fmt"
	"io"
	"log"

	"cloud.google.com/go/storage"
	"google.golang.org/api/iterator"
	"google.golang.org/api/option"
)

func main() {
	ctx := context.Background()
	
	// 使用默认凭据创建客户端
	client, err := storage.NewClient(ctx)
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}
	defer client.Close()

	// 或者使用服务帐户密钥文件
	// client, err := storage.NewClient(ctx, option.WithCredentialsFile("path/to/keyfile.json"))
	
	// 列出所有存储桶
	it := client.Buckets(ctx, "your-project-id")
	for {
		bucketAttrs, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			log.Fatalf("Failed to list buckets: %v", err)
		}
		fmt.Printf("Bucket: %v\n", bucketAttrs.Name)
	}

	// 读取存储桶中的对象
	bucketName := "your-bucket-name"
	objectName := "your-object-name"
	rc, err := client.Bucket(bucketName).Object(objectName).NewReader(ctx)
	if err != nil {
		log.Fatalf("Failed to read object: %v", err)
	}
	defer rc.Close()

	data, err := io.ReadAll(rc)
	if err != nil {
		log.Fatalf("Failed to read data: %v", err)
	}
	fmt.Printf("Object contents: %s\n", data)
}

贡献

欢迎贡献。详情请参阅贡献文档。

请注意,本项目发布时附有贡献者行为准则。参与本项目即表示您同意遵守其条款。


更多关于golang访问Google Cloud API服务的客户端插件库google-cloud的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang访问Google Cloud API服务的客户端插件库google-cloud的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用Golang访问Google Cloud API的google-cloud-go库

Google官方提供了Golang客户端库google-cloud-go,用于访问各种Google Cloud服务。下面我将介绍如何使用这个库来访问Google Cloud API服务。

安装

首先需要安装对应服务的客户端库。google-cloud-go是一个模块化库,每个Google Cloud服务都有独立的子模块。例如:

# 安装核心库
go get cloud.google.com/go

# 安装特定服务库,例如Storage
go get cloud.google.com/go/storage

认证设置

访问Google Cloud API需要认证凭证。有以下几种认证方式:

  1. 使用应用默认凭证(ADC) - 推荐方式

    import "google.golang.org/api/option"
    
    // 会自动从以下位置查找凭证:
    // 1. GOOGLE_APPLICATION_CREDENTIALS环境变量指定的文件
    // 2. ~/.config/gcloud/application_default_credentials.json
    // 3. App Engine/Cloud Run/Compute Engine等环境内置的凭证
    client, err := storage.NewClient(ctx)
    
  2. 使用服务账号密钥文件

    client, err := storage.NewClient(ctx, option.WithCredentialsFile("/path/to/service-account.json"))
    
  3. 使用API密钥 (仅适用于部分API)

    client, err := storage.NewClient(ctx, option.WithAPIKey("YOUR_API_KEY"))
    

常用服务示例

1. Cloud Storage 示例

package main

import (
	"context"
	"fmt"
	"io"
	"log"

	"cloud.google.com/go/storage"
	"google.golang.org/api/option"
)

func main() {
	ctx := context.Background()
	
	// 创建客户端
	client, err := storage.NewClient(ctx, option.WithCredentialsFile("path/to/credentials.json"))
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}
	defer client.Close()

	// 指定bucket和object
	bucketName := "your-bucket-name"
	objectName := "example.txt"
	
	// 上传文件
	wc := client.Bucket(bucketName).Object(objectName).NewWriter(ctx)
	if _, err := io.WriteString(wc, "Hello, Google Cloud Storage!"); err != nil {
		log.Fatalf("Failed to write: %v", err)
	}
	if err := wc.Close(); err != nil {
		log.Fatalf("Failed to close writer: %v", err)
	}
	fmt.Println("File uploaded successfully")

	// 下载文件
	rc, err := client.Bucket(bucketName).Object(objectName).NewReader(ctx)
	if err != nil {
		log.Fatalf("Failed to read object: %v", err)
	}
	defer rc.Close()

	data, err := io.ReadAll(rc)
	if err != nil {
		log.Fatalf("Failed to read data: %v", err)
	}
	fmt.Printf("File content: %s\n", data)
}

2. Cloud Pub/Sub 示例

package main

import (
	"context"
	"fmt"
	"log"

	"cloud.google.com/go/pubsub"
)

func main() {
	ctx := context.Background()
	
	// 创建客户端
	client, err := pubsub.NewClient(ctx, "your-project-id")
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}
	defer client.Close()

	// 创建topic
	topicName := "example-topic"
	topic := client.Topic(topicName)
	exists, err := topic.Exists(ctx)
	if err != nil {
		log.Fatalf("Failed to check topic existence: %v", err)
	}
	if !exists {
		if _, err := client.CreateTopic(ctx, topicName); err != nil {
			log.Fatalf("Failed to create topic: %v", err)
		}
	}

	// 发布消息
	result := topic.Publish(ctx, &pubsub.Message{
		Data: []byte("Hello, Pub/Sub!"),
	})
	msgID, err := result.Get(ctx)
	if err != nil {
		log.Fatalf("Failed to publish message: %v", err)
	}
	fmt.Printf("Published message with ID: %s\n", msgID)

	// 创建订阅
	subName := "example-subscription"
	sub := client.Subscription(subName)
	exists, err = sub.Exists(ctx)
	if err != nil {
		log.Fatalf("Failed to check subscription existence: %v", err)
	}
	if !exists {
		if _, err := client.CreateSubscription(ctx, subName, pubsub.SubscriptionConfig{
			Topic: topic,
		}); err != nil {
			log.Fatalf("Failed to create subscription: %v", err)
		}
	}

	// 接收消息
	err = sub.Receive(ctx, func(ctx context.Context, msg *pubsub.Message) {
		fmt.Printf("Received message: %s\n", string(msg.Data))
		msg.Ack()
	})
	if err != nil {
		log.Fatalf("Failed to receive messages: %v", err)
	}
}

3. Cloud Firestore 示例

package main

import (
	"context"
	"fmt"
	"log"

	"cloud.google.com/go/firestore"
)

type User struct {
	Name  string
	Email string
	Age   int
}

func main() {
	ctx := context.Background()
	
	// 创建客户端
	client, err := firestore.NewClient(ctx, "your-project-id")
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}
	defer client.Close()

	// 添加文档
	users := client.Collection("users")
	docRef, _, err := users.Add(ctx, User{
		Name:  "John Doe",
		Email: "john@example.com",
		Age:   30,
	})
	if err != nil {
		log.Fatalf("Failed adding document: %v", err)
	}
	fmt.Printf("Added document with ID: %s\n", docRef.ID)

	// 查询文档
	iter := users.Where("Age", ">=", 25).Documents(ctx)
	for {
		doc, err := iter.Next()
		if err != nil {
			break
		}
		var u User
		if err := doc.DataTo(&u); err != nil {
			log.Printf("Failed to parse document: %v", err)
			continue
		}
		fmt.Printf("User: %+v\n", u)
	}
}

最佳实践

  1. 重用客户端:客户端是线程安全的,应该重用而不是频繁创建和关闭
  2. 上下文管理:使用context.Context来控制请求超时和取消
  3. 错误处理:正确处理所有错误,Google Cloud API返回的错误通常包含丰富的信息
  4. 资源清理:使用defer确保客户端和资源被正确关闭
  5. 性能优化:对于批量操作,考虑使用批处理API

总结

google-cloud-go库提供了简单直观的API来访问各种Google Cloud服务。通过合理的认证设置和遵循最佳实践,您可以轻松地在Golang应用中集成Google Cloud服务。

回到顶部