1

我是微服务的新手,我有一个设置多个微服务的项目,该项目是这样设置的。每个 Nest js 应用程序都有

  • 暴露给端口的 API 应用程序
  • 数据库
  • docker-compose 文件负责为每个微服务创建容器。

现在我正在做的是拥有

Nest JS 微服务 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,依此类推。

4

1 回答 1

0

是的,如果您通过主机网络堆栈链接它,请确保主机端口被占用。您只能将一项服务关联到ip:port

看起来您试图启动两个 NATS 实例并让它们加入同一个 NATS 集群。但也许您需要两个实例进行开发。您只想查看通过它的消息。

选项 1:只需将所有内容放在一个 compose 中,并为两个服务使用 depends_on 和相同的 NATS 节点

选项 2:使用单独的组合堆栈来配置您的 NATS 基础架构并使用 extrnal_links

选项 3:为 NATS 集群定义自定义网络,其中每个 NATS 容器都有自己的 iP。

但我会从 1 开始。

于 2021-04-18T09:58:18.063 回答