【问题标题】:exchange data between two web services using spring boot and docker-compose使用 spring boot 和 docker-compose 在两个 web 服务之间交换数据
【发布时间】:2020-08-14 03:35:38
【问题描述】:

例如,我有一个对象存储在第一个 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 中将外部更改为 localhost 没有帮助)

【问题讨论】:

    标签: java spring-boot docker web-services docker-compose


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以尝试在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 代码,那就不同了。

      【讨论】:

      • 您好,我已经按照您的说法更新了 docker-compose 文件和 url,并且我在 GET 请求中收到此错误 I/O 错误 \"computer:5000/api/parts/1\":parts;嵌套异常是 java.net.UnknownHostException: 部分,也许有可能以某种方式给容器主机 ip 并通过它访问?
      • 嗯,不妨试试docker inspect articles-servicedocker inspect external。这应该为您提供有关 Docker 使用的内部 IP 地址的详细信息。你也可以先docker network ls 然后docker network inspect networknamehere。这实际上可能更容易阅读。
      • docker network inspect shop_ws_bridge 给了我外部容器 ipv4 地址,但是当我尝试使用这个 url "172.19.0.3:5000/api/parts/1" 使用 rest 模板获取实体时,它给出了这个错误 "404 : [{\"timestamp\":\"2020-04-30T19:56:27.822+0000\",\"status\":404,\"error\":\"Not Found\",\"message\":\"No message available\",\"path\":\"/api/parts/1\"}]"
      • 嗯,抱歉,我没办法了。我最后的想法可能是尝试进入容器本身并在命令行上在各种 IP、主机名和端口上运行 ping/curl 命令,以检查哪些有效,哪些无效。这可能会帮助您在 Java 中输入适当的信息来发出请求。我还会仔细检查以确保服务在本地主机上的容器本身内工作,以确认您的应用程序正在运行而不是关闭或其他什么。
      猜你喜欢
      • 2017-12-29
      • 2021-05-14
      • 1970-01-01
      • 2020-10-08
      • 2020-09-04
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2013-02-09
      相关资源
      最近更新 更多