Итак, я пытался решить эту проблему, и спустя 4 дня я все еще не смог найти решение. Я создал шлюз API с помощью Spring Boot, который действует как сервер Eureka через Zuul, и у меня есть микросервис, который действует как клиент Eureka. Когда я запускаю его локально в Intellij, все работает идеально, и они обнаруживают друг друга и подключаются друг к другу. Однако, когда они находятся в контейнере, я получаю следующее исключение:
2022-05-16 12:42:49.087 WARN 1 --- [nfoReplicator-0] c.n.d.s.t.d.RetryableEurekaHttpClient : Request execution failed with m essage: 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 - registration failed Cannot execute request on any known server
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112 ) ~[eureka-client-1.9.17.jar!/:1.9.17] at 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] at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(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] at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) [eureka-client-1.9.17.jar!/:1.9.17] at com.netflix.discovery.InstanceInfoReplicator$1.run(InstanceInfoReplicator.java:101) [eureka-client-1.9.17.jar!/:1.9.1 7] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_332] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_332] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_332] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1. 8.0_332] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_332] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_332] at java.lang.Thread.run(Thread.java:750) [na:1.8.0_332]
Мой сервер Eureka выглядит так:
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/
Докерфайл:
FROM openjdk:8
EXPOSE 8080
ADD target/kwettergateway-docker.jar kwettergateway-docker.jar
ENTRYPOINT ["java", "-jar", "/kwettergateway-docker.jar"]
Мой клиент Eureka выглядит так:
Применение.Свойства:
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/
Предполагая, что проблема в том, что вы хотите, чтобы он работал оба при запуске из IntelliJ и из docker-compose, вам нужно будет использовать разные URL-адреса в зависимости от среды, в которой вы работаете. Вы можете использовать другие файлы свойств, например application-local.properties при запуске из IntelliJ. Это должно содержать только строку eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ и использовать eureka.client.serviceUrl.defaultZone=http://kwettergateway-docker:8761/eureka/ в application.properties в качестве конфигурации по умолчанию, как предлагает @M.Deinum.




Вы пытаетесь запустить свое приложение с помощью Docker, поэтому в файле application.properties вы должны заменить localhost на имя изображения. Кроме того, что нужно отметить, что вы должны отметить свой сервер Eureka @EnableEurekaServer.
Если вы хотите взглянуть на это, посетите - https://github.com/zhurasique/easycar
Мне пришлось использовать хост докера вместо локального хоста. Итак, теперь он работает со следующим кодом:
eureka.client.serviceUrl.defaultZone=http://host.docker.internal:8761/eureka/
Он не работает на локальном хосте, он работает в контейнере. Используйте имя контейнера вместо localhost в качестве хоста (при условии, что они работают в одной сети).