调用 Google Pub/Sub gRPC API 实战指南)
grpc-java 集成 Google 认证GoogleCredentials调用 Google Pub/Sub gRPC API 实战指南【免费下载链接】grpc-javaThe Java gRPC implementation. HTTP/2 based RPC项目地址: https://gitcode.com/GitHub_Trending/gr/grpc-javagrpc-java 仓库中的example-gauth示例详见 examples/example-gauth/README.md演示了如何通过 gRPC 调用 Google 云 API以 Cloud Pub/Sub 为例并借助 Google 官方认证库的GoogleCredentials完成服务账号鉴权。本文将完整还原该示例的环境准备、GCP 侧配置、三种构建运行方式Gradle / Maven / Bazel并结合仓库源码深入讲解MoreCallCredentials与GoogleAuthLibraryCallCredentials的底层鉴权原理帮助你掌握在自有 grpc-java 项目中接入 Google OAuth2 认证的完整套路。示例概览用 gRPC 拉取 Pub/Sub Topic 列表example-gauth是一个最小可运行的命令行客户端它通过 Google Pub/Sub gRPC API。该示例覆盖了接入 Google API 时最关键的两件事建立安全的 gRPC 信道Google API 强制要求 TLS443 端口示例直接使用ManagedChannelBuilder.forAddress(pubsub.googleapis.com, 443)gRPC-Java 的信道默认即启用 SSL/TLS无需额外配置。为调用附加 Google 凭据使用GoogleCredentials来自google-auth-library-java配合 gRPC 的CallCredentials机制把 OAuth2 access token 作为请求元数据随每个 RPC 发送。示例运行后会打印类似如下的结果来自 READMEINFO: Topics list: [name: projects/xyz123/topics/Topic1 , name: projects/xyz123/topics/Topic2 ]前置条件先构建好 grpc-java该示例依赖 grpc-java 的本地产物因此需要预先构建如果使用release 版本构建时会自动从 Maven 仓库下载对应二进制无需本地编译如果使用master HEAD / SNAPSHOT 版本则必须先按照 COMPILING.md 完成本地构建其中重点包括构建环境需 JDK 8测试使用 TLS若本机没有 C 编译器、不打算修改代码生成插件可在仓库根目录创建gradle.properties并写入skipCodegentrue跳过 C 代码生成插件的编译不涉及 Android 时可以加skipAndroidtrue跳过 Android 组件构建命令为./gradlew build安装到本地 Maven 仓库使用./gradlew publishToMavenLocal。GCP 侧准备账号、项目、API、Topic 与凭据要使示例真正跑通需要在 Google Cloud 控制台或gcloud命令行完成以下 5 个步骤。原文强调该示例会产生真实的云 API 调用可能需要付费。创建或使用现有的 Google Cloud 账号。确定项目 ID使用已有项目或新建项目README 建议命名为如Google Auth Pubsub example。记下项目 ID例如xyz123。可用控制台顶部的项目下拉框或用命令查询gcloud projects list启用 Cloud Pub/Sub API如果项目尚未启用在 Pub/Sub API 页面点击Enable即可。创建若干 Topic在 GCP Pub/Sub 控制台通过 CREATE TOPIC 按钮创建例如Topic1、Topic2也可以使用 gcloud 命令gcloud pubsub topics create Topic1配置服务账号与认证凭据在非 Google 平台本地机器、自有服务器等运行示例时需要创建服务账号并下载 JSON 密钥文件在 IAM 页面为服务账号授予Project - Owner角色密钥类型选择JSON创建后浏览器会下载一个 JSON 文件将其复制到运行示例的机器上并记下路径例如/path/to/JSON/file设置环境变量指向该文件export GOOGLE_APPLICATION_CREDENTIALS/path/to/JSON/file重要提示在 Google 平台Google App Engine / Cloud Shell / Compute Engine上运行时可跳过此步平台会自动注入内置的 Google 凭据。构建与运行Gradle 方式example-gauth是 grpc-java 多模块 Gradle 工程见 examples/settings.gradle下的一个独立子项目其自身的构建配置见 examples/example-gauth/settings.gradle。构建命令在examples/example-gauth目录下执行$ ../gradlew installDistinstallDist会生成可直接运行的启动脚本build/install/example-gauth/bin/google-auth-client注意README 原文写作build/install/examples/bin/目录实际产物目录以 Gradle 输出的项目名example-gauth为准。客户端需要一个命令行参数——项目 ID其形式为projects/xyz123USAGE: GoogleAuthClient project-ID运行# Run the client ./build/install/example-gauth/bin/google-auth-client projects/xyz123如果一切配置正确客户端会打印该项目下的 Pub/Sub Topic 列表。构建与运行Maven 方式如果偏好 Maven在examples/example-gauth目录下执行$ mvn verify $ # Run the client $ mvn exec:java -Dexec.mainClassio.grpc.examples.googleAuth.GoogleAuthClient -Dexec.argsprojects/xyz123Maven 构建的依赖与插件配置见 examples/example-gauth/pom.xml其中几个关键点通过grpc-bom版本1.85.0-SNAPSHOT与仓库当前版本一致统一管理 gRPC 各模块版本实际声明了grpc-netty-shadedruntime、grpc-protobuf、grpc-stub、grpc-auth、grpc-testingtest等依赖认证相关依赖为com.google.auth:google-auth-library-oauth2-http:1.40.0Pub/Sub 的 gRPC 客户端 stub 来自com.google.api.grpc:grpc-google-cloud-pubsub-v1:0.1.24编译目标为 Java 8maven.compiler.source/target1.8并引入os-maven-plugin扩展以正确解析 protobuf 相关构件。构建与运行Bazel 方式example-gauth同样提供了 Bazel 支持构建定义见 examples/example-gauth/BUILD.bazel其中java_library目标example-gauth编译示例源码java_binary目标google-auth-client以io.grpc.examples.googleAuth.GoogleAuthClient为主类生成可执行文件运行时依赖来自 Maven 仓库的 Pub/Sub 与 google-auth 库。在examples/example-gauth目录下执行$ bazel build :google-auth-client $ # Run the client $ ../bazel-bin/google-auth-client projects/xyz123源码解读GoogleAuthClient 的认证调用链示例的核心逻辑在 GoogleAuthClient.java 中完整展示了「获取凭据 → 构造信道 → 附加凭据 → 发起 RPC」的调用链。1. 获取默认凭据并限定 Scopemain方法首先读取应用默认凭据并为其附加 OAuth scopeGoogleCredentials credentials GoogleCredentials.getApplicationDefault(); // 按 https://cloud.google.com/storage/docs/authentication#oauth-scopes 创建适当 scope credentials credentials.createScoped(Arrays.asList(https://www.googleapis.com/auth/cloud-platform));getApplicationDefault()是 Google 认证库的「应用默认凭据」机制非 Google 平台读取GOOGLE_APPLICATION_CREDENTIALS指向的服务账号 JSONGoogle 平台GCE/GKE/GAE 等自动使用元数据服务器或内置凭据——这正是 README 第 5 步注释所说的「平台自动使用内置凭据」的落地位置。createScoped(...)将凭据绑定到指定 scope本例使用cloud-platform全集Pub/Sub 属于该 scope 覆盖范围。2. 构造安全信道并附加 CallCredentialsGoogleAuthClient client new GoogleAuthClient(pubsub.googleapis.com, 443, MoreCallCredentials.from(credentials));在构造函数中public GoogleAuthClient(String host, int port, CallCredentials callCredentials) { // Google API invocation requires a secure channel. Channels are secure by default (SSL/TLS) this(ManagedChannelBuilder.forAddress(host, port).build(), callCredentials); }代码注释点明了关键约束Google API 调用必须使用安全信道而 gRPC-Java 的信道默认开启 SSL/TLS因此直接.build()即可。随后通过PublisherGrpc.newBlockingStub(channel).withCallCredentials(callCredentials)第 70 行把认证信息绑定到阻塞式 stub 上之后每个 RPC 都会自动带上凭据。3. 发起 ListTopics RPCgetTopics方法构造ListTopicsRequest设置setPageSize(10)最多返回 10 个 Topic与setProject(projectID)再调用阻塞 stub 的listTopicsresponse blockingStub.listTopics(request);RPC 失败时会捕获StatusRuntimeException并打印 gRPC 状态码e.getStatus()这是诊断认证问题如UNAUTHENTICATED的重要入口。底层原理MoreCallCredentials 如何把 GoogleCredentials 接入 gRPC从依赖上可以看到示例通过grpc-auth模块auth 模块接入认证能力。MoreCallCredentials是一个工具类定义于 MoreCallCredentials.javapublic static CallCredentials from(Credentials creds) { return new GoogleAuthLibraryCallCredentials(creds); }即把 google-auth-library 的通用Credentials包装成 gRPC 的CallCredentials。真正的实现位于 GoogleAuthLibraryCallCredentials.java其中有几个值得关注的机制强制安全信道GoogleAuthLibraryCallCredentials会检测凭据是否为GoogleCredentials类型若是包括getApplicationDefault()的返回值则要求信道安全级别达到SecurityLevel.PRIVACY_AND_INTEGRITY否则直接以Status.UNAUTHENTICATED拒绝请求源码第 100-106 行。这就是示例中必须使用默认 TLS 信道、不能用明文信道的深层原因。按调用动态取 token每次 RPC 时applyRequestMetadata会基于目标方法构造 service URIhttps://authority/serviceName见serviceUri方法然后调用creds.getRequestMetadata(uri, ...)异步获取访问凭据元数据成功后将MapString, ListString转换为 gRPCMetadata注意-bin后缀的二进制键值会被 base64 解码见toHeaders方法通过applier.apply(headers)注入请求头失败则映射为UNAUTHENTICATED可重试错误映射为UNAVAILABLE。Service Account 自动升级为 JWTJwtHelper.tryServiceAccountToJwt会在满足条件时把ServiceAccountCredentials转换成ServiceAccountJwtAccessCredentials从而对支持 JWT 直签的服务减少一次 OAuth token 交换若凭据已带 scope 或转换失败则保留原凭据走正常 OAuth2 流程。这是从源码结构中可以看出的一个性能与延迟优化点。常见问题与注意事项UNAUTHENTICATED错误通常意味着凭据缺失或无效。非 Google 平台请确认GOOGLE_APPLICATION_CREDENTIALS已指向有效的服务账号 JSON且该账号对项目拥有权限README 建议授予Project - Owner角色同时确认信道为 TLS。Google 平台上无需手动配凭据App Engine / Cloud Shell / Compute Engine 环境会自动注入凭据直接运行即可。项目 ID 参数格式命令行参数必须是projects/xyz123这种完整形式其中xyz123是gcloud projects list查到的真实项目 ID而不是项目显示名称。Topic 数量限制示例代码硬编码setPageSize(10)最多列出 10 个 Topic实际项目可按需调整。费用提醒启用 API 与调用 Pub/Sub 服务可能产生云资源费用验证完可及时清理测试 Topic 与项目。延伸阅读示例源码examples/example-gauth/src/main/java/io/grpc/examples/googleAuth/GoogleAuthClient.java认证桥接实现auth/src/main/java/io/grpc/auth/GoogleAuthLibraryCallCredentials.java 与 auth/src/main/java/io/grpc/auth/MoreCallCredentials.java构建配置examples/example-gauth/pom.xml、examples/example-gauth/BUILD.bazel本地构建说明COMPILING.md其他示例仓库 examples 目录还包含 TLS、OAuth、JWT 认证等更多配套示例如example-oauth、example-jwt-auth、example-tls可作为进一步参考。【免费下载链接】grpc-javaThe Java gRPC implementation. HTTP/2 based RPC项目地址: https://gitcode.com/GitHub_Trending/gr/grpc-java创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考