gpt4 book ai didi

java - Docker Compose 链接的微服务不可发现

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:26 24 4
gpt4 key购买 nike

使用 docker compose 时,我无法让两个服务相互通信。这个想法是让 Node.JS 服务与 Java/Spring 服务对话。

我尝试使用“链接”,将它们放入同一个“网络”中,然后将请求发送到 http://service_name:port并返回 ERR_NAME_NOT_RESOLVED。

在 Node.JS 服务中,我尝试使用 Axios 和 http 模块,但都不起作用(ERR_NAME_NOT_RESOLVED)。我也尝试过“localhost”,但它也不起作用(ERR_CONNECTION_REFUSED)。Spring 服务实际上只是一个公开的 REST 端点(我知道它可以工作,因为我可以直接访问它)。

我还尝试通过环境变量传递对服务的引用例如(在 docker-compose.yml 内)。

environment:
- SERVICE_HOST=serviceB

下面调用时,Node.JS 项目内的 env 变量未定义

process.env.SERVICE_HOST

我正在使用带有 Docker 工具箱的 Windows,但也在 Ubuntu VM 中尝试了相同的项目。

  serviceA:
build: ./serviceA/
ports:
- "8080:8080"
networks:
- my_network
serviceB:
build: ./serviceB/
ports:
- "9003:9003"
networks:
- my_network

networks:
my_network:
driver: bridge
axios.get("http://serviceB:9003/test")
.then(function(res){
console.log(res);
})

我希望 Node.JS 服务中的 console.log 语句能够响应 ServiceB 的其余调用的结果,而不是错误消息。

我是使用 docker-compose 的新手,所以我希望我在这里遗漏了一些明显的东西,但我无法在网上找到任何可以解决我的问题的东西,也没有在 SO 上的类似问题中找到任何东西。

编辑添加了整个 yaml 文件和错误以便更好地理解。

version: '3'
services:

# Consul
consul:
container_name: consul
image: consul:latest
ports:
- "8500:8500"
- "8300:8300"
hostname: consul
networks:
- front_end
- back_end

# Actor Service
actor_service:
build: ./actor_service/
ports:
- "9001:8080"
depends_on:
- actor_service_db
- consul
networks:
- back_end

actor_service_db:
image: postgres:9.4.5
depends_on:
- consul
networks:
- back_end
environment:
- POSTGRES_DB=actor
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- CONSUL_HTTP_ADDR=https://consul:8500

# Movie Service
movie_service:
build: ./movie_service/
ports:
- "9002:8080"
depends_on:
- movie_service_db
- consul
networks:
- back_end

movie_service_db:
image: postgres:9.4.5
depends_on:
- consul
networks:
- front_end
environment:
- POSTGRES_DB=movie
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- CONSUL_HTTP_ADDR=https://consul:8500

# Movie Aggregate Service
movie_aggregate_service:
container_name: movie_aggregate_service
build:
context: ./movie_aggregate_service/
ports:
- "9003:8080"
depends_on:
- consul
- movie_service
- actor_service
networks:
- front_end
- back_end
hostname: movie_aggregate_service

# Frontend
front_end:
build: ./front_end/
ports:
- "8080:8080"
networks:
- front_end
environment:
- "CONSUL_HOST=consul"
links:
- consul
- movie_aggregate_service

networks:
front_end:
driver: bridge
back_end:
driver: bridge

Browser Console errors and output

最佳答案

您可能希望在每个服务上指定一个主机名,以方便访问其上的端点并显式链接它们。下面是一个示例 Docker-compose 文件。

version: "3"

services:
ocelot.products:
image: pogs/ocelot-products
container_name: ocelot-products
hostname: ocelot.products
build:
context: ./products
ports:
- "52790:3000"
environment:
"PUBLIC_PORT": "52790"
ocelot.users:
image: pogs/ocelot-users
container_name: ocelot-users
hostname: ocelot.users
build:
context: ./users
ports:
- "52791:3000"
environment:
"PUBLIC_PORT": "52791"
ocelot.transactions:
image: pogs/ocelot-transactions
container_name: ocelot-transactions
hostname: ocelot.transactions
build:
context: ./transactions
ports:
- "52792:3000"
environment:
"PUBLIC_PORT": "52792"
ocelot.gateway:
image: pogs/ocelot-gateway
container_name: ocelot-gateway
build:
context: ./gateway/EShop
ports:
- "52793:80"
links:
- ocelot.products
- ocelot.users
- ocelot.transactions
depends_on:
- ocelot.products
- ocelot.users
- ocelot.transactions

整个存储库可用 here

关于java - Docker Compose 链接的微服务不可发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55669208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com