本地Spring Boot对接GCP Logging/Tracing遇503 UNAVAILABLE错误求助
我是GCP新手,正在为Spring Boot项目配置Cloud Logging和Cloud Tracing,使用Spring Cloud GCP相关库实现。本地开发环境已设置GOOGLE_APPLICATION_CREDENTIALS环境变量,服务账号也拥有正确的写入权限。
已通过gcloud CLI确认API已启用:
gcloud services enable cloudtrace.googleapis.com gcloud services enable logging.googleapis.com
且gcloud CLI插入日志功能正常,但应用调用gRPC接口时返回503 UNAVAILABLE,核心错误为java.net.NoRouteToHostException。
相关配置与日志
application.properties
spring.cloud.gcp.logging.enabled=true spring.cloud.gcp.trace.enabled=true stackdriver.log.name=service.log spring.cloud.gcp.credentials.scopes=DEFAULT_SCOPES,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/logging.admin,https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/trace.append management.tracing.sampling.probability=1.0
应用报错日志
io.grpc.StatusRuntimeException: UNAVAILABLE: io exception at io.grpc.Status.asRuntimeException(Status.java:535) at zipkin2.reporter.stackdriver.internal.AwaitableUnaryClientCallListener.onClose(AwaitableUnaryClientCallListener.java:100) at io.grpc.internal.DelayedClientCall$DelayedListener$3.run(DelayedClientCall.java:463) Caused by: io.grpc.netty.shaded.io.netty.channel.AbstractChannel$AnnotatedNoRouteToHostException: No route to host: cloudtrace.googleapis.com/2404:6800:4007:81c:0:0:0:200a:443 Caused by: java.net.NoRouteToHostException: No route to host at sun.nio.ch.Net.connect0(Native Method) at sun.nio.ch.Net.connect(Net.java:482) at sun.nio.ch.Net.connect(Net.java:474) java.lang.RuntimeException: com.google.cloud.logging.LoggingException: io.grpc.StatusRuntimeException: UNAVAILABLE: io exception at com.google.cloud.logging.LoggingImpl$9.onFailure(LoggingImpl.java:943) at com.google.api.core.ApiFutures$1.onFailure(ApiFutures.java:68) at com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.java:1132) Caused by: io.grpc.netty.shaded.io.netty.channel.AbstractChannel$AnnotatedNoRouteToHostException: No route to host: logging.googleapis.com/2001:4860:4802:32:0:0:0:174:443 Caused by: java.net.NoRouteToHostException: No route to host at sun.nio.ch.Net.connect0(Native Method)
logback-spring.xml
<configuration> <include resource="com/google/cloud/spring/logging/logback-appender.xml" /> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <include resource="org/springframework/boot/logging/logback/console-appender.xml" /> <include resource="com/google/cloud/spring/logging/logback-json-appender.xml" /> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="STACKDRIVER" /> </root> </configuration>
pom.xml
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.8</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <java.version>1.8</java.version> <spring-cloud-gcp.version>3.2.0</spring-cloud-gcp.version> <spring-cloud.version>2021.0.1</spring-cloud.version> </properties> <dependency> <groupId>com.google.cloud</groupId> <artifactId>spring-cloud-gcp-starter</artifactId> </dependency> <dependency> <groupId>com.google.cloud</groupId> <artifactId>spring-cloud-gcp-starter-logging</artifactId> </dependency> <dependency> <groupId>com.google.cloud</groupId> <artifactId>spring-cloud-gcp-starter-trace</artifactId> </dependency> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.google.cloud</groupId> <artifactId>spring-cloud-gcp-dependencies</artifactId> <version>${spring-cloud-gcp.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
解决方案
从报错日志的NoRouteToHostException可以确定,问题核心是本地网络无法路由到GCP的gRPC服务IPv6端点,而非权限或API启用问题(gcloud CLI正常工作已验证这两点)。以下是针对性的排查修复步骤:
1. 强制使用IPv4解析
日志中显示应用尝试连接GCP服务的IPv6地址,很多本地网络环境不支持IPv6,导致路由失败。在启动Spring Boot应用时添加JVM参数强制使用IPv4:
java -Djava.net.preferIPv4Stack=true -jar your-app.jar
如果使用IDE运行,可在VM参数中添加该配置。
2. 配置代理(若处于代理环境)
如果本地网络需要通过代理访问外部服务,gcloud CLI可能已配置代理,但Spring Boot应用未继承该设置。添加代理相关JVM参数:
java -Dhttp.proxyHost=your-proxy-host -Dhttp.proxyPort=your-proxy-port -Dhttps.proxyHost=your-proxy-host -Dhttps.proxyPort=your-proxy-port -jar your-app.jar
也可在application.properties中配置Spring Cloud GCP的代理参数:
spring.cloud.gcp.logging.proxy.host=your-proxy-host spring.cloud.gcp.logging.proxy.port=your-proxy-port spring.cloud.gcp.trace.proxy.host=your-proxy-host spring.cloud.gcp.trace.proxy.port=your-proxy-port
3. 验证网络连通性
手动测试本地网络能否访问GCP服务端点:
- 解析域名到IPv4:
ping logging.googleapis.com(确保输出的是IPv4地址) - 测试端口连通性:
telnet logging.googleapis.com 443
如果测试失败,检查本地防火墙、杀毒软件是否拦截了出站请求,或联系网络管理员开放相关域名的443端口访问权限。
4. 简化凭证范围配置
当前配置的spring.cloud.gcp.credentials.scopes包含重复权限,DEFAULT_SCOPES已经涵盖了Cloud Logging和Tracing所需的logging.write、trace.append等权限,简化配置避免潜在冲突:
spring.cloud.gcp.credentials.scopes=DEFAULT_SCOPES
5. 升级Spring Cloud GCP依赖版本
尝试升级到Spring Cloud GCP 3.2.x系列的最新补丁版(如3.2.5),修复可能存在的gRPC客户端网络兼容性问题:
<properties> <spring-cloud-gcp.version>3.2.5</spring-cloud-gcp.version> </properties>
内容的提问来源于stack exchange,提问作者Siva Tharun

