1

描述:

通过 virtual_service 向上游请求 Istio (1.0.6) 代理。服务使用标头newuri响应,带有httpStatus代码,即 307 - 我知道重定向应该由 designe 与 302 和位置标头一起使用。但我想根据 http 错误进行重定向处理。我尝试将envoyFilters与 lua 一起使用,但所有功能都与流处理(请求/响应头模块)有关,而不是重写或请求转发。

所以请求路径是这样的:

  • 客户端正在发出请求,即 curl http://foo/path
  • 代理正在将请求转发到上游
  • 上游响应带有 new_uri 的自定义标头,即http://blabla/path2作为值
  • 响应代理中存在标头时正在向 new_uri 发出新请求
  • 客户看到来自 new_uri 的响应

谢谢

4

1 回答 1

0

如果您有预定义的上游主机列表,您可以考虑查看 Envoy Retry 插件。此机制允许您确定可以与某些特定重试条件相关联的主机谓词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 代理都是以同步执行响应处理程序的方式设计的,即同时响应处理程序正在运行,不会在同一个线程中安排其他任何事情。这很好,只要响应处理程序只处理内存中已经存在的数据并且不等待远程服务。但是,如果您从响应处理程序发出网络请求,则整个线程将被阻塞,并且在远程服务回复之前完全不执行任何操作,这将导致性能下降。

于 2019-03-21T14:13:42.483 回答