如何在 Go 中启用 GRPC 压缩

Bry*_*yan 6 go grpc

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

我的第一次尝试,

conn, err := grpc.Dial(
    addr,
    grpc.WithTimeout(timeout),
    grpc.WithCompressor(grpc.NewGZIPCompressor()),
    ...
Run Code Online (Sandbox Code Playgroud)

当我拨打电话时导致此错误:

grpc: Decompressor is not installed for grpc-encoding \"gzip\"
Run Code Online (Sandbox Code Playgroud)

cvi*_*igo 7

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...)
Run Code Online (Sandbox Code Playgroud)

您不需要调用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)
}
Run Code Online (Sandbox Code Playgroud)

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

import _ "google.golang.org/grpc/encoding/gzip"
Run Code Online (Sandbox Code Playgroud)