OpenFeign + Zookeeper не удается подключиться извне Docker-а

Рейтинг: 1Ответов: 0Опубликовано: 19.01.2023

Есть docker compose с зукипером и несколькими rest-сервисами, располагается на ubuntu в локальной сети. Сервисы - на spring boot 2.7.7 + OpenFeign

У всех сервисов, включая zookeeper, в docker-compose.yml прописано network_mode: "host".
Непосредственно в докере взаимодействие сервисов через зукипер + feignClient работает без нареканий.

Порты всех сервисов "снаружи" видны и прямое подключение к сервисам извне докера тоже работает.

Однако, при попытке подключиться к сервисам извне докера через OpenFeign + service-discovery получаю ошибку, при этом явно видно, что к зукиперу коннект успешный:

INFO  [main] org.springframework.cloud.openfeign.FeignClientFactoryBean: For 'some_service' URL not provided. Will try picking an instance via load-balancing.
...
INFO  [main-SendThread(srvr193:2181)] org.apache.zookeeper.ClientCnxn$SendThread: Socket connection established, initiating session, client: /192.168.206.69:60424, server: srvr193/192.168.196.193:2181
INFO  [main-SendThread(srvr193:2181)] org.apache.zookeeper.ClientCnxn$SendThread: Session establishment complete on server srvr193/192.168.196.193:2181, session id = 0x100fb3e00550037, negotiated timeout = 40000
INFO  [main-EventThread] org.apache.curator.framework.state.ConnectionStateManager: State change: CONNECTED
INFO  [main-EventThread] org.apache.curator.framework.imps.EnsembleTracker: New config event received: {}
INFO  [main-EventThread] org.apache.curator.framework.imps.EnsembleTracker: New config event received: {}
...
feign.RetryableException: Connection refused: no further information executing GET http://some_service/api/v1/ref/some-data

Подозреваю (повторюсь - внутри докера этот OpenFeign клиент работает без нареканий), что дело в том, что зукипер отдаёт неправильные ip для подключения к зарегистрированным сервисам.

Выжимка docker-compose.yml:

services:
  zookeeper:
    image: zookeeper:3.8.0-temurin
    container_name: zookeeper
    restart: always
    network_mode: "host"
    environment:
      - ZOO_MY_ID=1
      - ZOO_SERVERS=server.1=192.168.196.193:2888:3888;2181
  cloud-gateway:
    image: "..."
    container_name: cloud-gateway
    network_mode: "host"
    depends_on:
      zookeeper:
        condition: service_healthy
  some_service:
    image: "..."
    container_name: some_service
    restart: always
    network_mode: "host"
    depends_on:
      zookeeper:
        condition: service_healthy

Что я не учел и как заставить zookeeper (или feign-клиентов?) правильно отдавать / обрабатывать информацию для подключения к сервисам?

P.S. если все сервисы, включая зукипер, запускать на той же ubuntu-машине, но как отдельные сервисы (а не контейнерами внутри докера) подключение к ним извне работает великолепно.


Upd: закопавшись в org.springframework.cloud.openfeign.loadbalancer выяснил, что действительно в FeignClient поступает localhost в качестве выбранного load-balanceингом сервера. Хотя должно - либо ip либо на худой конец dns-имя srvr193/192.168.196.193 ...


Upd1: мне не удалось пробиться к реальному получению данных OpenFeign-клиентом от zookeeper-а через Mono<> и прочие прелести асинхронного выполнения.
Посему было принято следующее решение:

  1. Внутри докера сервисы по прежнему работают с использованием load balancing, это достигается использованием @FeignClient c параметрами name и path
  2. Вне докера требуется запуск для прогона тестов. В этом случае активируется специальный профиль окружения, в котором в файле конфигурации для @FeignClient помимо name и path прописан ещё и параметр url, указывающий на имя сервера с докером + открытый из докера порт.

Вопрос не закрываю, вдруг обнаружится решение из исходной постановки.

Ответы

Ответов пока нет.