Переписать 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 спроектированы таким образом, что обработчики ответов выполняются синхронно, т.е. обработчик ответа работает, больше ничего не будет запланировано в том же потоке. Это нормально, если обработчик ответов обрабатывает только данные, уже находящиеся в памяти, и не ожидает удаленных служб. Однако если вы сделаете сетевой запрос от обработчика ответа, весь поток будет заблокирован и абсолютно ничего не будет делать до тех пор, пока удаленная служба не ответит, что приведет к снижению производительности.