全部产品
Search
文档中心

服务网格 ASM:自定义请求头和响应头

更新时间:Feb 28, 2024

服务网格ASM中,VirtualService和EnvoyFilter都可以用来自定义请求头和响应头,但它们的使用场景和灵活性存在差异。本文介绍使用VirtualService和EnvoyFilter这两种资源自定义请求头和响应头的差异。

资源对比

VirtualService更适合简单、路由相关的请求和响应头部修改,而EnvoyFilter提供对Envoy代理进行深度定制的能力。您可以根据实际需求和下表进行权衡。

比较项

VirtualService

EnvoyFilter

抽象层级

提供一种较高级别的抽象,允许您在Istio的路由规则中直接定义请求头和响应头的添加或移除。这些路由规则更加易于理解和定义,是设置请求头和响应头的推荐方式。

提供一种较低级别的接口,允许您直接操作Envoy代理的配置。通过EnvoyFilter,您可以编写自定义的Lua脚本或者使用其他Envoy扩展来实现复杂的逻辑。这种方法更加强大和灵活,但也更加复杂,需要对Envoy配置有较深的了解。

易用性

遵循Istio的自定义资源定义(CRD),更易于配置和理解。

配置较为复杂,需要对Envoy的内部工作原理有一定的了解。正确编写EnvoyFilter需要对Envoy配置API的熟悉度较高,因此它的错误率也较高。

功能范围

可以满足大多数常见的头部操作需求,如简单地添加、修改或删除请求头和响应头。例如,它不仅支持将头部值设定为固定的静态字符串,还能够通过内置表达式动态生成请求和响应头部的值。这些表达式通常使用%符号包裹,可以引用请求属性等不同的动态内容。用于访问日志记录的所有HTTP命令运算符都可以在自定义请求或响应标头中指定,例如%UPSTREAM_CLUSTER%表示服务提供方的名称。更多信息,请参见config-access-log-command-operators

EnvoyFilter可以实现VirtualService无法实现的高级自定义和复杂的操作,例如执行条件检查、复杂的数据转换或调用外部服务。支持自定义值为通过代码实现的动态值。

适用场景

只需要在请求或响应中添加、移除或修改头部,并且这些操作与特定的路由规则相关联。

执行更深层次的请求或响应操作,或需要在不修改Istio的路由规则的情况下全局地改变头部。

相关文档