
grpc单个消息设置最大超过4M处理(go-zero)
作者: boyyang
分类: 后端开发
发布: 2025-02-28 14:00:06
更新: 2025-03-21 06:08:54
浏览: 199
最近在使用go-zero开发rpc服务端时候,当消息体过大的时候,rpc抛出异常,在网上找了一大圈,知道应该修改 MaxRecvMsgSize 的大小便可以解决该问题,但是在go-zero官网找了半天也没有找到解决方案。最后在go-zero的issues中看到了相同的问题。
在google.golang.org/grpc中MaxRecvMsgSize的默认值是1024*1024*4,当向rpc 服务端发送大于4M的消息时rpc将会抛出以下错误信息。
rpc error: code = ResourceExhausted desc = grpc: received message larger than max (10591746 vs. 4194304)
在go-zero的rpc服务中可以通过AddOptions来修改grpc的一些配置,具体配置如下:
(api服务端同时与需要修改前端传递过来的消息体大小配置,可以在etc/xxx.yaml中配置也可以直接api文件中修改)
修改api服务消息体大小配置
@server(
maxBytes: 20971520
timeout: 20s
)
修改rpc服务消息体大小配置
func main() {
flag.Parse()
var c config.Config
conf.MustLoad(*configFile, &c)
ctx := svc.NewServiceContext(c)
s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
upload.RegisterUploadServer(grpcServer, server.NewUploadServer(ctx))
if c.Mode == service.DevMode || c.Mode == service.TestMode {
reflection.Register(grpcServer)
}
})
s.AddOptions(
grpc.MaxRecvMsgSize(1024 * 1024 * 20),
grpc.MaxSendMsgSize(1024 * 1024 * 10),
)
defer s.Stop()
fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
s.Start()
}
在go-zero项目的github也有相关的使用方法,链接如下: