不同的编程语言和框架在压缩时会生成不同的配置文件。使用一致的方式为应用程序添加压缩过滤器(例如配置最小压缩字节、压缩级别、哪些响应默认情况下会被压缩等),可以更好地维护和管理压缩配置。本文介绍如何在ASM中使用ASMCompressor定义应用服务间调用的压缩配置。
前提条件
- 已添加ACK集群到ASM实例,且ASM实例版本为1.21及以上。具体操作,请参见添加集群到ASM实例和升级ASM实例。 
功能介绍
网格代理支持Gzip和Brotli两种算法。
- Gzip是一种广泛使用的压缩算法,被许多Web服务器和浏览器支持。Gzip压缩算法以较高的压缩比和较快的压缩速度而闻名,通常用于压缩静态和动态内容。 
- Brotli是一种先进的压缩算法,可以提供更高的压缩比和更快的解压速度,并在Web领域广泛使用。Brotli压缩算法通常用于压缩静态内容,例如HTML、CSS和JavaScript文件。 
Brotli相对于Gzip提供了更高的压缩比,但可能会对压缩速度产生一些影响。您可以根据实际的应用场景和性能需求选择压缩算法。
启用及验证Gzip压缩
步骤一:记录在未启用压缩时返回响应的大小
- 获取ASM网关地址。 - 登录ASM控制台,在左侧导航栏,选择。 
- 在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择。 
- 在入口网关页面,获取服务地址。 
 
- 在浏览器地址栏,输入 - http://{ASM网关地址}/productpage,访问Bookinfo应用。
- 打开浏览器的开发者模式,查看productpage请求返回响应的大小。 - 如下图所示,返回响应的大小为5.5 KB。  
步骤二:启用Gzip压缩
- 使用以下内容,创建ingressgateway-gzip.yaml文件。 - 关于字段的说明,请参见ASMCompressor CRD说明。 
- 执行以下命令,启用Gzip压缩功能。 - kubectl apply -f ingressgateway-gzip.yaml
步骤三:查看启用Gzip压缩后的效果
- 在浏览器地址栏,输入 - http://{ASM网关地址}/productpage,访问Bookinfo应用。
- 打开浏览器的开发者模式,查看productpage请求返回响应的大小。 - 如下图所示,返回响应的大小从原来的5.5 KB变为1.8 KB,表明Gzip压缩配置生效。  
步骤四:验证Brotli压缩
- 修改名称为bookinfo的VirtualService。 - 在bookinfo.yaml文件的 - spec.http下添加如下内容。- - directResponse: body: string: >- Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! status: 200 match: - uri: prefix: /helloworld- 更新后的YAML内容如下所示: 
- 执行以下命令,部署VirtualService。 - kubectl apply -f bookinfo.yaml
 
- 启用Brotli压缩。 - 使用以下内容,创建ingressgateway-brotli.yaml。 - 关于字段的说明,请参见ASMCompressor CRD说明。 
- 执行以下命令,启用Brotli压缩功能。 - kubectl apply -f ingressgateway-brotli.yaml
 
- 验证Brotli压缩是否生效。 - 执行以下命令,将请求 - /helloworld路径返回的内容存放到out.br文件中。- curl -I -H "Accept-Encoding: br" http://{ASM网关地址}/helloworld > out.br
- 安装Brotli。 - macOS:在Brew中执行 - brew install brotli命令进行安装。
- Windows:安装步骤参见brotli。 
 
- 在Brotli中执行以下命令,解压out.br文件。 - brotli -d out.br- 可以看到解压出来的文件out以及内容,表明Brotli压缩配置生效。 
 
步骤五:验证路由级别配置
- 经过步骤四的配置,对所有路径的响应都启用了压缩。使用如下方式进行测试: - curl ${ASM网关IP}/helloworld > helloworld_no_compress.html curl -H "Accept-Encoding: br" ${ASM网关IP}/helloworld > helloworld_compress.html curl ${ASM网关IP}/productpage > productpage_no_compress.html curl -H "Accept-Encoding: br" ${ASM网关IP}/productpage > productpage_compress.html
- 执行 - ls命令,查看这两个路径的响应压缩前后的大小对比:- ls -lh total 40 -rw-r--r--@ 1 user staff 37B 5 28 18:16 helloworld_compress.html -rw-r--r--@ 1 user staff 324B 5 28 18:15 helloworld_no_compress.html -rw-r--r--@ 1 user staff 1.2K 5 28 18:17 productpage_compress.html -rw-r--r--@ 1 user staff 5.2K 5 28 18:16 productpage_no_compress.html
- 修改虚拟服务,给helloworld对应的路由添加路由名称,修改后的bookinfo.yaml如下所示: 
- 在ASMCompressor中新增路由级别的配置,并禁用helloworld路由上的压缩功能。修改后的ASMCompressor如下所示: - apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMCompressor metadata: name: ingressgateway-gzip namespace: istio-system spec: compressor_library: brotli: quality: 5 window_bits: 15 isGateway: true portNumber: 80 request_direction_config: # 禁用请求压缩 common_config: enabled: default_value: false runtime_key: NOT_EXISTENT_KEY response_direction_config: common_config: content_type: - application/json - text/plain - text/html min_content_length: 100 disable_on_etag_header: true per_route_configs: # 新增的路由级别配置 - disabled: true route_match: vhost: route: name: helloworld-route # 这里填写VirtualService中配置的路由名称 workloadSelector: labels: istio: ingressgateway
- 执行以下命令,验证 - /helloworld路径响应的压缩配置已经禁用:- curl -H "Accept-Encoding: br" ${ASM网关IP}/helloworld > helloworld_route_disabled.html
- 再次执行 - ls命令,查看/helloworld路径当前的响应大小。- ls -lh total 48 -rw-r--r--@ 1 user staff 37B 5 28 18:16 helloworld_compress.html -rw-r--r--@ 1 user staff 324B 5 28 18:15 helloworld_no_compress.html -rw-r--r--@ 1 user staff 324B 5 28 19:29 helloworld_route_disabled.html -rw-r--r--@ 1 user staff 1.3K 5 28 19:30 productpage_compress.html -rw-r--r--@ 1 user staff 5.2K 5 28 18:16 productpage_no_compress.html- 可以看到,在路由级别禁用压缩功能是有效的。