#node.js #docker-compose #microservices #express-gateway #http-status-code-502
#node.js #docker-compose #микросервисы #экспресс-шлюз #http-status-code-502
Вопрос:
Я пытался создать архитектуру микросервисов NodeJS с помощью Docker.
В настоящее время у меня есть 2 службы: API аутентификации и CRUD API пользователей. Теперь моя цель — настроить шлюз с помощью Express-Gateway.
Я следил за многими учебными пособиями в Интернете, чтобы попытаться настроить его, но всякий раз, когда я пытаюсь сделать запрос к шлюзу (действуя как прокси), он отправляет 502 bad gateway ответ..
ошибка в журналах express-gateway
Мой docker-compose.yml :
networks:
goodfood:
driver: bridge
services:
gateway:
container_name: gateway
image: 'node:17-alpine'
# env_file:
# - ./gateway/.env
working_dir: /usr/src/app
volumes:
- './gateway:/usr/src/app'
command: npm run dev
ports:
- '8080:8080'
networks:
- goodfood
auth:
container_name: auth
image: 'node:17-alpine'
# env_file:
# - ./auth/.env
working_dir: /usr/src/app
volumes:
- './auth:/usr/src/app'
command: npm run dev
ports:
- '3002:3000'
networks:
- goodfood
users:
container_name: users
image: 'node:17-alpine'
env_file:
- ./users/api/.env
working_dir: /usr/src/app
volumes:
- './users/api:/usr/src/app'
command: npm run dev
ports:
- '3001:3000'
networks:
- goodfood
depends_on:
- users-db
users-db:
container_name: users-db
image: postgres
restart: always
env_file:
- ./users/db/.env
volumes:
- './users/db/data:/var/lib/postgresql/data'
- './users/db/scripts/init.sql:/docker-entrypoint-initdb.d/init.sql'
ports:
- '5432:5432'
networks:
- goodfood
users-adminer:
container_name: users-adminer
restart: unless-stopped
image: adminer
ports:
- '8181:8080'
networks:
- goodfood
depends_on:
- users-db
И мой gateway.config.yml :
http:
port: 8080
admin:
port: 9876
host: localhost
apiEndpoints:
users:
path: ['/users', '/users/*']
auth:
path: ['/auth', '/auth/*']
serviceEndpoints:
users:
url: 'http://users:3001'
auth:
url: 'http://auth:3002'
policies:
- log
- proxy
# - jwt
# - request-transformer
pipelines:
authPipeline:
apiEndpoints:
- auth
policies:
- log:
action:
message: 'auth ${req.method}'
- proxy:
- action:
serviceEndpoint: auth
changeOrigin: true
usersPipeline:
apiEndpoints:
- users
policies:
- log:
action:
message: 'users ${req.method}'
- proxy:
- action:
serviceEndpoint: users
changeOrigin: true
# - jwt:
# action:
# secretOrPublicKey: 'goodfood'
# checkCredentialExistence: false
# - request-transformer:
# action:
# body:
# add:
# user: req.user
Если вам нужна дополнительная информация, есть репозиторий github: https://github.com/KIVTVN/goodfood/tree/master
Комментарии:
1. Можете ли вы поместить содержимое ваших файлов в вопрос в виде текста? Отображение файла в виде двух скриншотов бесполезно.
2. github.com/KIVTVN/goodfood/tree/master Я разместил его на github.
3. Существует официальный образ докера Express Gateway. Использование этого исправило по крайней мере одну проблему в прошлом. Я попытаюсь рассмотреть это чуть позже.
4. Спасибо за вашу помощь, я постараюсь использовать образ докера express-gateway, чтобы посмотреть, работает ли он для меня.
5. Где сопоставление имен пользователей и хостов авторизации с IP-адресом? (Для тестирования я поместил их в свой файл hosts с IP-адресом для localhost.)
Ответ №1:
Проблема заключается в вашем gateway-config.xml досье. Он неправильно ссылается на порты, определенные в docker-compose.xml .
docker-compose.xml команда ports — это HOST:CONTAINER , поэтому то, что хост называет 3001 для контейнера users, является портом 3000 в Docker. Express Gateway работает в Docker, поэтому конечным точкам службы необходимо ссылаться на порты так, как они отображаются в других контейнерах (они различаются внутренним именем хоста, как определено в docker-compose.xml файл, а не по порту на этом уровне):
serviceEndpoints:
users:
url: http://users:3000
auth:
url: http://auth:3000
Если вы хотите получить доступ к этим URL-адресам извне Docker, вам нужно указать порт (3001, 3002 и т. Д.).
Комментарии:
1. Большое вам спасибо, это сработало!
2. @Mvrs тогда вы примете этот ответ? (Для этого нажмите на флажок.)