Как использовать Express Api Gateway в режиме Docker Swarm?

У меня есть несколько простых REST API-сервисов, реализованных в Express. Эти сервисы выполняются в док-контейнерах в режиме роя. Также я пытаюсь использовать шлюз Express-API с этими сервисами. Экспресс-шлюз API также запускается в контейнере как часть Docker Swarm. Следующий файл Dockercompose

 version: "3"
services:
  firstService:
    image: chaitanyaw/firstrepository:first
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
    ports:
        - '3000:3000'
    networks:
      - webnet
  apiGateway:
    image: firstgateway:latest
    deploy:
      restart_policy:
        condition: on-failure
    ports:
      - '80:80'
    networks: 
      - webnet
  visualizer:
    image: dockersamples/visualizer:latest
    ports:
     - 8080:8080
    volumes: 
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      placement:
         constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

также следует файл gateway.config

http:
  port: 80
admin:
  port: 9876
  hostname: localhost
apiEndpoints:
  api:
    host: 192.168.99.100
    paths: '/ip'
  localApi:
    host: 192.168.99.100
    paths: '/'
serviceEndpoints:
  httpbin:
    url: 'https://httpbin.org'
  services:
    urls:
      - 'http://192.168.99.100:3000/serviceonerequest'
      - 'http://192.168.99.100:3000/servicetwo'
policies:
  - basic-auth
  - cors
  - expression
  - key-auth
  - log
  - oauth2
  - proxy
  - rate-limit
pipelines:
  default:
    apiEndpoints:
      - api
    policies:
    # Uncomment `key-auth:` when instructed to in the Getting Started guide.
    # - key-auth:
      - proxy:
          - action:
              serviceEndpoint: httpbin 
              changeOrigin: true
  customPipeline:
    apiEndpoints:
      - localApi
    policies:
      - proxy:
        - action:
            serviceEndpoint: services
            changeOrigin: true

Ip '192.168.99.100' - это ip док-машины. Если я запускаю стек, используя вышеуказанный файл gateway.config, все работает нормально. Однако, если я заменю

services:
    urls:
      - 'http://192.168.99.100:3000/serviceonerequest'
      - 'http://192.168.99.100:3000/servicetwo'

с

services:
    urls:
      - 'http://services_firstService:3000/serviceonerequest'
      - 'http://services_firstService:3000/servicetwo'

Я получаю плохие ворота! Этот док-рой запускает оверлейную сеть "webnet". Итак, я должен иметь возможность использовать имя службы в качестве имени хоста в файле gateway.config по этой ссылке. В приведенном выше рабочем случае с использованием IP сервисы становятся доступными "за пределами" шлюза, который я не желаю. Что случилось?

2 ответа

Итак, я нашел, где я ошибался! Посмотрите на файл compose выше! Имена сервисов firstService (заглавная S!). Теперь, если бы я использовал

urls:
      - 'http://services_firstService:3000/serviceonerequest'
      - 'http://services_firstService:3000/servicetwo'

API-шлюз будет продолжать искать services_firstservice (обратите внимание на маленькие 's' в firstService), который, очевидно, отсутствует в оверлейной сети! Теперь я изменил имена на маленький регистр, и он работает так, как ожидалось! Вот новый Docker-compose файл

version: "3"
services:
  firstservice:
    image: chaitanyaw/firstrepository:first
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
    networks:
      - webnet
  apigateway:
    image: firstgateway:latest
    deploy:
      restart_policy:
        condition: on-failure
    ports:
      - '80:80'
    networks: 
      - webnet
  visualizer:
    image: dockersamples/visualizer:latest
    ports:
     - 8080:8080
    volumes: 
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      placement:
         constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

Также здесь находится файл gateway.config

http:
  port: 80
admin:
  port: 9876
  hostname: localhost
apiEndpoints:
  api:
    host: 192.168.99.100
    paths: '/ip'
  localApi:
    host: 192.168.99.100
    paths: '/'
serviceEndpoints:
  httpbin:
    url: 'https://httpbin.org'
  services:
    urls:
      - 'http://services_firstservice:3000/serviceonerequest'
      - 'http://services_firstservice:3000/servicetwo'
policies:
  - basic-auth
  - cors
  - expression
  - key-auth
  - log
  - oauth2
  - proxy
  - rate-limit
pipelines:
  default:
    apiEndpoints:
      - api
    policies:
    # Uncomment `key-auth:` when instructed to in the Getting Started guide.
    # - key-auth:
      - proxy:
          - action:
              serviceEndpoint: httpbin 
              changeOrigin: true
  customPipeline:
    apiEndpoints:
      - localApi
    policies:
      - proxy:
        - action:
            serviceEndpoint: services
            changeOrigin: true

С точки зрения шлюза, в конфигурации нет ничего плохого. До тех пор, пока DNS-имя может быть разрешено правильно, запрос должен пройти без проблем.

То, что я хотел бы сделать, это войти в контейнер шлюза и попытаться ping две услуги. Если что-то пойдет не так, то, скорее всего, docker-compose.yml Файл имеет некоторые проблемы.

Я бы попытался удалить network ключ, например. Сеть создается неявным образом, поэтому вам не нужна эта часть.

Кроме того - я не думаю, что DNS-имя для службы services_firstService; Я бы попробовал с firstService непосредственно.

Ура,

V.

Другие вопросы по тегам