grpc 开发进阶 - 使用压缩器 compressor
获取更好的阅读体验
http://icebergu.com/archives/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