You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google PubSub Emulator本地Docker部署无法列出项目订阅

解决本地Google PubSub Emulator与Java客户端交互问题

核心问题原因

Java的PubSub客户端默认会连接生产环境的pubsub.googleapis.com,且默认凭证逻辑会尝试加载生产环境认证信息,导致要么提示缺少有效API密钥,要么指向生产项目出现权限不足。要仅用本地模拟器完成交互,必须强制客户端指向模拟器端点并启用无凭证模式。

具体解决方案

方案1:代码中显式配置客户端指向模拟器

直接在构建SubscriptionAdminClient时,指定模拟器端点和无凭证:

import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
import com.google.cloud.pubsub.v1.SubscriptionAdminSettings;
import com.google.pubsub.v1.ProjectName;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import com.google.auth.oauth2.NoCredentials;

public class PubSubEmulatorDemo {
    public static void main(String[] args) throws Exception {
        // 替换为你的模拟器地址,比如localhost:8085(根据Docker映射端口调整)
        String emulatorHost = "localhost:8085";
        
        // 创建gRPC通道指向模拟器
        ManagedChannel channel = ManagedChannelBuilder.forTarget(emulatorHost)
                .usePlaintext() // 模拟器无需TLS加密
                .build();
        
        try {
            // 构建客户端配置,指定端点和无凭证
            SubscriptionAdminSettings settings = SubscriptionAdminSettings.newBuilder()
                    .setTransportChannelProvider(
                            SubscriptionAdminSettings.defaultGrpcTransportProviderBuilder()
                                    .setChannel(channel)
                                    .build())
                    .setCredentialsProvider(() -> NoCredentials.getInstance())
                    .build();
            
            // 创建客户端并执行操作
            try (SubscriptionAdminClient client = SubscriptionAdminClient.create(settings)) {
                ProjectName projectName = ProjectName.of("test-project-id"); // 模拟器不校验项目ID有效性,随便填即可
                client.listSubscriptions(projectName).iterateAll()
                        .forEach(sub -> System.out.println("订阅名称:" + sub.getName()));
            }
        } finally {
            channel.shutdown();
        }
    }
}

方案2:通过环境变量自动配置(更简便)

运行Java程序前,设置环境变量PUBSUB_EMULATOR_HOST为你的模拟器地址,客户端会自动识别并连接模拟器,无需修改代码端点配置:

  • Linux/macOS终端:
    export PUBSUB_EMULATOR_HOST=localhost:8085
    java -jar your-app.jar
    
  • Windows命令行:
    set PUBSUB_EMULATOR_HOST=localhost:8085
    java -jar your-app.jar
    
  • IDE运行配置:在程序的环境变量列表中添加PUBSUB_EMULATOR_HOST=localhost:8085

此时客户端会自动启用无凭证模式连接模拟器,不会再指向生产环境。

注意事项

  • 确保Docker映射的端口与代码/环境变量中的端口一致(比如Docker启动命令用-p 8085:8085)
  • 模拟器不校验项目ID的真实性,任意填写测试用ID即可
  • 如果仍有问题,检查是否存在GOOGLE_APPLICATION_CREDENTIALS等干扰环境变量,临时取消后再测试

内容的提问来源于stack exchange,提问作者acostache

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:25:00