Google Cloud Run部署Spring Boot应用无法发送出站请求求助
故障原因与解决方案
核心故障原因优先级从高到低:
公网出口配置错误
如果你为当前Cloud Run服务配置了VPC连接器,且路由规则设置为「所有流量均路由到VPC」,但你对应的VPC没有配置Cloud NAT、没有绑定可用的公网出口IP,所有发往公网的请求会直接被丢弃,不会到达防火墙层面,自然也不会生成防火墙日志,这和你描述的现象完全匹配。目标站点封禁GCP公网IP段
你访问的homedepot加拿大站属于主流零售站点,有成熟的反爬策略,会主动封禁所有公有云厂商的服务器IP段,本地运行正常是因为你用的是住宅/办公网络IP,不在封禁名单里,Cloud Run默认的公网出口都是GCP的机房IP,直接访问会被对方丢弃请求,导致超时。网络参数适配问题
Cloud Run容器环境的网络MTU为1460,默认Java的TLS握手参数没有适配云环境的网络限制,握手阶段的大包被静默丢弃,会出现SSL握手超时的报错。基础镜像缺失CA根证书
你使用的openjdk:11-jre-slim是精简版镜像,默认未预装完整的CA根证书链,会导致部分站点的SSL证书无法被校验,握手失败。
对应解决方案
- 修正VPC路由配置
进入Cloud Run服务的编辑页面,找到「连接」标签下的VPC连接器配置:
- 如果不需要所有流量走VPC,直接将路由规则改为「仅将RFC1918私有地址范围的流量路由到VPC」,公网请求会走Cloud Run默认的公网出口
- 如果必须走VPC出口,需要在对应VPC下创建Cloud NAT,绑定公网IP,确保VPC内的资源可以正常访问公网
验证IP封禁问题
在同一GCP项目下创建一台同区域的临时GCE虚拟机,执行curl -v 你的目标接口地址,如果也出现超时/403报错,即可确认是对方站点封禁了GCP IP,这种情况需要对接住宅代理池转发请求,绕过IP封禁。适配云环境JVM与HTTP客户端参数
- 启动命令添加JVM参数,修改你的Dockerfile的CMD行为:
CMD ["java", "-Djava.net.preferIPv4Stack=true", "-Djdk.tls.maxHandshakeMessageSize=32768", "-jar", "/app.jar"]
- 如果你继续使用WebClient,显式配置完整的超时规则:
WebClient webClient = WebClient.builder() .clientConnector(new ReactorClientHttpConnector( HttpClient.create() .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 30000) .doOnConnected(conn -> conn .addHandlerLast(new ReadTimeoutHandler(30)) .addHandlerLast(new WriteTimeoutHandler(30)) ) .secure(spec -> spec .handshakeTimeout(Duration.ofSeconds(30)) .closeNotifyFlushTimeout(Duration.ofSeconds(10)) ) )) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) // 其他自定义header .build();
- 补充镜像根证书
修改你的Dockerfile,在运行时镜像层添加CA证书安装逻辑:
FROM openjdk:11-jre-slim RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /app/target/*.jar /app.jar ENV PORT 8080 ENV HOST 0.0.0.0 CMD ["java", "-jar", "/app.jar"]
内容的提问来源于stack exchange,提问作者jammer
相关产品推荐
相关产品推荐

