#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. 😉