所以我一直在尝试解决这个问题,4天后我仍然没有找到解决方案。我使用 Spring Boot 构建了一个 API 网关,它通过 Zuul 充当 Eureka 服务器,并且我有一个微服务充当 Eureka 客户端。当我在 Intellij 本地运行它时,一切都很完美,它们会发现并相互连接。然而,当它们在容器中时,我得到以下异常:
2022-05-16 12:42:49.087 警告 1 --- [nfoReplicator-0] c.n.d.s.t.d.RetryableEurekaHttpClient :请求执行失败 消息:java.net.UnknownHostException:http 2022-05-16 12:42:49.088 警告 1 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_USER/8322e6fdb2 35:用户: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] 在 com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:5 9) ~[eureka-client-1.9.17.jar!/:1.9.17] 在 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.register(EurekaHttpClientDecorator.java:56 ) ~[eureka-client-1.9.17.jar!/:1.9.17] 在 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) [不: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 主机而不是 localhost。现在可以使用以下代码运行:
eureka.client.serviceUrl.defaultZone=http://host.docker.internal:8761/eureka/
您尝试使用 Docker 运行应用程序,因此在 application.properties 文件中,您应该将 localhost 替换为映像名称。另外,需要提及的是,您应该用
@EnableEurekaServer
标记您的 Eureka 服务器。
如果你想看一下,请访问 - https://github.com/zhurasique/easycar
eureka.client.serviceUrl.defaultZone=http://host.docker.internal:8761/eureka/
为我工作