обмениваться данными между двумя веб-сервисами, используя весеннюю загрузку и docker -compose - PullRequest
0 голосов
/ 30 апреля 2020

Например, у меня есть один объект, хранящийся в первом веб-сервисе, к которому можно получить доступ "http://localhost: 5000 / article / 1 "
{"id":"1","name":"article1","description":"Desc1","partsId": 2}
и другой веб-сервис, который может быть принятым "http://localhost: 80 / api / parts2 " объект запасных частей
{"id": 2,"manufacturer": "manufacture", "name": "name", "price": "228", "type": "type"}
my docker -compose.yml:

`version: '3.7'
services:
    articles-service:
        container_name: articles-service
        build:
            context: .
            dockerfile: Dockerfile
        ports:
            - "5000:5000"
        volumes:
        - .:/service
        networks:
            - ws_bridge
    computer-parts:
        build: ./comp_parts
        command: python app.py
        ports:
            - "80:5000"
        volumes:
        - .:/service
        container_name: external
        networks:
            - ws_bridge
networks:
    ws_bridge:`


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

@GetMapping("/parts/{id}")
public PcPart getPartFromOtherService(@PathVariable String id) {
    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<PcPart[]> response =
            restTemplate.getForEntity(
                    "http://external:80/api/parts/" + id, // The problem lies here in the url
                    PcPart[].class);
    PcPart[] parts = response.getBody();
    return parts[0];
}


Какой URL мне следует использовать или как подключить их, чтобы иметь возможность извлекать данные (изменение внешнего адреса на локальный в URL не помогает)

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Просто используйте свое сервисное имя (computer-parts: 5000 / api / parts). Вы найдете свои данные.

В docker имя -компонентной службы используется в качестве хоста для этого контейнера.

0 голосов
/ 30 апреля 2020

Вы можете попробовать установить свойство hostname в docker-compose.yml для каждой службы.

`version: '3.7'
services:
    articles-service:
        container_name: articles-service
        hostname: articles
        build:
            context: .
            dockerfile: Dockerfile
        ports:
            - "5000:5000"
        volumes:
        - .:/service
        networks:
            - ws_bridge
    computer-parts:
        build: ./comp_parts
        hostname: computer
        command: python app.py
        ports:
            - "80:5000"
        volumes:
        - .:/service
        container_name: external
        networks:
            - ws_bridge
networks:
    ws_bridge:`

Поскольку Docker -Compose помогает управлять сетью, я полагаю, вы можете сделать что-то вроде http://computer:5000. Имя хоста будет разрешено указывать на соответствующий внутренний Docker IP для этой службы. Убедитесь, что вы используете внутренний лицевой порт, а не внешний лицевой порт. Я предполагаю, что во всем этом вы хотите общаться или вызывать API между сервисами. Если вы вне Docker запускаете локальный Java код, это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...