使用 spring boot 和 docker-compose 在两个 Web 服务之间交换数据

exchange data between two web services using spring boot and docker-compose

例如,我有一个对象存储在第一个 web 服务上,可以通过“http://localhost:5000/articles/1
{"id":"1","name":"article1","description":"Desc1","partsId": 2} 访问
另一个可以被“http://localhost:80/api/parts2”访问的网络服务存储零件对象
{"id": 2,"manufacturer": "manufacture", "name": "name", "price": "228", "type": "type"}
我的 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:`


我希望能够通过其 id
获取 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 中更改本地主机的外部没有帮助)

您可以尝试在 docker-compose.yml 中为每项服务设置 hostname 属性。

`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 代码之外,那就不同了。

只需使用您的服务名称(computer-parts:5000/api/parts) 你会找到你的数据。

在 docker-compose 服务名称用作该容器的主机。