如何在Go中启用GRPC压缩

时间:2018-01-09 16:28:22

标签: go grpc

我看到了一些方法WithCompressionUseCompression,但我不太清楚它们是如何组合在一起的 - 这是一个简单的例子,说明放入客户端的内容以及放入服务器的内容会真的有帮助。

我的第一次尝试,

conn, err := grpc.Dial(
    addr,
    grpc.WithTimeout(timeout),
    grpc.WithCompressor(grpc.NewGZIPCompressor()),
    ...
当我打电话时,

导致了这个错误:

grpc: Decompressor is not installed for grpc-encoding \"gzip\"

2 个答案:

答案 0 :(得分:1)

有关压缩API的文档可在以下位置找到:https://github.com/grpc/grpc-go/blob/master/Documentation/compression.md

答案 1 :(得分:1)

根据文档,

grpc.WithCompressor不推荐使用DialOption。

您可以使用grpc.UseCompressor(gzip.Name) CallOption,它在通话级别

运行
var opts []grpc.CallOption
opts = append(callOptions, grpc.UseCompressor(gzip.Name))
opts = append(callOptions, ...)
opts = append(callOptions, ...)

err := grpc.Invoke(mycontext, "/myRpcFuntion", myInput, myOutput, myGrpcConn, opts...)

您无需致电RegisterCompressor。 gzip包导入会在init()函数

中为您执行此操作
func init() {
    c := &compressor{}
    c.poolCompressor.New = func() interface{} {
        return &writer{Writer: gzip.NewWriter(ioutil.Discard), pool: &c.poolCompressor}
    }
    encoding.RegisterCompressor(c)
}

在服务器端,您需要导入gzip包以确保gzip压缩器已注册。

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