Как использовать Express Api Gateway в режиме Docker Swarm? - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть несколько простых REST API-сервисов, реализованных в Express. Эти сервисы работают в док-контейнерах в режиме роя. Также я пытаюсь использовать шлюз Express-API с этими сервисами. Шлюз Express API также работает в контейнере как часть роя Docker. Далее следует файл 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 ]

0 голосов
/ 29 апреля 2018

ТАК, я нашел, где я ошибался! Посмотрите на файл составления выше! Имена сервисов 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
0 голосов
/ 29 апреля 2018

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

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

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

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

Приветствия

V.

...