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