深入淺出瞭解華為雲 API 閘道器的 Gzip 功能

王氏南平發表於2023-11-10

Gzip 是什麼

Gzip 是一種用於資料壓縮的編碼格式,經常被使用在基於 HTTP 協議的網路傳輸中。Gzip 功能允許伺服器在傳輸資料是對其進行壓縮,從而減小傳輸的資料量,加快頁面載入速度,這對於節省頻寬和提高使用者體驗非常有用。本文將從 Gzip 使用場景、Gzip 原理、Gzip 在 nginx 中的應用以及華為雲 API 閘道器的 Gzip 功能實現幾個方面介紹 Gzip。

Gzip 使用場景

Gzip 能夠提升傳輸速度和降低頻寬消耗,因此適合應用 Gzip 的場景有很多。

網頁傳輸:在 web 開發中,使用 Gzip 可以減小檔案大小,從而加快頁面載入速度。

移動應用通訊:在移動應用中,使用 Gzip 可以降低行動網路的資料消耗,加快資料傳輸速度,提升使用者體驗。

檔案備份和傳輸:在進行檔案備份或者檔案傳輸時,使用 Gzip 可以減小備份檔案的大小,節省儲存空間和傳輸頻寬。

網路傳輸限制:在網路頻寬受限的環境下,使用 Gzip 可以減小資料傳輸量,提升網路效能。

API 通訊:對於 RESTful API 或其他資料介面的傳輸,使用 Gzip 可以降低傳輸的資料量,減少對網路頻寬的佔用,提升響應速度。


Gzip 原理

gzip 使用 deflate 演算法進行壓縮。其原理主要包括 LZ77 演算法以及 Huffman 編碼(哈夫曼編碼)。

LZ77 演算法

LZ77 演算法是將重複字串替換為長度距離對來達到壓縮的目的。長度是重複字串的長度,距離是重複字串與第一個出現該字串的距離,下圖是一個簡單的示例:


深入淺出瞭解華為雲 API 閘道器的 Gzip 功能


在 LZ77 演算法中,主要運用了基於滑動視窗的字典壓縮演算法。首先是滑動視窗:


深入淺出瞭解華為雲 API 閘道器的 Gzip 功能


以上圖為例,一開始,查詢區是沒有字元的。滑動視窗從 K 開始移動,依次在查詢區嘗試查詢當前指向字元及之後字元的最長匹配,直到滑動視窗區不再有字元為止。這裡就涉及到另外一個問題了,如何在查詢區中快速的找到與滑動視窗中匹配的字元,LZ77 顯然不會採取暴力遍歷查詢的方法,通常使用雜湊陣列來實現字典的快速搜尋。在雜湊陣列中有兩個陣列,一個陣列用來存放最新重複字串的雜湊地址,一個陣列用來解決雜湊衝突。具體以下圖為例進行說明:


深入淺出瞭解華為雲 API 閘道器的 Gzip 功能


當第一次掃描 ABC 時,對應陣列 1 中 4 號位置為空,因此不用轉化為長度距離對。當第二次掃描到 ABC 時,對應陣列 1 中 4 號位置存放的是 1,於是將 4 號位置替換為 6,再將 1 放置在陣列 2 中的 6 號位置,此時陣列 2 的 6 號位置存放的是 1,對當前字串後的字元繼續和 1 位置對應字元後的字元繼續進行匹配,記錄最長匹配字元長度。然後在陣列 2 中查詢 1 號位置,如果為空則結束匹配,最後將匹配到的最長字元替換為長度距離對。

Huffman 編碼

Huffman 編碼的原理是基於哈夫曼樹。哈夫曼樹是一種最優二叉樹,是一種帶權路徑長度最短的二叉樹。

以下是哈夫曼樹的構造過程:

假設有 A、B、C、D、E 五個字母,他們對應出現的次數分別為 5,6,8,12,20


深入淺出瞭解華為雲 API 閘道器的 Gzip 功能


構造哈夫曼樹的基本流程:將 A、B、C、D、E 看作是隻有一個結點的樹,其中出現的次數作為他們的權值。將權值和最小的兩個數進行合併稱為一個新樹,權值較小的樹作為左子樹,權值較大的樹作為右子樹,新樹的根結點權值為兩子樹之和,然後將新樹也加入到樹的集合中,重複上述流程知道又有一棵樹為止。

針對哈夫曼樹編碼, 左分支為 0,右分支為 1。可得出 A、B、C、D、E 的編碼如下:


深入淺出瞭解華為雲 API 閘道器的 Gzip 功能


從最後的編碼來看,出現次數最多的 E 的編碼長度比出現次數較少的 A 或 B 要少。最終頻率高的字元會使用較短的編碼,頻率低的字元會使用較長的編碼,總體的編碼長度就會變小,從而達到壓縮的結果。

Gzip 在 Nginx 中的應用

Nginx 作為當下很流行的開源網頁伺服器和反向代理伺服器,原生支援了 Gzip 的功能。但是在 Nginx 中 Gzip 功能預設是不開啟,需要在配置檔案中配置相關指令才可以開啟 Gzip 功能。常見的配置項如下:


深入淺出瞭解華為雲 API 閘道器的 Gzip 功能


華為雲 API 閘道器的 Gzip 功能

華為雲 API 閘道器(APIG)為企業和開發者提供的高效能、高可用、高安全的雲原生閘道器服務,融合安全、負載均衡、流量入口治理、微服務流量治理、運維等多項能力,也支援 Gzip 壓縮功能。使用者可以透過一鍵式開關控制 Gzip 功能的開啟。同時 APIG 還開放了壓縮等級,使用者可以透過配置不同的壓縮等級,根據自己的需求對 Gzip 功能進行效能調優。當一個客戶端傳送一個 HTTP 請求時,需要包含一個 Accept-Encoding 頭部用來指示客戶端支援的壓縮演算法。

APIG 會根據 GZIP 開關來判斷是否進行壓縮。在開關開啟的狀態下,APIG 會將響應內容壓縮,然後將壓縮後的響應傳送給客戶端(如果客戶端已經進行 Gzip 壓縮,那麼 APIG 將不會進行二次壓縮)。客戶端收到響應後,會根據響應頭部的 Content-Encoding 欄位判斷是否經過了壓縮。如果響應被壓縮了,客戶端會進行解壓縮,以獲取原始的內容。

可以參考以下步驟開啟 Gzip 開關及設定壓縮等級:

開啟華為雲 APIG 控制檯,依次進入例項管理-->配置引數,在頁面列表中找到引數 gzip 如下:


深入淺出瞭解華為雲 API 閘道器的 Gzip 功能


如上圖,gzip 功能為開啟狀態,且壓縮等級為 6。

此外,APIG 還提供了 Debug 功能用以除錯 Gzip 功能。首先依次開啟 API 列表, 然後點選建立 API。


深入淺出瞭解華為雲 API 閘道器的 Gzip 功能


在填寫好 API 詳細資訊後,在後端配置選項頁面選擇 Mock 後端,並且增加 header 引數-content-length(引數值需要大於等於 1028, 否則 gzip 功能將不生效。)


深入淺出瞭解華為雲 API 閘道器的 Gzip 功能


然後進入 API 的除錯介面,在 Headers 中新增引數:Accept-Encoding,對應引數值為 gzip。在響應結果中,如果有 Content-Encoding: gzip 出現,即代表 Gzip 功能生效。


深入淺出瞭解華為雲 API 閘道器的 Gzip 功能


Gzip 自發布以來,已經成為網際網路上常用的壓縮格式之一。各種高效能的開源代理如 Nginx、Envoy 等都原生支援 Gzip 的功能。在傳輸速度和降低頻寬消耗方面,Gzip 有著十分強大的優勢,希望本文能幫助到想要了解 Gzip 背後原理及其應用的人。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70034774/viewspace-2994806/,如需轉載,請註明出處,否則將追究法律責任。

相關文章