在 Java 版 Cloud 客户端库中配置虚拟线程

虚拟线程在 JDK 21 中正式发布,可简化高并发应用的开发。一些主要优势可能包括:

  • 更高的吞吐量,尤其是在具有阻塞型 I/O 操作的应用中。
  • 由于其轻量级特性,可实现内存优化。
  • 简单并发模型,其中应用可以采用“每个请求一个线程”的样式表示。

在将虚拟线程应用于您的应用之前,请参阅 Open JDK 文档的 JEP 444:虚拟线程,详细了解此功能的优势和限制。

本指南将逐步介绍如何在 googleapis/google-cloud-java 代码库中配置 Java 版 Cloud 客户端库以使用虚拟线程。

前提条件

请按照以下前提条件步骤操作,以便将虚拟线程与您要在应用中使用的 Java 版 Cloud 客户端库搭配使用。

  1. 如果您尚未创建 Google Cloud 项目,请创建一个。请参阅创建和管理项目
  2. 安装 Google Cloud CLI,以便您使用项目的凭据运行示例。
  3. 使用以下命令通过应用默认凭据登录。如需了解更多说明,请参阅设置应用默认凭证

    gcloud auth application-default login
    
  4. 如需确保已安装 Java 开发工具包 (JDK) 21 或更高版本,请运行 java -version 命令,并验证您是否看到以下输出。如需了解安装 JDK 的步骤,请参阅设置 Java 开发环境

    openjdk version "21.0.2" 2024-01-16 LTS
    OpenJDK Runtime Environment Temurin-21.0.2+13 (build 21.0.2+13-LTS)
    OpenJDK 64-Bit Server VM Temurin-21.0.2+13 (build 21.0.2+13-LTS, mixed mode, sharing)
    

将库导入到您的项目中

此示例使用 google-cloud-translate。如需了解如何在 Maven 或 Gradle 中使用该库,请参阅使用 Cloud Translation API Java 版

在客户端库中使用虚拟线程执行器

实例化客户端库类时,您可以选择其传输实现(gRPC 和 REST)。

REST 传输

实现 REST 传输的客户端库使用阻塞式网络 I/O 调用,这得益于虚拟线程提供的吞吐量改进。以下代码段演示了如何通过虚拟线程管理 Java 版 Cloud 客户端库中的阻塞网络 I/O 流量。您可以在自己的应用中实现此功能,方法是在 TransportChannelProvider 实例中通过虚拟线程执行程序替换默认执行程序。

import com.google.cloud.translate.*;
import java.util.concurrent.Executors;

ExecutorService virtualThreadExecutor = Executors.newVirtualThreadPerTaskExecutor();
InstantiatingHttpJsonChannelProvider httpJsonChannelProvider =
        TranslationServiceSettings.defaultHttpJsonTransportProviderBuilder()
            // Use virtual threads for network I/O calls.
            .setExecutor(virtualThreadExecutor)
            .build();

try (TranslationServiceClient client =
    TranslationServiceClient.create(
        TranslationServiceSettings.newHttpJsonBuilder()
            .setTransportChannelProvider(httpJsonChannelProvider)
            .build())) {
  // Make translate requests
}

gRPC 传输

由于 gRPC 已经使用异步逻辑来处理请求,因此虚拟线程带来的吞吐量改进可能不太明显。不过,由于其轻量级特性,它们仍然可以提供一些内存优化优势。以下代码段演示了如何通过虚拟线程管理 gRPC 传输操作。您可以在自己的应用中实现此功能,方法是在 TransportChannelProvider 实例中通过虚拟线程执行程序替换默认执行程序。

import com.google.cloud.translate.*;
import java.util.concurrent.Executors;

ExecutorService virtualThreadExecutor = Executors.newVirtualThreadPerTaskExecutor();
InstantiatingGrpcChannelProvider grpcChannelProvider =
        TranslationServiceSettings.defaultGrpcTransportProviderBuilder()
            // Use virtual threads for gRPC transport operations.
            .setExecutor(virtualThreadExecutor)
            .build();

try (TranslationServiceClient client =
        TranslationServiceClient.create(
            TranslationServiceSettings.newBuilder()
                .setTransportChannelProvider(grpcChannelProvider)
                .build())) {
  // Make translate requests
}