解压缩器¶
解压缩器是一个 HTTP 过滤器,它可以使 Envoy 支持双向解压缩数据。
它是如何工作的¶
当启用解压缩过滤器时,会检查头部,以确定是否应该对内容进行解压缩。这个内容将会被解压缩,并继续传输到剩余的其他过滤链。需要注意的是,解压缩会根据以下描述的规则分别对请求和响应进行独立工作。
当前过滤器只支持 gzip 压缩 。可以支持其他压缩库作为扩展。
过滤器的示例配置如下所示:
http_filters:
- name: decompressor
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.decompressor.v3.Decompressor
decompressor_library:
name: basic
typed_config:
"@type": type.googleapis.com/envoy.extensions.compression.gzip.decompressor.v3.Gzip
window_bits: 10
默认情况 下当发生如下情况,解压会 被跳过 :
请求/响应头部不包含 content-encoding 。
请求/响应头部包含 content-encoding ,但是不包含配置的解压缩器的内容编码。
请求/响应头部包含 cache-control ,该头的值包含 “no-transform”。
当解压缩被应用的时候,会发生如下情况:
content-length 会被从头部移除。
Note
如果需要更新头部的内容长度 content-length ,则可以将缓冲过滤器作为过滤链的一部分,以缓冲解压缩的帧,并最终更新头部。由于过滤器排序 filter ordering ,缓冲过滤器需要在请求中安装在解压缩过滤器之后,以及在响应中安装在解压器过滤器之前。
头部中内容编码 content-encoding 会被修改以删除已应用的解压缩。
x-envoy-decompressor-<decompressor_name>-<compressed/uncompressed>-bytes 尾部会被添加到请求/响应中以传达有关解压缩的信息。
对请求和响应使用不同的解压缩器¶
如果请求和响应需要不同的压缩库,则可以安装不同的解压缩过滤器仅针对请求或者响应启用。例如:
http_filters:
# This filter is only enabled for requests.
- name: envoy.filters.http.decompressor
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.decompressor.v3.Decompressor
decompressor_library:
name: small
typed_config:
"@type": "type.googleapis.com/envoy.extensions.compression.gzip.decompressor.v3.Gzip"
window_bits: 9
chunk_size: 8192
response_direction_config:
common_config:
enabled:
default_value: false
runtime_key: response_decompressor_enabled
# This filter is only enabled for responses.
- name: envoy.filters.http.decompressor
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.decompressor.v3.Decompressor
decompressor_library:
name: large
typed_config:
"@type": "type.googleapis.com/envoy.extensions.compression.gzip.decompressor.v3.Gzip"
window_bits: 12
chunk_size: 16384
request_direction_config:
common_config:
enabled:
default_value: false
runtime_key: request_decompressor_enabled
统计¶
每一个配置的解压缩过滤器都有一个以<stat_prefix>.decompressor.<decompressor_library.name>.<decompressor_library_stat_prefix>.<request/response>* 为根的统计,具有以下内容:
名称 |
类型 |
描述 |
---|---|---|
decompressed |
Counter |
压缩的请求/响应数。 |
not_decompressed |
Counter |
未压缩的请求/响应数。 |
total_uncompressed_bytes |
Counter |
所有标记为解压缩的请求/响应的未压缩字节总数。 |
total_compressed_bytes |
Counter |
标记为解压缩的所有请求/响应的总压缩字节。 |
解压缩库的其他统计参考以根为 <stat_prefix>.decompressor.<decompressor_library.name>.<decompressor_library_stat_prefix>.decompressor_library 的统计。