Ошибка 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 в терминале.