使用 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 服务名称用作该容器的主机。
例如,我有一个对象存储在第一个 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 服务名称用作该容器的主机。