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

Cloud Run服务间gRPC调用报错:无法连接所有地址

问题分析与解决方案

核心问题:gRPC客户端与服务器的安全模式完全不匹配

你这边的helper服务跑的是非安全gRPC服务器(监听[::]:50051,无TLS加密),但backend用的是grpc.aio.secure_channel(强制TLS加密,默认连443端口),再结合Cloud Run的端口规则,直接导致连接失败:

  1. Cloud Run只对外暴露443端口,所有内部服务端口需通过PORT环境变量指定,你监听的50051端口根本没被Cloud Run的负载均衡转发
  2. 客户端用TLS加密连接443端口,但helper的gRPC服务根本没在443提供加密服务,自然连不上

修复步骤

1. 把helper改成安全gRPC服务器

修改helper代码,启用TLS加密,监听Cloud Run指定的PORT端口(默认8080),直接用容器内的系统根证书即可:

import grpc
from grpc.aio import server
import os
import ssl

# 加载Cloud Run容器内的默认SSL证书
ssl_creds = grpc.ssl_server_credentials(
    [(open('/etc/ssl/private/server.key', 'rb').read(), 
      open('/etc/ssl/certs/server.crt', 'rb').read())]
)
server = server(grpc.ThreadPoolExecutor(max_workers=10))
# 监听PORT环境变量指定的端口,Cloud Run默认8080
server.add_secure_port(f'[::]:{os.environ.get("PORT", 8080)}', ssl_creds)

注:Cloud Run会自动为服务域名配置SSL证书,容器内可直接使用系统提供的证书文件,无需手动上传。

2. 调整backend的gRPC客户端

不需要手动加载自定义证书,gRPC客户端会自动使用系统默认根证书,同时确保hostname不带https://前缀:

import grpc
from grpc.aio import secure_channel

# 使用系统默认根证书,无需手动读取文件
creds = grpc.ssl_channel_credentials()
# hostname格式:<服务名>-<哈希值>.<区域>.run.app
client_channel = secure_channel(hostname, creds)

3. 验证Cloud Run配置

  • 确保helper服务的PORT环境变量和代码中监听的端口一致(比如8080)
  • 确认helper已启用端到端HTTP/2(你已经配置,可跳过)

额外验证方法

用grpcurl在本地测试helper的gRPC服务是否正常:

grpcurl -d '{"service": ""}' <helper域名>:443 grpc.health.v1.Health/Check

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:15:57