Express-Gateway, Как выбрать конечную точку сервиса по шаблону URL? - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь получить несколько отдельных серверов в одном домене за шлюзом.В настоящее время к каждому из этих серверов можно получить доступ из внешнего мира через несколько имен.Наша команда по продажам хотела предоставить клиентам уникальный URL, поэтому, если сервер обслуживает 10 клиентов, у нас есть 10 записей CNAME, указывающих на него.

Как вы можете видеть, с 5 или 6 серверами число apiEndpoints довольно большой.Кроме того, новые CNAME могут создаваться в любой момент времени, что затрудняет управление жестким кодом apiEndpoints.

Возможно ли иметь динамический URL-адрес serviceEndpoint.Я думаю, что-то вроде этого:

apiEndpoints:
  legacy:
    host: '*.mydomain.com'
    paths: '/v1/*'
serviceEndpoints:
  legacyEndPoint:
    url: '${someVarWithValueofStar}.internal.com'
pipelines:
  default:
    apiEndpoints:
      - legacy:
    policies:
      - proxy:
          - action:
              serviceEndpoint: legacyEndPoint

По сути, я хочу добиться перенаправления всех x.mydomain.com на x.internal.com, где x может быть чем угодно.

Могу ли я использовать переменные в строках URL?Есть ли способ получить строку, которая соответствует шаблону в хосте?Есть ли другие варианты решения этой проблемы?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

В итоге я взломал прокси-плагин для своих нужд. Очень простой и требует больше работы и тестирования, но вот с чего я начал:

Плагин прокси (my-proxy)

const httpProxy = require("http-proxy");

/**
 * This is a very rudimentary proxy plugin for the express gateway framework.
 * Basically it will redirect requests xxx.external.com to xxx.internal.com
 * Where xxx can be any name and the destination comes from providing a 
 * service endpoint with a http://*.destination.com url
 * @param {*} params 
 * @param {*} config 
 */
module.exports = function (params, config) {
  const serviceEndpointKey = params.serviceEndpoint;
  const changeOrigin = params.changeOrigin;
  const endpoint = config.gatewayConfig.serviceEndpoints[serviceEndpointKey];
  const url = endpoint.url;
  const reg = /(\/\/\*\.)(\S+)/;
  const match = reg.exec(url);
  const domain = match[2];
  const proxy = httpProxy.createProxyServer({changeOrigin : changeOrigin});
  proxy.on("error", (err, req, res) => {
    console.error(err);
    if (!res.headersSent) {
      res.status(502).send('Bad gateway.');
    } else {
      res.end();
    }
  });
  return (req, res, next) => {
    const hostname = req.hostname;
    const regex = /^(.*?)\./
    const tokens = regex.exec(hostname)
    const serverName = tokens[1];
    const destination = req.protocol + "://" + serverName + "." + domain;

    proxy.web(req, res, {target : destination});
  };
};

gateway.config.xml

http:
  port: 8080
apiEndpoints:
  legacy:
    host: '*.external.com'
    paths: '/v1/*'
serviceEndpoints:
  legacy_end_point:
    url: 'https://*.internal.com'
policies:
  - my-proxy
pipelines:
  default:
    apiEndpoints:
      - legacy
    policies:
      - my-proxy:
          - action:
              serviceEndpoint: legacy_end_point 
              changeOrigin: true

Все сводится к регулярному выражению при разборе групповых символов в хостах и ​​URL-адресах apiEndpoints и serviceEndpoints, пока ничего сложного. Я посмотрел исходный код встроенного прокси-плагина и не думаю, что мой наивный подход очень хорошо подойдет, но он работает для того, что мне нужно.

0 голосов
/ 18 мая 2018

спасибо за вопрос, я думаю, что об этом будет много спрашиваться в последующие месяцы.

В Express Gateway есть поддержка переменных среды;к сожалению, прямо сейчас apiEndpoint может быть только одной и четко определенной конечной точкой без каких-либо возможностей замены.

Это то, что мы, вероятно, изменим в ближайшем будущем - с помощью API Proxy Table, который позволит вамвставьте несколько более сложных шаблонов.

В случае, если вам это нужно, я бы пригласил вас открыть вопрос , чтобы все в команде знали о такой функции, и мы могли бы расставить приоритетыэто эффективно.

Тем временем, к сожалению, вам придется иметь дело с многочисленными точками ApiEndpoints

V.

...