Запуск нескольких микросервисов с несколькими докерами, создаваемыми с помощью NATS

#docker #docker-compose #nestjs #nats.io #nats-streaming-server

Вопрос:

Я новичок в микросервисах, и у меня есть проект по настройке нескольких микросервисов, проект настроен следующим образом. Каждое приложение nest js имеет

  • Приложение API, подключенное к порту
  • База данных
  • docker-создает файл, ответственный за создание контейнеров для каждого микросервиса.

Теперь то, что я делаю, — это иметь

ПРИЛОЖЕНИЕ ДЛЯ МИКРОСЕРВИСА Nest JS 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 для второго микросервиса и всех вновь созданных микросервисов. мой файл docker-compose для приложения NEST JS 1 выглядит следующим образом.

     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
 

Второе ГНЕЗДО JS microservice 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 и так далее.

Ответ №1:

да, убедитесь, что порты хоста заняты, если вы свяжете его через сетевой стек хоста. У вас может быть только одна служба, связанная с ip:port

Похоже, вы пытаетесь запустить два экземпляра NATS и позволить им присоединиться к одному и тому же кластеру NATS. Но, возможно, вам нужны два экземпляра для разработки. Вы просто хотите видеть сообщения, проходящие через него.

Вариант 1: просто поместите все в один файл и используйте depends_on и один и тот же узел NATS для обеих служб

Вариант 2: Используйте отдельный стек компоновки для обеспечения инфраструктуры NATS и используйте внешние ссылки.

Вариант 3.Определите пользовательскую сеть для кластера NATS, в которой каждый контейнер NATS получает собственный IP-адрес.

Но я бы начал с 1.

Комментарии:

1. привет, сейчас мы не можем сделать 1, так как у нас есть отдельные репозитории для каждого микросервиса.

2. Затем выберите Вариант 2. 😉