Express-Gateway — 502 неисправных шлюза с docker-составление архитектуры микросервисов Nodejs

#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 ответ..

ошибка ответа в PostMan

ошибка в журналах 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 тогда вы примете этот ответ? (Для этого нажмите на флажок.)