全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用ASMCompressor定義應用服務間調用的壓縮配置

更新時間:Jun 30, 2024

不同的程式設計語言和架構在壓縮時會產生不同的設定檔。使用一致的方式為應用程式添加壓縮過濾器(例如配置最小壓縮位元組、壓縮層級、哪些響應預設情況下會被壓縮等),可以更好地維護和管理壓縮配置。本文介紹如何在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

    可以看到,在路由層級禁用壓縮功能是有效。