使用 gRPC 连接到 Cloud Storage

gRPC 是一个由 Google 开发的高性能开源通用 RPC 框架,您可以使用它通过协议缓冲区定义服务。您可以使用 gRPC 与 Cloud Storage 进行交互。gRPC 利用 Compute Engine 实例与 Cloud Storage 存储桶之间的直接连接,绕过 Google Front End (GFE)。

您可以通过以下受支持的客户端使用 gRPC 连接到 Cloud Storage:

在客户端库中启用 gRPC

C++

准备工作

  1. 确保您已安装以下版本:

    • gRPC 1.65.1 或更高版本

    • C++ 客户端库 v2.30.0 或更高版本

    • C++ 14 或更高版本

    如需查看安装说明,请参阅设置 C++ 开发环境

  2. 设置身份验证

  3. 确保每个 Compute Engine 实例都关联了服务账号,即使该服务账号没有任何权限也是如此。此服务账号用于在应用层传输安全 (ALTS) 握手过程中代表 Compute Engine 实例,并且是直接连接所必需的。

配置 C++ 客户端库

  1. 使用 gcs::MakeGrpcClient() 创建 gRPC 客户端:

      namespace gcs = google::cloud::storage;
      void App() {
       auto client = gcs::MakeGrpcClient();
    
      // application code
    
      }
    

    C++ 客户端库在检测到应用在 Trusted Cloud by S3NS上运行时,会自动使用直接连接

  2. 如需将 C++ 客户端库配置为使用 gRPC,请启用 Cloud Storage gRPC 客户端以更新 CMake 或 Bazel 的构建系统配置。

    CMake

    1. 在编译时启用 Cloud Storage gRPC 客户端插件。

      cmake -DGOOGLE_CLOUD_CPP_ENABLE=storage_grpc [other options here]
      
    2. 在您的代码库中,对于 target_link_libraries() 命令,将 google-cloud-cpp::storage 替换为 google-cloud-cpp::storage_grpc

      例如,gRPC 的快速入门程序使用以下代码:

      add_executable(quickstart_grpc quickstart_grpc.cc)
      target_link_libraries(quickstart_grpc google-cloud-cpp::storage_grpc)
      

    Bazel

    将依赖项 @google_cloud_cpp//:storage 替换为 @google_cloud_cpp//:storage_grpc

    例如,gRPC 的快速入门程序使用以下代码:

      cc_binary(
          name = "quickstart",
          srcs = [
              "quickstart.cc",
          ],
          deps = [
              "@com_github_googleapis_google_cloud_cpp//:storage_grpc",
          ],
      )
    

Java

准备工作

  1. 确保您已安装以下版本:

    • Java 客户端库:

      • com.google.cloud:google-cloud-storage:2.43.1 或更高版本。
      • com.google.cloud:libraries-bom:26.48 或更高版本。
    • Java 8 或更高版本

    如需查看安装说明,请参阅设置 Java 开发环境

  2. 设置身份验证

  3. 确保每个 Compute Engine 实例都关联了服务账号,即使该服务账号没有任何权限也是如此。此服务账号用于在应用层传输安全 (ALTS) 握手过程中代表 Compute Engine 实例,并且是直接连接所必需的。

更新项目以使用 BOM

如需确保项目使用兼容的 Trusted Cloud by S3NS 客户端库版本,请使用 Trusted Cloud by S3NS 库物料清单 (BOM) 中指定的版本。如需更新项目以使用 BOM,请使用以下任一方法:

独立 Cloud Storage

如果您独立使用 Cloud Storage 客户端库(不使用其他Trusted Cloud by S3NS 库),请使用 Cloud Storage 客户端库专用 BOM。

Maven

pom.xml 文件的 dependencyManagement 部分中导入 BOM。

以下示例展示了如何导入 BOM 并包含 google-cloud-storage 制品。

<dependencyManagement>
  <dependencies>
  <dependency>
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage-bom</artifactId>
   <version>2.43.1</version>
   <type>pom</type>
   <scope>import</scope>
  </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage</artifactId>
  </dependency>
</dependencies>

Gradle

添加对 com.google.cloud:google-cloud-storage-bom 的平台依赖项:

implementation platform('com.google.cloud:google-cloud-storage-bom:2.43.1')
implementation 'com.google.cloud:google-cloud-storage'

Cloud Storage 与其他 Trusted Cloud 库

如果您将 Cloud Storage 客户端库与其他 Trusted Cloud 库一起使用,请使用 Trusted Cloud 客户端库 BOM。

Maven

pom.xml 文件的 dependencyManagement 部分中导入 BOM。

以下示例展示了如何导入 BOM 并包含 libraries-bom 制品。

<dependencyManagement>
  <dependencies>
  <dependency>
   <groupId>com.google.cloud</groupId>
   <artifactId>libraries-bom</artifactId>
   <version>26.48.0</version>
   <type>pom</type>
   <scope>import</scope>
  </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage</artifactId>
  </dependency>
</dependencies>

Gradle

添加对 com.google.cloud:libraries-bom 的平台依赖项:

implementation platform('com.google.cloud:libraries-bom:26.48.0')
implementation 'com.google.cloud:google-cloud-storage'

创建 gRPC 客户端

以下示例使用以 gRPC 为中心的构建器。gRPC Java 客户端在检测到应用在 Trusted Cloud上运行时,会自动使用直接连接。

// Imports the Google Cloud client library
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class QuickstartGrpcSample {
  public static void main(String... args) throws Exception {

    // Create an instance of options which will use the Google Cloud Storage gRPC API for all
    // operations
    StorageOptions options = StorageOptions.grpc().build();

    // Instantiates a client in a try-with-resource to automatically cleanup underlying resources
    try (Storage storage = options.getService()) {
      // The name for the new bucket
      String bucketName = args[0]; // "my-new-bucket";

      // Creates the new bucket using a request to the gRPC API
      Bucket bucket = storage.create(BucketInfo.of(bucketName));

      System.out.printf("Bucket %s created.%n", bucket.getName());
    }
  }
}

Go

准备工作

  1. 设置开发环境

  2. 确保您使用的是 Cloud Storage Go 客户端库 1.46.0 或更高版本。

  3. 设置身份验证

  4. 确保每个 Compute Engine 实例都关联了服务账号,即使该服务账号没有任何权限也是如此。此服务账号用于在应用层传输安全 (ALTS) 握手过程中代表 Compute Engine 实例,并且是直接连接所必需的。

创建 gRPC 客户端

如需使用该客户端,您需要在应用中调用 NewGRPCClient 构造函数,而不是 NewClient


// Sample storage-quickstart creates a Google Cloud Storage bucket using
// gRPC API.
package main

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

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

func main() {
	ctx := context.Background()

	// Use your Google Cloud Platform project ID and Cloud Storage bucket
	projectID := "project-id"
	bucketName := "bucket-name"

	// Creates a gRPC enabled client.
	client, err := storage.NewGRPCClient(ctx)
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}
	defer client.Close()

	// Creates the new bucket.
	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
	defer cancel()
	if err := client.Bucket(bucketName).Create(ctx, projectID, nil); err != nil {
		log.Fatalf("Failed to create bucket: %v", err)
	}

	fmt.Printf("Bucket %v created.\n", bucketName)
}

Go 客户端库在检测到应用在 Trusted Cloud上运行时,会自动使用直接连接。

如需了解如何使用 gRPC 客户端,请参阅 gRPC API

配置 VPC Service Controls

如果您使用虚拟私有云和受限虚拟 IP 地址 (VPC Service Controls) 来增强网络安全性,则需要更新防火墙规则以启用直接连接,以在 Compute Engine 实例和 Cloud Storage 存储桶之间实现最佳性能。

为此,请添加许可名单防火墙规则,以允许以下 CIDR 地址块在所有端口上的流量:

  • 对于 IPv4 流量:34.126.0.0/18
  • 对于 IPv6 流量:2001:4860:8040::/42

除了上述规则之外,请保留针对 199.36.153.4/30 的现有许可名单规则。

如果您对防火墙规则修改有限制,并且无法更新防火墙规则,则可以使用 storage.googleapis.com 作为 Cloud Storage 端点(而不是 google-c2p://storage.googleapis.com),从而强制流量避免直接连接。

例如,对于 C++,使用 .set<google::cloud::EndpointOption>(storage.googleapis.com) 而非 google-c2p:///storage.googleapis.com

您可以配置 Cloud Storage 客户端库,以在 Cloud Monitoring 中生成 gRPC 相关指标。gRPC 相关指标可帮助您执行以下操作:

  • 监控和优化对 Cloud Storage 发出的 gRPC 请求的性能。

  • 排查和调试问题。

  • 深入了解应用的使用情况和行为。

如需了解如何生成 gRPC 相关指标,请参阅使用客户端指标

如果您的用例不需要收集指标,您可以选择停用指标收集。如需查看相关说明,请参阅停用客户端指标

限制

  • 无法通过旧版网络发送 IPv6 请求。

  • 在仅支持 IPv4 的集群上使用以下 GKE 版本时,不支持直接连接:

    • 1.28、1.28.0-gke.100 或更高版本(直到 1.28.5-gke.1199000)
    • 1.27、1.27.4-gke.1900 或更高版本
    • 1.26、1.26.10-gke.1238000 或更高版本
    • 1.25、1.25.15-gke.1045000 或更高版本
  • gRPC 不支持 notificationshmacKeysserviceAccount 方法。

  • Go 客户端库不支持 HTTP 特有的客户端构造函数选项,例如 WithHTTPClient

排查直接连接问题

如需了解如何检查直接连接并在直接连接不可用时排查问题,请参阅直接连接

后续步骤