現在網上大部分都是 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