首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google运行-无法发送出站请求

Google运行-无法发送出站请求
EN

Stack Overflow用户
提问于 2021-09-30 15:34:28
回答 1查看 736关注 0票数 1

我在Google运行中部署了一个容器。这是一个在Spring和Java中构建的应用程序。

我向云运行容器公开了一个端点( REST控制器),它进一步调用REST来访问外部端点,此时它就失败了。我从邮递员那里碰到了暴露的端点。

容器能够侦听传入的请求,甚至能够连接到Cloud。问题是-它不能击中外部API。

我甚至在防火墙中添加了一个出站规则,允许所有的流量,但没有成功。后来,尝试为防火墙打开日志,但没有生成日志。

有谁知道这里有什么问题吗?

请查看下面的日志和异常

代码语言:javascript
运行
复制
2021-09-30T14:33:06.955652Z2021-09-30 14:33:06.955 WARN 1 --- [nio-8080-exec-3] io.netty.util.internal.MacAddressUtil : 
Failed to find a usable hardware address from the network interfaces; using random bytes: 61:71:ba:a4:d5:85:ee:11

021-09-30T14:33:08.094246Z2021-09-30 14:33:08.093 DEBUG 1 --- [or-http-epoll-2] r.netty.http.client.HttpClientConnect : [id:93c6dc9b-1, L:/169.... - R:www.homedepot.ca/23.211.51.167:443] Handler is being applied: {uri=https://www.homedepot.ca/ method=GET}


2021-09-30T15:13:41.887524Z org.springframework.web.reactive.function.client.WebClientRequestException: handshake timed out after 10000ms; 
nested exception is io.netty.handler.ssl.SslHandshakeTimeoutException: handshake timed out after 10000ms at 
org.springframework.web.reactive.function.client.ExchangeFunctions$DefaultExchangeFunction.lambda$wrapException$9(ExchangeFunctions.java:141) 
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:

2021-09-30T15:13:41.887759Z at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:414)
2021-09-30T15:13:41.887776Z at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onNext(FluxConcatMap.java:251)
2021-09-30T15:13:41.887805Z at reactor.core.publisher.EmitterProcessor.drain(EmitterProcessor.java:491)
2021-09-30T15:13:41.887813Z at reactor.core.publisher.EmitterProcessor.tryEmitNext(EmitterProcessor.java:299)
2021-09-30T15:13:41.887822Z at reactor.core.publisher.SinkManySerialized.tryEmitNext(SinkManySerialized.java:100)
2021-09-30T15:13:41.887859Z at reactor.core.publisher.InternalManySink.emitNext(InternalManySink.java:27)
2021-09-30T15:13:41.887873Z at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onError(FluxRetryWhen.java:190)
2021-09-30T15:13:41.887893Z at reactor.core.publisher.MonoCreate$MonoSink.error(MonoCreate.java:189)
2021-09-30T15:13:41.887903Z at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect$ClientTransportSubscriber.onError(HttpClientConnect.java:304)
2021-09-30T15:13:41.887916Z at reactor.core.publisher.MonoCreate$MonoSink.error(MonoCreate.java:189)
2021-09-30T15:13:41.887934Z at reactor.netty.resources.PooledConnectionProvider$DisposableAcquire.onUncaughtException(PooledConnectionProvider.java:218)
2021-09-30T15:13:41.887958Z at reactor.netty.resources.PooledConnectionProvider$PooledConnection.onUncaughtException(PooledConnectionProvider.java:467)
2021-09-30T15:13:41.887979Z at reactor.netty.channel.ChannelOperationsHandler.exceptionCaught(ChannelOperationsHandler.java:129)
2021-09-30T15:13:41.887993Z at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:302)
2021-09-30T15:13:41.888011Z at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:281)
2021-09-30T15:13:41.888032Z at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:273)
2021-09-30T15:13:41.888049Z at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireExceptionCaught(CombinedChannelDuplexHandler.java:424)
2021-09-30T15:13:41.982305Z at io.netty.channel.ChannelHandlerAdapter.exceptionCaught(ChannelHandlerAdapter.java:92)
2021-09-30T15:13:41.982894Z2021-09-30 15:13:41.281 WARN 1 --- [or-http-epoll-3] r.netty.http.client.HttpClientConnect : [id:c351aec9, L:/169.... - R:www.homedepot.ca/96.7.86.161:443] The connection observed an error

在Spring引导中进行调用的代码

代码语言:javascript
运行
复制
WebClient webClient =
      WebClient.builder()
          .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
          .build();
  Mono<HDCanadaProdResp> webClientResponse =
      webClient.get().uri(stockApiurl).retrieve().bodyToMono(HDCanadaProdResp.class);
webClientResponse.block();

所有代码都在Docker容器中的本地系统中工作,不确定云运行的问题是什么。

这是Dockerfile

代码语言:javascript
运行
复制
FROM maven:3.6.3-openjdk-11-slim as builder

WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline

COPY src/ /app/src/
RUN mvn package -DskipTests


FROM openjdk:11-jre-slim

COPY --from=builder /app/target/*.jar /app.jar

#PORT for cloud run, coz cloud maps to this port
ENV PORT 8080
ENV HOST 0.0.0.0

CMD ["java", "-jar", "/app.jar"]

2021年11月7日最新消息

我更改了我使用WebClient API进行rest调用的spring代码,现在错误已经改变了。

旧码

代码语言:javascript
运行
复制
 WebClient webClient =
        WebClient.builder()
            .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            
            .defaultHeader(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate, br")
            .defaultHeader(HttpHeaders.ACCEPT_LANGUAGE, "en-CA,en-US;q=0.7,en;q=0.3")
            .defaultHeader(HttpHeaders.HOST, "www.homedepot.ca")

            .build();
    Mono<HDCanadaRecomProdResp> webClientResponse =
        webClient.get().uri(prodApiurl).retrieve().bodyToMono(HDCanadaRecomProdResp.class);

    return webClientResponse.block();

新码

代码语言:javascript
运行
复制
 HttpComponentsClientHttpRequestFactory requestFactory =
        new HttpComponentsClientHttpRequestFactory();
    requestFactory.setConnectTimeout(60 * 1000);
    requestFactory.setReadTimeout(60 * 1000);

    RestTemplate restTemplate = new RestTemplate(requestFactory);
    ResponseEntity<HDCanadaRecomProdResp> response = null;
    try {
      HttpHeaders headers = new HttpHeaders();

      headers.setContentType(MediaType.APPLICATION_JSON);
      headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate, br");
      headers.set(HttpHeaders.ACCEPT_LANGUAGE, "en-CA,en-US;q=0.7,en;q=0.3");
      headers.set(HttpHeaders.HOST, "www.homedepot.ca");
      headers.setAccept(Arrays.asList(MediaType.ALL));


      HttpEntity<Map<String, String>> entity = new HttpEntity<>(headers);
      
      response =
      restTemplate.exchange(prodApiurl, HttpMethod.GET, entity, HDCanadaRecomProdResp.class);
  }

而现在错误已经更改为

代码语言:javascript
运行
复制
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://www.homedepot.ca/api/rec/v1/recommendations/fbt/products/1001200972/store/7301": 
Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out at 
org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:785) at 
org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711) at 
org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:602) at 
com.pricetracker.productfetcher.client.HomeDepotCAClient.getProductDetails(HomeDepotCAClient.java:68) at 
com.pricetracker.productfetcher.client.HomeDepotCAClient.getProductDetails(HomeDepotCAClient.java:24) at 
com.pricetracker.productfetcher.service.ProductSearchServiceImpl.getProductFromWS(ProductSearchServiceImpl.java:116) at 
com.pricetracker.productfetcher.service.ProductSearchServiceImpl.getProduct(ProductSearchServiceImpl.java:82) at 
com.pricetracker.productfetcher.service.ProductSearchServiceImpl.productSearch(ProductSearchServiceImpl.java:61) at 
com.pricetracker.productfetcher.controller.ProductsController.searchProduct(ProductsController.java:51) at 
com.pricetracker.productfetcher.controller.ProductsController$$FastClassBySpringCGLIB$$37eced0e.invoke(<generated>) at 
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at 
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at 
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at 
org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:123) at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at 
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at 
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) at 
com.pricetracker.productfetcher.controller.ProductsController$$EnhancerBySpringCGLIB$$ec439be9.searchProduct(<generated>) at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at 
java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) at 
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) at 
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) at 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) at 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) at 
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1064) at 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at 
EN

回答 1

Stack Overflow用户

发布于 2021-11-20 03:44:23

对于这类云运行相关问题,请使用绞合。还可以在GCP控制台的Cloud部分(而不是在Cloud部分的“logs”选项卡中)查看日志,您可以在varlog/系统日志中查找具有“调试”严重性的"Container“。还尝试使用这些使用说明在Docker上本地运行应用程序,并验证应用程序在本地引导是否良好。容器必须侦听发送请求的端口上的0.0.0.0上的请求。默认情况下,请求发送到8080。在cloudbuild.yaml文件中添加--min-实例,并给它提供一些值,然后尝试。

如果您看到这个日志(在前面看不到,因为它是在容器启动期间出现的) Debug 2021-11-07T12:39:14.876726806ZContainer Sandbox: Unsupported syscall setsockopt(0xa,0x11,0x67,0x3ed0ac62bffc,0x4,0x1a)并且您能够在本地运行安装程序,这意味着对接映像或您的配置没有问题。Unsupported syscall- --这条消息表明,在云运行中可能不支持系统调用(完全托管),因为容器实例是使用gVisor容器运行时沙箱进行沙箱封装的。

详见socket(7) - Linux手册第8页。所以gvisor不支持这个套接字选项。看看这个Github问题,它讨论的是您收到的相同的错误消息。

这是云运行完全管理中的一个已知问题。您可以使用相同的配置和容器设置(分配的资源较少)尝试云为Anthos跑

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69395071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档