深入淺出瞭解華為雲 API 閘道器的 Gzip 功能
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 演算法是將重複字串替換為長度距離對來達到壓縮的目的。長度是重複字串的長度,距離是重複字串與第一個出現該字串的距離,下圖是一個簡單的示例:
在 LZ77 演算法中,主要運用了基於滑動視窗的字典壓縮演算法。首先是滑動視窗:
以上圖為例,一開始,查詢區是沒有字元的。滑動視窗從 K 開始移動,依次在查詢區嘗試查詢當前指向字元及之後字元的最長匹配,直到滑動視窗區不再有字元為止。這裡就涉及到另外一個問題了,如何在查詢區中快速的找到與滑動視窗中匹配的字元,LZ77 顯然不會採取暴力遍歷查詢的方法,通常使用雜湊陣列來實現字典的快速搜尋。在雜湊陣列中有兩個陣列,一個陣列用來存放最新重複字串的雜湊地址,一個陣列用來解決雜湊衝突。具體以下圖為例進行說明:
當第一次掃描 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
構造哈夫曼樹的基本流程:將 A、B、C、D、E 看作是隻有一個結點的樹,其中出現的次數作為他們的權值。將權值和最小的兩個數進行合併稱為一個新樹,權值較小的樹作為左子樹,權值較大的樹作為右子樹,新樹的根結點權值為兩子樹之和,然後將新樹也加入到樹的集合中,重複上述流程知道又有一棵樹為止。
針對哈夫曼樹編碼, 左分支為 0,右分支為 1。可得出 A、B、C、D、E 的編碼如下:
從最後的編碼來看,出現次數最多的 E 的編碼長度比出現次數較少的 A 或 B 要少。最終頻率高的字元會使用較短的編碼,頻率低的字元會使用較長的編碼,總體的編碼長度就會變小,從而達到壓縮的結果。
Gzip 在 Nginx 中的應用
Nginx 作為當下很流行的開源網頁伺服器和反向代理伺服器,原生支援了 Gzip 的功能。但是在 Nginx 中 Gzip 功能預設是不開啟,需要在配置檔案中配置相關指令才可以開啟 Gzip 功能。常見的配置項如下:
華為雲 API 閘道器的 Gzip 功能
華為雲 API 閘道器(APIG)為企業和開發者提供的高效能、高可用、高安全的雲原生閘道器服務,融合安全、負載均衡、流量入口治理、微服務流量治理、運維等多項能力,也支援 Gzip 壓縮功能。使用者可以透過一鍵式開關控制 Gzip 功能的開啟。同時 APIG 還開放了壓縮等級,使用者可以透過配置不同的壓縮等級,根據自己的需求對 Gzip 功能進行效能調優。當一個客戶端傳送一個 HTTP 請求時,需要包含一個 Accept-Encoding 頭部用來指示客戶端支援的壓縮演算法。
APIG 會根據 GZIP 開關來判斷是否進行壓縮。在開關開啟的狀態下,APIG 會將響應內容壓縮,然後將壓縮後的響應傳送給客戶端(如果客戶端已經進行 Gzip 壓縮,那麼 APIG 將不會進行二次壓縮)。客戶端收到響應後,會根據響應頭部的 Content-Encoding 欄位判斷是否經過了壓縮。如果響應被壓縮了,客戶端會進行解壓縮,以獲取原始的內容。
可以參考以下步驟開啟 Gzip 開關及設定壓縮等級:
開啟華為雲 APIG 控制檯,依次進入例項管理-->配置引數,在頁面列表中找到引數 gzip 如下:
如上圖,gzip 功能為開啟狀態,且壓縮等級為 6。
此外,APIG 還提供了 Debug 功能用以除錯 Gzip 功能。首先依次開啟 API 列表, 然後點選建立 API。
在填寫好 API 詳細資訊後,在後端配置選項頁面選擇 Mock 後端,並且增加 header 引數-content-length(引數值需要大於等於 1028, 否則 gzip 功能將不生效。)
然後進入 API 的除錯介面,在 Headers 中新增引數:Accept-Encoding,對應引數值為 gzip。在響應結果中,如果有 Content-Encoding: gzip 出現,即代表 Gzip 功能生效。
Gzip 自發布以來,已經成為網際網路上常用的壓縮格式之一。各種高效能的開源代理如 Nginx、Envoy 等都原生支援 Gzip 的功能。在傳輸速度和降低頻寬消耗方面,Gzip 有著十分強大的優勢,希望本文能幫助到想要了解 Gzip 背後原理及其應用的人。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70034774/viewspace-2994806/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入淺出MyBatis:「對映器」全瞭解MyBatis
- API 閘道器 KongAPI
- api閘道器設計API
- 淺談服務閘道器和聯邦雲
- 開放API閘道器實踐(一) ——設計一個API閘道器API
- 用友雲開放平臺之API閘道器API
- 體驗下,大廠在使用功能的API閘道器!API
- API閘道器,企業級閘道器可擴充套件API套件
- 高效能API閘道器(1)、微服務API閘道器架構設計API微服務架構
- 淺析阿里雲API閘道器的產品架構和常見應用場景阿里API架構
- 什麼是閘道器?閘道器的作用是什麼,閘道器的作用詳解
- API 閘道器策略二三事API
- 華為雲釋出CodeArts API,為API護航API
- 深入淺出瞭解“裝箱與拆箱”
- 雲原生2.0閘道器API標準發展趨勢API
- 雲原生 API 閘道器,gRPC-Gateway V2 初探APIRPCGateway
- Spring Boot整合Zuul API閘道器Spring BootZuulAPI
- 深入淺出:瞭解時序資料庫 InfluxDB資料庫UX
- 成本直降50% | 阿里雲釋出雲原生閘道器,開啟下一代閘道器新程式阿里
- 淺談網路-閘道器與路由路由
- API閘道器:第8層網路API
- 微服務設計中的API閘道器模式微服務API模式
- kong 一個高效能的 API 閘道器API
- Zilla:一個事件驅動的API閘道器事件API
- API 閘道器的10個最常見用例API
- 閘道器限流功能效能最佳化
- 阿里雲微服務引擎MSE釋出閘道器功能,開啟微服務“大門”雲化時代阿里微服務
- 介面開放太麻煩?試試阿里雲API閘道器吧阿里API
- 深入分析四層/七層閘道器
- 使用路由閘道器的全域性過濾功能路由
- 【知識分享】安全閘道器的功能特點
- 雲原生閘道器~文章彙總
- 拆輪子:閘道器GOKU-API-GatewayGoAPIGateway
- 微服務實踐分享(2)api閘道器微服務API
- 八步部署NGINX Plus API閘道器NginxAPI
- 如何建設企業級API閘道器API
- 微服務基礎——厲害了!API閘道器微服務API
- 開放API閘道器實踐(三) —— 限流API