小知识,大挑战!本文正在参与“ 程序员必备小知识 ”创作活动
本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金
介绍
本文介绍如何通过 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 |
本文转载自: 掘金