压缩器¶
压缩器是一个 HTTP 过滤器,它允许 Envoy 基于客户端请求将从上游服务发过来的数据进行压缩。 当带宽有限或者负载(payload)很大时,压缩是非常有用的,只不过代价是更高的 CPU 负载或者 把压缩卸载到一个压缩加速器。
Note
这个过滤器是为了替换 HTTP Gzip 过滤器
工作原理¶
当过滤器启用后,会根据请求和应答报文头判断是否需要压缩报文体。 如果请求与应答允许,则正文将被压缩,然后使用适当的报文头将其发送到客户端。
当前过滤器只支持 gzip compression 其它压缩库可作为扩展来支持。
配置示例如下:
http_filters:
- name: envoy.filters.http.compressor
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor
disable_on_etag_header: true
content_length: 100
content_type:
- text/html
- application/json
compressor_library:
name: text_optimized
typed_config:
"@type": type.googleapis.com/envoy.extensions.compression.gzip.compressor.v3.Gzip
memory_level: 3
window_bits: 10
compression_level: best_compression
compression_strategy: default_strategy
这些情况下,压缩器将不启用:
请求头中不包含 accept-encoding
请求头中虽然包含 accept-encoding ,但取值中不包含“gzip”或者“*”
请求头中 accept-encoding 取值包含“gzip” or “*”但权重配置“q=0” 需要注意的是:“gzip”优先级比“*”高。例如,当 accept-encoding 取值为“gzip;q=0,*;q=1”,过滤器将不会压缩。但如果它取值为 “*;q=0,gzip;q=1”,过滤器将进行压缩
请求头中 accept-encoding 中包含其它比“gzip”权重更高的压缩算法, 且该算法过滤器在处理链中存在。
应答报文头中包含 content-encoding
应答报文头中 cache-control 取值包含“no-transform”
应答报文头中 transfer-encoding 取值包含“gzip”
应答报文头中 content-type 取值不在这些当中:application/javascript, application/json, application/xhtml+xml, image/svg+xml, text/css, text/html, text/plain, text/xml
应答报文头中不包含 content-length 和 transfer-encoding
应答报文体小于 30 字节 (仅适用于 transfer-encoding 取值不为:chunked)
需要注意的是,如果过滤器配置的是 gzip 之外的扩展压缩库,将从扩展提供的报文头 accept-encoding 中获取 编码方式。
当压缩器生效,将有如下影响:
应答报文头中 content-length 字段将被去除
应答报文头中包含“transfer-encoding: chunked”且不包含“content-encoding”。
每个应答报文头中都会带上“vary: accept-encoding”
同时,即使由于不兼容的 “accept-encoding” 头部,压缩没有被启用,”vary: accept-encoding” 头部也可以被插入。 当给定兼容的 “accept-encoding” 仍可以被压缩时,这种情况就会发生。否则,如果未压缩的响应被 Envoy 前面的缓存代理缓存,那么该代理将不知道如何用兼容的 “accept-encoding” 从上游获取新传入的请求。
统计信息¶
所有配置压缩过滤器的指标前缀为 <stat_prefix>.compressor.<compressor_library.name>.<compressor_library_stat_prefix>.* 指标项如下:
名称 |
类型 |
描述 |
---|---|---|
compressed |
Counter |
已压缩的请求数 |
not_compressed |
Counter |
未压缩的请求数 |
no_accept_header |
Counter |
请求头不匹配的请求数 |
header_identity |
Counter |
请求头中包含 accept-encoding 的请求数 |
header_compressor_used |
Counter |
请求头中 accept-encoding 设置为“gzip”的请求数 |
header_compressor_overshadowed |
Counter |
由于已经匹配链路中其它过滤器而跳过的请求数 |
header_wildcard |
Counter |
请求头中 accept-encoding 设置为“*”的请求数 |
header_not_valid |
Counter |
请求头中 accept-encoding 取值不合法的请求数(比如“q=0”或者其它不支持的压缩方式) |
total_uncompressed_bytes |
Counter |
标记为需要压缩但未进行压缩的字节总数 |
total_compressed_bytes |
Counter |
标记为需要压缩且已经压缩的字节总数 |
content_length_too_small |
Counter |
标记为需要压缩但由于报文字节数太小未进行压缩的请求数 |
not_compressed_etag |
Counter |
由于扩展报文头而未进行压缩的请求数。只有当开启 disable_on_etag_header 时才有该指标 |