gRPC 是由 Google 开发的高性能开源通用 RPC 框架,可用于使用 Protocol Buffers 定义服务。您可以使用 gRPC 与 Cloud Storage 交互。gRPC 利用 Compute Engine 和 Cloud Storage 存储分区之间的直接连接,绕过 Google 前端 (GFE)。
虽然不支持直接使用 gRPC 连接到 Cloud Storage,但您可以通过以下受支持的客户端使用 gRPC 连接到 Cloud Storage:
- Dataproc 上的 Cloud Storage 连接器。
- Dataflow 上的 Apache Beam I/O 连接器,用于执行读取和写入请求。
- Cloud Storage C++、Go 和 Java 客户端库。如需了解如何为这些客户端库启用 gRPC,请参阅在客户端库上启用 gRPC。
在客户端库上启用 gRPC
C++
准备工作
确保您已安装以下版本:
- gRPC 1.65.1 或更高版本。
- C++ 客户端库版本 v2.30.0 或更高版本。
- C++ 14 或更高版本。
如需了解安装说明,请参阅设置 C++ 开发环境。
配置 C++ 客户端库
使用
gcs::MakeGrpcClient()
创建 gRPC 客户端:namespace gcs = google::cloud::storage; void App() { auto client = gcs::MakeGrpcClient(); // application code }
当 C++ 客户端库检测到应用在 Google Cloud 上运行时,会自动使用直接连接。
如需将 C++ 客户端库配置为使用 gRPC,请启用 Cloud Storage gRPC 客户端以更新
CMake
和Bazel
的构建系统配置。CMake
在编译时启用 Cloud Storage gRPC 客户端插件
cmake -DGOOGLE_CLOUD_CPP_ENABLE=storage_grpc [other options here]
在代码库中,将
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
准备工作
确保您已安装以下版本:
Java 客户端库:
com.google.cloud:google-cloud-storage:2.43.1
或更高版本。com.google.cloud:libraries-bom:26.48
或更高版本。
Java 8 或更高版本
如需了解安装说明,请参阅设置 Java 开发环境。
更新项目以使用 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 上运行时,会自动使用直接连接。
Go
准备工作
确保您使用 Cloud Storage Go 客户端库 1.46.0 或更高版本。
创建 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
。
为 gRPC 相关请求启用可观测性
您可以配置 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 不支持通知、hmacKeys 和 serviceAccount 方法。
Go 客户端库不支持 HTTP 专用客户端构造函数选项,例如 WithHTTPClient。