使用 gRPC 连接到 Cloud Storage

gRPC 是由 Google 开发的高性能开源通用 RPC 框架,可用于使用 Protocol Buffers 定义服务。您可以使用 gRPC 与 Cloud Storage 交互。gRPC 利用 Compute Engine 和 Cloud Storage 存储分区之间的直接连接,绕过 Google 前端 (GFE)。

虽然不支持直接使用 gRPC 连接到 Cloud Storage,但您可以通过以下受支持的客户端使用 gRPC 连接到 Cloud Storage:

在客户端库上启用 gRPC

C++

准备工作

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

    • gRPC 1.65.1 或更高版本。
    • C++ 客户端库版本 v2.30.0 或更高版本。
    • C++ 14 或更高版本。

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

  2. 设置身份验证

配置 C++ 客户端库

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

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

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

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

    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. 设置身份验证

更新项目以使用 BOM

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

独立 Cloud Storage

如果您独立使用 Cloud Storage 客户端库(不使用其他 Google Cloud 库),请使用 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 与其他 Google Cloud 库搭配使用

如果您将 Cloud Storage 客户端库与其他 Google Cloud 库搭配使用,请使用 Google 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 客户端检测到应用在 Google 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. 设置身份验证

创建 gRPC 客户端

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

import (
  "context"
  "fmt"
  "log"
  "time"
  "cloud.google.com/go/storage"
  )
  func main() {
      ctx := context.Background()
      // The project ID and bucket name
      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 客户端库在检测到应用在 Google 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 请求。

  • 只有在计算虚拟机和 Cloud Storage 存储分区位于同一区域时,使用 gRPC 连接到 Cloud Storage 才有望提高在 Google Cloud 上运行的分析工作负载的读取性能。我们不建议对多区域和双区域中的存储分区使用 gRPC。

  • 在仅限 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 不支持通知hmacKeysserviceAccount 方法。

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

后续步骤