簡體   English   中英

使用 NATS 組合多個 docker 運行多個微服務

[英]Running Multiple Microservices with multiple docker compose with NATS

我是微服務的新手,我有一個設置多個微服務的項目,該項目是這樣設置的。 每個 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,依此類推。

是的,如果您通過主機網絡堆棧鏈接它,請確保主機端口被占用。 您只能將一項服務鏈接到ip:port

看起來您試圖啟動兩個 NATS 實例並讓它們加入同一個 NATS 集群。 但也許您需要兩個實例進行開發。 您只想查看通過它的消息。

選項 1:只需將所有內容放在一個 compose 中,並為兩個服務使用 depends_on 和相同的 NATS 節點

選項 2:使用單獨的組合堆棧來配置您的 NATS 基礎架構並使用extrnal_links

選項 3:為 NATS 集群定義自定義網絡,其中每個 NATS 容器都有自己的 iP。

但我會從 1 開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM