问题描述
我是微服务的新手,我有一个项目来设置多个微服务,该项目是这样设置的。 每个 Nest JS 应用程序都有
现在我要做的就是拥有
Nest JS MICROSERVICE APP 1
- API exposed to port 5000
- Postgres database working on 5432
- NATS running on 4222
Nest JS 应用微服务 2
- API exposed to port 5001
- Postgres database working on 5433
- NATS not running on 4222 as it is already occupied. If I change the port how I am gonna use the same message broker on both services.
问题是我想在第二个微服务和所有新创建的微服务上使用相同的 NATS 消息代理。我的 Nest JS APP 1 的 docker-compose 文件如下。
version: '3.9'
services:
api:
container_name: nest_app_1
image: nest_app_1
build:
dockerfile: Dockerfile
context: .
ports:
- 127.0.0.1:5000:5000
env_file:
- .env
depends_on:
- db
- nats
networks:
- main
db:
container_name: postgres
image: postgres:latest
ports:
- 127.0.0.1:5432:5432
volumes:
- ./data:/var/lib/postgresql/data
env_file:
- .env
networks:
- main
pgadmin:
container_name: pgadmin
image: dpage/pgadmin4
ports:
- 127.0.0.1:8080:80
env_file:
- .env
networks:
- main
nats:
image: nats-streaming:latest
entrypoint:
- /nats-streaming-server
- -cid
- main_cluster
ports:
- "127.0.0.1:4222:4222"
- "127.0.0.1:6222:6222"
- "127.0.0.1:8222:8222"
restart: always
tty: true
networks:
- main
networks:
main:
driver: bridge
第二个Nest JS微服务docker-compose如下
version: '3.9'
services:
api:
container_name: nest_app_2
image: nest_app_2
build:
dockerfile: Dockerfile
context: .
ports:
- 127.0.0.1:5001:5001
env_file:
- .env
depends_on:
- app_db_2
networks:
- main
app_db_2:
container_name: postgres_2
image: postgres:latest
ports:
- 127.0.0.1:5433:5432
volumes:
- ./data:/var/lib/postgresql/data
env_file:
- .env
networks:
- main
pgadmin:
container_name: pgadmin_2
image: dpage/pgadmin4
ports:
- 127.0.0.1:8081:80
env_file:
- .env
networks:
- main
nats:
image: nats-streaming:latest
entrypoint:
- /nats-streaming-server
- -cid
- main_cluster
ports:
- "127.0.0.1:4222:4222"
restart: always
tty: true
networks:
- main
networks:
main:
driver: bridge
现在我想使用 NATS 在两个应用程序之间进行通信。因此,如果我从微服务 1 发布消息并将该消息订阅到微服务 2,依此类推。
解决方法
是的,如果您通过主机网络堆栈链接它,请确保主机端口已被占用。您只能将一项服务链接到 ip:port
看起来您试图启动两个 NATS 实例并让它们加入同一个 NATS 集群。但也许你需要两个开发实例。您只想看到通过它的消息。
选项 1:将所有内容放在一个组合中,并为两个服务使用depends_on 和相同的 NATS 节点
选项 2:使用单独的组合堆栈来配置您的 NATS 基础架构并使用 extrnal_links。
选项 3:为 NATS 集群定义自定义网络,其中每个 NATS 容器都有自己的 iP。
但我会从 1 开始。