繁体   English   中英

在 Docker 容器内时,Spring 微服务无法通过 Eureka 连接

[英]Spring Microservices Cannot Connect Via Eureka When Inside Docker Container

所以我一直在尝试解决这个问题,4天后我仍然无法找到解决方案。 我已经使用 Spring Boot 构建了一个 API 网关,它通过 Zuul 充当 Eureka Server,并且我有一个充当 Eureka Client 的微服务。 当我在 Intellij 中本地运行它时,一切正常,它们发现并相互连接。 但是,当它们在容器中时,出现以下异常:

2022-05-16 12:42:49.087 WARN 1 --- [nfoReplicator-0] cndstdRetryableEurekaHttpClient:请求执行失败并显示消息:java.net.UnknownHostException:http 2022-05-16 12:42:49.088 WARN 1 -- - [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_USER/8322e6fdb2 35:user:8082 - 注册失败无法在任何已知服务器上执行请求

com.netflix.discovery.shared.transport.TransportException:无法在 com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9. 17.jar!/:1.9.17] 在 com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.17.jar!/:1.9.17 ] at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:5 9) ~[eureka-client-1.9.17.jar!/:1.9.17] at com.netflix.discovery .shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.17.jar!/:1.9.17] 在 com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator。注册(EurekaHttpClientDecorator.java:56)~[eureka-client-1.9.17.jar!/:1.9.17] at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:850)~[eureka-client-1.9 .17. jar!/:1.9.17] 在 com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) [eureka-client-1.9.17.jar!/:1.9.17] 在 com.netflix.discovery.InstanceInfoReplicator $1.run(InstanceInfoReplicator.java:101) [eureka-client-1.9.17.jar!/:1.9.1 7] 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na: 1.8.0_332] 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_332] 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na :1.8.0_332] 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1. 8.0_332] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_332] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8 .0_332] 在 java.lang.Thread.run(Thread.java:750) [na:1.8.0_332]

我的尤里卡服务器看起来像这样:

Docker-compose.yaml

version: '3.8'
services:

  kwettergateway-docker:
    image: user/kwettergateway
    ports:
      - "8761:8761"
  userservice-docker:
    image: user/userservice
    ports:
      - "8082:8082"
    links:
      - kwettergateway-docker

应用程序属性:

server.port=8761

#Gateway properties
spring.application.name=gateway
eureka.instance.prefer-ip-address=true
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.server.wait-time-in-ms-when-sync-empty=0
zuul.prefix=/api
zuul.routes.user.path=/user/**
zuul.routes.user.url=http://localhost:8082/

Dockerfile:

FROM openjdk:8
EXPOSE 8080
ADD target/kwettergateway-docker.jar kwettergateway-docker.jar
ENTRYPOINT ["java", "-jar", "/kwettergateway-docker.jar"]

我的尤里卡客户端看起来像这样:

应用程序属性:

server.port=8082

#Gateway properties
spring.application.name=user
eureka.instance.prefer-ip-address=true
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

您尝试使用 Docker 运行您的应用程序,因此在您的 application.properties 文件中,您应该将 localhost 替换为图像名称。 另外,需要提及的是,您应该使用@EnableEurekaServer标记您的 Eureka 服务器。 如果你想看看它,请访问 - https://github.com/zhurasique/easycar

我不得不使用 docker 主机而不是 localhost。 所以它现在使用以下代码:

eureka.client.serviceUrl.defaultZone=http://host.docker.internal:8761/eureka/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM