在 Go 伺服器上加入 Gzip Middleware 中繼器
Toby
Toby

話說最近因為有使用者提出想把 ArozOS 放到 Cloud VM 上面跑,所以想盡量壓縮 bandwidth 使用量,經過一大堆討論之後的結論就是在伺服器主要的檔案傳送之前先加個 gzip 壓縮器。

現時網上對於要應用 gzip middleware (我把它譯做「中繼器」,畢竟叫他做「中介軟體」好像怪怪的,跟中國大陸的叫法叫「中間件」又好像不太能表達意思)

gzip middleware 原理

這個原理很簡單,就是在資料發出去之前先經過一層 gzip 以減少傳送的資料量,系統由原本的

要求 –> Mux / Router –> Handler –> 回傳

變成

要求 –> Mux / Router –> Handler –> gzip 壓縮 –> 回傳

因為要解釋起來很麻煩所以我就直接把 Go module 放這裡了:

https://gist.github.com/tobychui/e31ca5be46e266cf52fc247dd38c9181

以下是一些使用例子:

if *enable_gzip {
    http.HandleFunc("/media/", gzipmiddleware.CompressFunc(serverMedia))
}else{
    http.HandleFunc("/media/", serverMedia)
}
fs := http.FileServer(http.Dir("./web"))
if *enable_gzip {
	//Gzip enabled. Always serve with gzip if header exists
	http.Handle("/", gzipmiddleware.Compress(fs))
} else {
	//Normal file server without gzip
	http.Handle("/", mroutner(fs))
}

效果

以 ArozOS 的 desktop.system 界面來看,節省的流量大約如圖所示

上:有開啟 gzip 中繼器
下:沒有開啟 gzip 中繼器

嘛,基本上就這麼簡單而已。