grpc 開發進階 - 使用壓縮器 compressor

現在網上大部分都是 grpc 相關的介紹,真正涉及到 grpc 的配置使用的文章還是比較少的
所以本系列着重介紹 grpc 開發時可以能會用到的一些配置

compressor

grpc 允許用戶自定義 compressor 來壓縮傳輸的內容,並且要求在服務端和客戶端都註冊使用的 compressor
grpc 已經提供了一個 gzip 的壓縮器,可以拿來直接使用,如果需要自定義 compressor 的話可以參考這個代碼

客戶端

  • 客戶端可以在調用具體 method 時,使用 UseCompressor 作爲 CallOption,
    啓用 compressor
import (
  "google.golang.org/grpc/encoding/gzip"
)
client.Echo(ctx, 
    &pb.EchoRequest{Message: msg},
    grpc.UseCompressor(gzip.Name)
)
  • 在創建 ClientConn 時,傳遞 WithDefaultCallOptions 作爲 DialOption , 這樣可以設置所有調用的默認 compressor
onn, err := grpc.Dial(*addr,
    grpc.WithDefaultCallOptions(
        grpc.UseCompressor(gzip.Name)
    )   
)

服務端

服務端同樣需要註冊 compressor, 並且根據客戶端的需求使用相應的 compressor
如果服務端沒有實現或註冊相應 compressor, 則會返回 Unimlemented 錯誤

import(
 _ "google.golang.org/grpc/encoding/gzip"
)

只需要在import 導入 compressor 包即可自動註冊


實際上,gzip.go init() 會調用 encoding.RegisterCompressor 來自動註冊

// https://github.com/grpc/grpc-go/blob/master/encoding/gzip/gzip.go
// Name is the name registered for the gzip compressor.
const Name = "gzip"

func init() {
	c := &compressor{}
	c.poolCompressor.New = func() interface{} {
		return &writer{Writer: gzip.NewWriter(ioutil.Discard), pool: &c.poolCompressor}
	}
	encoding.RegisterCompressor(c)
}

example: compression

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章