使用ASMCompressor定义应用服务间调用的压缩配置

不同的编程语言和框架在压缩时会生成不同的配置文件。使用一致的方式为应用程序添加压缩过滤器(例如配置最小压缩字节、压缩级别、哪些响应默认情况下会被压缩等),可以更好地维护和管理压缩配置。本文介绍如何在ASM中使用ASMCompressor定义应用服务间调用的压缩配置。

前提条件

功能介绍

网格代理支持Gzip和Brotli两种算法。

  • Gzip是一种广泛使用的压缩算法,被许多Web服务器和浏览器支持。Gzip压缩算法以较高的压缩比和较快的压缩速度而闻名,通常用于压缩静态和动态内容。

  • Brotli是一种先进的压缩算法,可以提供更高的压缩比和更快的解压速度,并在Web领域广泛使用。Brotli压缩算法通常用于压缩静态内容,例如HTML、CSS和JavaScript文件。

Brotli相对于Gzip提供了更高的压缩比,但可能会对压缩速度产生一些影响。您可以根据实际的应用场景和性能需求选择压缩算法。

启用及验证Gzip压缩

步骤一:记录在未启用压缩时返回响应的大小

  1. 获取ASM网关地址。

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 入口网关

    3. 入口网关页面,获取服务地址。

  2. 在浏览器地址栏,输入http://{ASM网关地址}/productpage,访问Bookinfo应用。

  3. 打开浏览器的开发者模式,查看productpage请求返回响应的大小。

    如下图所示,返回响应的大小为5.5 KB。

    215BDB4C-576C-45ae-89ED-C378C13BB925.png

步骤二:启用Gzip压缩

  1. 使用以下内容,创建ingressgateway-gzip.yaml文件。

    关于字段的说明,请参见ASMCompressor CRD说明

    展开查看ingressgateway-gzip.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMCompressor
    metadata:
      name: ingressgateway-gzip
      namespace: istio-system
    spec:
      compressor_library:
        gzip:
          compression_level: BEST_COMPRESSION
          compression_strategy: DEFAULT_STRATEGY
          memory_level: 9
          window_bits: 15
      isGateway: true
      portNumber: 80
      response_direction_config:
        common_config:
          content_type:
          - application/json
          - text/plain
          - text/html
          min_content_length: 100
        disable_on_etag_header: true
      workloadSelector:
        labels:
          istio: ingressgateway
  2. 执行以下命令,启用Gzip压缩功能。

    kubectl apply -f ingressgateway-gzip.yaml

步骤三:查看启用Gzip压缩后的效果

  1. 在浏览器地址栏,输入http://{ASM网关地址}/productpage,访问Bookinfo应用。

  2. 打开浏览器的开发者模式,查看productpage请求返回响应的大小。

    如下图所示,返回响应的大小从原来的5.5 KB变为1.8 KB,表明Gzip压缩配置生效。

    22.png

步骤四:验证Brotli压缩

  1. 修改名称为bookinfo的VirtualService。

    1. 在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内容如下所示:

      展开查看修改后的bookinfo.yaml

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: bookinfo
      spec:
        gateways:
          - bookinfo-gateway
        hosts:
          - '*'
        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
          - match:
              - uri:
                  exact: /productpage
              - uri:
                  prefix: /static
              - uri:
                  exact: /login
              - uri:
                  exact: /logout
              - uri:
                  prefix: /api/v1/products
            route:
              - destination:
                  host: productpage
                  port:
                    number: 9080
      
    2. 执行以下命令,部署VirtualService

      kubectl apply -f bookinfo.yaml
  2. 启用Brotli压缩。

    1. 使用以下内容,创建ingressgateway-brotli.yaml。

      关于字段的说明,请参见ASMCompressor CRD说明

      展开查看ingressgateway-brotli.yaml

      apiVersion: istio.alibabacloud.com/v1beta1
      kind: ASMCompressor
      metadata:
        name: ingressgateway-brotli
        namespace: istio-system
      spec:
        compressor_library:
          brotli:
            quality: 5
            window_bits: 15
        isGateway: true
        portNumber: 80
        response_direction_config:
          common_config:
            content_type:
            - application/json
            - text/plain
            - text/html
            min_content_length: 100
          disable_on_etag_header: true
        workloadSelector:
          labels:
            istio: ingressgateway
    2. 执行以下命令,启用Brotli压缩功能。

      kubectl apply -f ingressgateway-brotli.yaml
  3. 验证Brotli压缩是否生效。

    1. 执行以下命令,将请求/helloworld路径返回的内容存放到out.br文件中。

      curl -I  -H "Accept-Encoding: br" http://{ASM网关地址}/helloworld > out.br
    2. 安装Brotli。

      • macOS:在Brew中执行brew install brotli命令进行安装。

      • Windows:安装步骤参见brotli

    3. 在Brotli中执行以下命令,解压out.br文件。

      brotli -d out.br

      可以看到解压出来的文件out以及内容,表明Brotli压缩配置生效。

步骤五:验证路由级别配置

  1. 经过步骤四的配置,对所有路径的响应都启用了压缩。使用如下方式进行测试:

    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
  2. 执行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
  3. 修改虚拟服务,给helloworld对应的路由添加路由名称,修改后的bookinfo.yaml如下所示:

    展开查看修改后YAML

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: bookinfo
    spec:
      gateways:
        - bookinfo-gateway
      hosts:
        - '*'
      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
          name: helloworld-route    # 给路由指定名称,方便压缩插件进行匹配。
        - match:
            - uri:
                exact: /productpage
            - uri:
                prefix: /static
            - uri:
                exact: /login
            - uri:
                exact: /logout
            - uri:
                prefix: /api/v1/products
          route:
            - destination:
                host: productpage
                port:
                  number: 9080
  4. 在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
      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
  5. 执行以下命令,验证/helloworld路径响应的压缩配置已经禁用:

    curl -H "Accept-Encoding: br" ${ASM网关IP}/helloworld > helloworld_route_disabled.html
  6. 再次执行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

    可以看到,在路由级别禁用压缩功能是有效的。