Реестр Jhipster получает неверный IP-адрес от Eureka (развертывание Docker)

Имеем следующую проблему, при развертывании нескольких микросервисов случайным образом иногда один из них прописывается в реестре с неверным IP. Я понимаю, что eureka неправильно определяет IP-адрес контейнера... Мы протестировали несколько решений, таких как эта конфигурация application.yml, но они не заработали должным образом. Любые идеи?

eureka:
    instance:
        prefer-ip-address: true
        hostname: ${server.address}
        ip-address: ${server.address}

Я видел это решение здесь: https://groups.google.com/d/msg/jhipster-dev/n7s7OTgT18E/RtZ3O4hlEwAJ

Но эта конфигурация выдает «Не удалось разрешить заполнитель «server.address» в строковом значении». Это имеет смысл, когда я читаю это: Ссылка на ключ в application.yml


person apenlor    schedule 24.02.2017    source источник
comment
Обеспечиваете ли вы, чтобы все ваши службы самостоятельно регистрировались с помощью настраиваемых идентификаторов экземпляров для eureka? возможно эврика дает сервисы старые ips, запоминая по id   -  person David Steiman    schedule 24.02.2017
comment
Да, идентификатор экземпляра является случайным значением: instanceId: sd_api:${spring.application.instance_id:${random.value}}   -  person apenlor    schedule 02.03.2017
comment
Я заметил, что проблема возникает, когда я перенаправляю порт в контейнере. Если контейнер выставляет порт, то Eureka регистрирует неправильный IP.   -  person apenlor    schedule 02.03.2017


Ответы (1)


@snowblind Скорее всего, это проблема с сетью контейнеров докеров. На самом деле при первоначальной регистрации Eureka использует только то, что доступно внутри приложения. Таким образом, он определит свой адрес с помощью чего-то вроде java.net.InetAddress, а затем распространит это значение в реестр, чтобы объявить, как можно получить доступ к службе. Однако в вашем случае он, похоже, сообщает неверную информацию.

Поэтому сначала убедитесь, что вы всегда сопоставляете порт контейнера с одним и тем же портом хоста. В качестве альтернативы вы можете использовать сеть хоста докера (--net=host), чтобы ваш контейнер использовал тот же сетевой интерфейс, что и ваш хост. Это возможно в docker-compose, добавив net: "host" в описание службы.

Другая идея состоит в том, чтобы использовать регистрацию Eureka на основе имени хоста, а не регистрацию на основе IP, которую мы настраиваем по умолчанию (prefer-ip-adress = true), но я не могу гарантировать, что это будет работать, поскольку я никогда не пробовал это сам, пожалуйста обратитесь к документации Eureka, если хотите это сделать.

person Pierre Besson    schedule 08.03.2017
comment
Я использую network_mode: host в своем docker-compose, и все еще возникает та же проблема. С именами хостов это работает, но нам нужно использовать IP-адреса (некоторым другим службам нужна эта информация). Спасибо за помощь! - person apenlor; 09.03.2017