> 现在网上大部分都是 grpc 相关的介绍,真正涉及到 grpc 的配置使用的文章还是比较少的
> 所以本系列着重介绍 grpc 开发时可以能会用到的一些配置
compressor
---
grpc 允许用户自定义 compressor 来压缩传输的内容,并且**要求在服务端和客户端都注册使用的 *compressor***
grpc 已经提供了一个 [gzip](https://github.com/grpc/grpc-go/blob/master/encoding/gzip/gzip.go) 的压缩器,可以拿来直接使用,如果需要自定义 *compressor* 的话可以参考这个代码
客户端
---
* **客户端可以在调用具体 method 时,使用 [UseCompressor](https://godoc.org/google.golang.org/grpc#UseCompressor) 作为 CallOption,
启用 *compressor***
```go
import (
"google.golang.org/grpc/encoding/gzip"
)
client.Echo(ctx,
&pb.EchoRequest{Message: msg},
grpc.UseCompressor(gzip.Name)
)
```
* **在创建 ClientConn 时,传递 [WithDefaultCallOptions](https://godoc.org/google.golang.org/grpc#WithDefaultCallOptions) 作为 DialOption , 这样可以设置所有调用的默认 *compressor***
```go
onn, err := grpc.Dial(*addr,
grpc.WithDefaultCallOptions(
grpc.UseCompressor(gzip.Name)
)
)
```
服务端
---
服务端同样需要注册 *compressor*, 并且根据客户端的需求使用相应的 *compressor*
如果服务端没有实现或注册相应 compressor, 则会返回 `Unimlemented` 错误
```go
import(
_ "google.golang.org/grpc/encoding/gzip"
)
```
**只需要在import 导入 compressor 包即可自动注册**
---
实际上,gzip.go init() 会调用 [encoding.RegisterCompressor](https://godoc.org/google.golang.org/grpc/encoding#RegisterCompressor) 来自动注册
```go
// 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](https://github.com/grpc/grpc-go/tree/master/examples/features/compression)
grpc 开发进阶 - 使用压缩器 compressor