小知识,大挑战!本文正在参与“ 程序员必备小知识 ”创作活动
本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金
介绍
本文介绍如何通过 rk-boot 调整 gRPC 数据传输大小限制。
grpc 的大小限制存在于接收方,也就是说发送多大的数据没有限制,接收默认大小是 4MB。
例子里使用的是 google.golang.org/grpc v1.38.0 版本。
什么是 gRPC 数据传输大小限制?
gRPC 服务端默认最大数据传输大小为 4MB,有些时候,我们需要传输更大的数据,比如大图片。
请访问如下地址获取完整教程:
安装
| 1 | go复制代码go get github.com/rookie-ninja/rk-boot | 
快速开始
rk-boot 支持通过代码 & YAML 文件的方式调整大小限制。
为了完整演示,我们创建一个 greeter API。
1.创建 protobuf 相关文件
我们使用 buf 命令行来编译 protobuf,需要创建如下几个文件。
| 文件名 | 描述 | 
|---|---|
| api/v1/greeter.proto | protobuf 文件 | 
| buf.yaml | 告诉 buf 命令行在哪里寻找 protobuf 文件 | 
| buf.gen.yaml | 告诉 buf 命令行如何编译 protobuf 文件 | 
- api/v1/greeter.proto
| 1 | protobuf复制代码syntax = "proto3"; | 
- buf.yaml
| 1 | yaml复制代码version: v1beta1 | 
- buf.gen.yaml
| 1 | yaml复制代码version: v1beta1 | 
- 编译 protobuf 文件
| 1 | shell复制代码$ buf generate | 
2.创建 boot.yaml
我们通过 boot.yaml 方式来【取消】大小限制,通过 boot.yaml 我们可以取消限制,但是无法调整限制。
调整限制的话,可以通过代码调整,我们也会在下面介绍。
| 1 | yaml复制代码--- | 
3.创建 server.go
我们实现了 greeter 接口。
| 1 | go复制代码// Copyright (c) 2021 rookie-ninja | 
4.创建 client.go
我们试着传输 10MB 的数据。
| 1 | go复制代码// Copyright (c) 2021 rookie-ninja | 
5.文件夹结构
| 1 | go复制代码. | 
6.验证
不会出现任何错误。
| 1 | go复制代码$ go run server.go | 
因为服务端默认只允许接收 4MB 大小的数据,如果我们在 boot.yaml 里把 noRecvMsgSizeLimit 设置成 false,会得到如下错误。
| 1 | ini复制代码rpc error: code = ResourceExhausted desc = grpc: received message larger than max (10485765 vs. 4194304) | 
调整【服务端】传输数据大小
上次的例子中,我们使用 noRecvMsgSizeLimit 选项取消了 gRPC 服务端的大小限制,这次,我们试着调整大小。
还是使用上面的 protobuf 文件。
1.修改 boot.yaml
这次我们把 noRecvMsgSizeLimit 设置成 false。
| 1 | yaml复制代码--- | 
2.修改 server.go
我们通过 AddServerOptions() 函数设置服务端接收最大值。
| 1 | go复制代码// Copyright (c) 2021 rookie-ninja | 
3.验证
不会出现任何错误。
| 1 | go复制代码$ go run server.go | 
如果我们发送的数据大于 20mb,会出现如下错误。
| 1 | ini复制代码rpc error: code = ResourceExhausted desc = grpc: received message larger than max (31457285 vs. 20971520) | 
调整【客户端】传输数据大小
如果服务端返回的数据大于 4MB,我们需要在客户端调整大小。
| 1 | go复制代码kb := 1024 | 
本文转载自: 掘金