Переписать http-запрос на основе заголовка местоположения ответа - Istio

Описание:

Сделайте запрос к прокси Istio (1.0.6) для апстрима через virtual_service. Служба отвечает заголовком newuri с кодом httpStatus, т. Е. 307 - я знаю, что редирект должен работать по назначению с 302 и заголовком местоположения. Но я хочу сделать обработку перенаправления на основе ошибки http. Я пытался использовать envoyFilters с lua, но все функции связаны с обработкой потока (мод заголовков запрос / ответ), а не переписывают или пересылают запрос.

Итак, путь запроса выглядит так:

  • клиент делает запрос, т.е. curl http://foo/path
  • прокси перенаправляет запрос в апстрим
  • апстрим отвечает пользовательским заголовком с new_uri, т.е. http://blabla/path2 качестве значения
  • в то время как заголовок существует в ответе, прокси выполняет новый запрос к new_uri
  • клиент видит ответ от new_uri

Спасибо

0 ответов

В случае, если у вас есть предопределенный список вышестоящих хостов, вы можете посмотреть на плагин Envoy Retry. Этот механизм позволяет определить список предикатов Hosts, которые могут быть связаны с определенным условием повтора retry_on: т.е. по конкретному коду ошибки HTTP; и количество повторных серий num_retries таким образом, после того, как количество повторных попыток достигнет числа повторных попыток, политика повторных попыток Envoy выберет следующий хост из списка, определенного в retry_host_predicate,

{
  "retry_on": "...",
  "num_retries": "{...}",
  "per_try_timeout": "{...}",
  "retry_priority": "{...}",
  "retry_host_predicate": [],
  "host_selection_retry_max_attempts": "...",
  "retriable_status_codes": []
}

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

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