Связь между 2 приложениями с докеризованной загрузкой spring с использованием пользовательской сети докеров

#spring-boot #docker #docker-compose #dockerfile

#пружинный ботинок #докер #докер-сочинение #докерфайл

Вопрос:

У меня есть служба приветствия и Всемирная служба. У службы Hello есть точка отдыха /hello/hw, которая внутренне вызывает конечную точку отдыха в мировой службе, чтобы вернуть строку «Hello World». Приложение работает нормально, как и ожидалось, если система не докеризована.

Однако проблема в том, когда я хочу докеризировать систему. Я использую docker-compose для контейнеризации обеих служб. Я определил пользовательскую сеть в файле компоновки docker (с именем custom_net).

Конечная точка rest /hello/hw доступна, но служба Hello не может вызвать конечную точку rest в Мировой службе.

application.properties в службе Hello имеет URL-адрес всемирной службы в виде http://localhost:8082/world

Я получаю исключение UnknownHostException, когда задаю URL-адрес как http://custom_net:8082/world или к http://custom_net:8092/world

Я получаю исключение отказа в подключении, когда я не изменяю URL-адрес в application.properties. В сообщении журнала говорится: «Сбой: отказано в подключении: localhost/127.0.0.1:8082;» Я не уверен, какие конфигурации необходимы для соединения двух служб

В списке команд docker network имя пользовательской сети отображается как «tempfolder_custom_net». Команда docker inspect показывает, что и hello, и всемирная служба зарегистрированы в этой сети

 version: '3' services:  hello_service:  image: 'openjdk:8-jdk-alpine'  restart: always  container_name: hello_service  volumes:  - ./deploy:/root networks: - custom_net depends_on: - world_service command: sh -c "java -jar -Dspring.config.location=file:///root/hello/application.yml /root/hello/hello-0.0.1-SNAPSHOT.jar " ports: - 8091:8081  world_service: image: 'openjdk:8-jdk-alpine' restart: always container_name: world_service volumes: - ./deploy:/root command: sh -c "java -jar -Dspring.config.location=file:///root/world/application.yml /root/world/world-0.0.1-SNAPSHOT.jar " ports: - 8092:8082 networks: - custom_net  networks:  custom_net:  driver: bridge  

Приложение.yml службы приветствия …

 server:  port: 8081  services:  world:  url: http://localhost:8082/world  

Комментарии:

1. попробуйте позвонить http://world_service:8092/world

2. «http ://world_service:8092/world» выдает исключение отказа в подключении. «http ://world_service:8082/world» выдает ошибку 400 неверного запроса

3. как вы позвонили в службу word из службы hello ? как настроить вызов URL в коде ? кстати, проверьте http://172.17.0.1:8092/world

4. В сервисе Hello я использую WebClient. Веб-клиент получает базовый URL-адрес из application.properties. Я не хочу жестко кодировать ip-адрес. Является ли это стандартной практикой в производственной среде для жесткого кодирования ip-адреса?

5. можете ли вы поделиться URL-адресом из файла application.properties и проверить http://172.17.0.1:8092/world ?

Ответ №1:

Вы должны создать новую базу изображений на openjdk:8-jdk-alpine основе изображения и добавить ТОЧКУ входа

Вам следует изменить это:

 server:  port: 8081  services:  world:  url: http://localhost:8082/world  

Для :

 server:  port: 8081  services:  world:  url: http://world_service:8092/world  

Убедитесь, что оба контейнера запущены.

Комментарии:

1. Это не решило проблему. Я получаю «Отказано в подключении: worldservice/172.18.0.2:8092»

2. Пожалуйста, объясните, почему необходимо использовать новую базу изображений. Моя существующая база изображений такая же. Также то, что нужно упомянуть в ENTRYPOINT. Разве этой команды недостаточно? Я могу получить доступ к сервису Hello и API World service независимо

3. Нугуен Ван URL — адрес должен быть worldservice:8082/world . Номер порта должен принадлежать приложению, а не открытому порту docker, а имя хоста должно быть worldservice (подчеркивание удалено).

4. работает ли он с новой конфигурацией ?

5. ДА. Разница лишь в том, что пользовательская сеть докеров не используется.

Ответ №2:

@Thanh Nuguyen Ван спасибо за полезные советы по устранению неполадок. Проблема была с именем хоста world_service. Похоже, подчеркивание не является допустимым URL-адресом. Ниже приведен мой обновленный файл docker compose. Мне даже не пришлось использовать пользовательскую сеть докеров. Я обновил URL-адрес в приложении.yml для http://worldservice:8082/world. Также обратите внимание, что порт 8082, а не 8092. Мы должны упомянуть порт приложения, а не открытый порт docker.

 version: '3' services:  helloservice:  image: 'openjdk:8-jdk-alpine'  restart: always  container_name: helloservice  volumes:  - ./deploy:/root  #networks:  #- custom_net  depends_on:  - worldservice  command: sh -c "java -Xdebug -jar -Dspring.config.location=file:///root/hello/application.yml /root/hello/hello-0.0.1-SNAPSHOT.jar "  ports:  - 8091:8081  worldservice:  image: 'openjdk:8-jdk-alpine'  restart: always  container_name: worldservice  volumes:  - ./deploy:/root  command: sh -c "java -Xdebug -jar -Dspring.config.location=file:///root/world/application.yml /root/world/world-0.0.1-SNAPSHOT.jar "  ports:  - 8092:8082  #networks:  #- custom_net #networks:  #custom_net:  #driver: bridge