Spring Microservices не может подключиться через Eureka внутри контейнера Docker

Итак, я пытался решить эту проблему, и спустя 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/

Он не работает на локальном хосте, он работает в контейнере. Используйте имя контейнера вместо localhost в качестве хоста (при условии, что они работают в одной сети).

M. Deinum 16.05.2022 15:50

Предполагая, что проблема в том, что вы хотите, чтобы он работал оба при запуске из IntelliJ и из docker-compose, вам нужно будет использовать разные URL-адреса в зависимости от среды, в которой вы работаете. Вы можете использовать другие файлы свойств, например application-local.properties при запуске из IntelliJ. Это должно содержать только строку eureka.client.serviceUrl.defaultZone=http://localhost:8761/e‌​ureka/ и использовать eureka.client.serviceUrl.defaultZone=http://kwettergateway-d‌​ocker:8761/eureka/ в application.properties в качестве конфигурации по умолчанию, как предлагает @M.Deinum.

Hans-Christian 16.05.2022 17:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
29
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы пытаетесь запустить свое приложение с помощью Docker, поэтому в файле application.properties вы должны заменить localhost на имя изображения. Кроме того, что нужно отметить, что вы должны отметить свой сервер Eureka @EnableEurekaServer. Если вы хотите взглянуть на это, посетите - https://github.com/zhurasique/easycar

Мне пришлось использовать хост докера вместо локального хоста. Итак, теперь он работает со следующим кодом:

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

Другие вопросы по теме