Ошибка Feign.Builder "целевые значения должны быть абсолютными": как вызвать docker-контейнер с абсолютным URL-адресом?

У меня есть несколько микросервисов, которые общаются друг с другом OpenFeign. Каждый из них является подмодулем проекта (назовем его "родительским") со своим собственным контейнером докеров.

В ПОРЯДКЕ. Итак, когда я хочу создать клиента сfeign.builder().target()возникает ошибка, утверждающая, что "целевые значения должны быть абсолютными". Я проверил исходный код, а это значит (feign.RequestTemplate.target(RequestTemplate.java:447)):

  public static boolean isAbsolute(String uri) {
    return uri != null && !uri.isEmpty() && uri.startsWith("http");
  }

Возникает вопрос: URL-адреса других сервисов такие:

another-service:8080/check

В локальных тестах это не проблема, потому что профиль local имеет http://localhost:8080и так далее. Но в сквозном тесте это не может обойти абсолютную проверку.

Итак, что теперь делать?

3 ответа

Решение

Я только что добавил http:// перед названием службы, и это исправлено.

Похоже, что при создании контейнеров, которым необходимо взаимодействовать друг с другом, docker выполняет две функции:

  • создать сеть, состоящую из этих контейнеров, и назначить каждому IP. В моем случае IP похожи на172.26.0.2, а не как localhost или 192.168.xx.xx.
  • действует как DNS-сервер: он сопоставляет IP-адреса с доменами, такими же, как имя службы в docker-compose.yml. Как вdocker-compose.yml я имею service-A, в сети докера я могу docker exec -it bash запустить оболочку и curl http://service-A:8080 посетить это.

Обратите внимание, что я использовал внутренние порты, а не "внешние". Например, если service-A имеет конфигурацию портов, например:

ports:
  - "8083:8080"

Внутри сети (curl из других контейнеров) мы используем 8080, но "извне"(с хоста, используя Postman) мы используем 8083.

PS:

я использовал uname -a чтобы проверить расстояние контейнера, это Debian, а затем я apt update && apt install curl установить curl исполняемый файл.

Просто добавьhttpилиhttpsперед вашим базовым URL` и должно работать.

Другое решение может использовать IP-адрес компьютера/ноутбука, чтобы определить причину, но оно устранило проблему, которую вы можете проверить с помощью ipconfig в терминале.

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