BOYYANG/1/blog/compressed/银发兽耳动漫美女 4K壁纸 3840x2160_彼岸图网-6356142b0bded17c14683656c30ea2dc

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也有相关的使用方法,链接如下:

  https://github.com/zeromicro/go-zero/issues/4192

#go
#后端