首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >gRPC: 调整数据传输大小限制

gRPC: 调整数据传输大小限制

原创
作者头像
尹东勋
修改于 2021-12-12 16:25:09
修改于 2021-12-12 16:25:09
5.4K0
举报

介绍

本文介绍如何通过 rk-boot 调整 gRPC 数据传输大小限制。

grpc 的大小限制存在于接收方,也就是说发送多大的数据没有限制,接收默认大小是 4MB。

例子里使用的是 google.golang.org/grpc v1.38.0 版本。

什么是 gRPC 数据传输大小限制?

gRPC 服务端默认最大数据传输大小为 4MB,有些时候,我们需要传输更大的数据,比如大图片。

请访问如下地址获取完整教程:

安装

代码语言:txt
AI代码解释
复制
go get github.com/rookie-ninja/rk-boot
go get github.com/rookie-ninja/rk-grpc

快速开始

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
代码语言:txt
AI代码解释
复制
syntax = "proto3";

package api.v1;

option go_package = "api/v1/greeter";

service Greeter {
  rpc Greeter (GreeterRequest) returns (GreeterResponse) {}
}

message GreeterRequest {
  bytes msg = 1;
}

message GreeterResponse {}
  • buf.yaml
代码语言:txt
AI代码解释
复制
version: v1beta1
name: github.com/rk-dev/rk-demo
build:
  roots:
    - api
  • buf.gen.yaml
代码语言:txt
AI代码解释
复制
version: v1beta1
plugins:
  # protoc-gen-go needs to be installed, generate go files based on proto files
  - name: go
    out: api/gen
    opt:
     - paths=source_relative
  # protoc-gen-go-grpc needs to be installed, generate grpc go files based on proto files
  - name: go-grpc
    out: api/gen
    opt:
      - paths=source_relative
      - require_unimplemented_servers=false
  • 编译 protobuf 文件
代码语言:txt
AI代码解释
复制
$ buf generate

2.创建 boot.yaml

我们通过 boot.yaml 方式来【取消】大小限制,通过 boot.yaml 我们可以取消限制,但是无法调整限制。

调整限制的话,可以通过代码调整,我们也会在下面介绍。

代码语言:txt
AI代码解释
复制
---
grpc:
  - name: greeter                   # Name of grpc entry
    port: 8080                      # Port of grpc entry
    enabled: true                   # Enable grpc entry
    noRecvMsgSizeLimit: true

3.创建 server.go

我们实现了 greeter 接口。

代码语言:txt
AI代码解释
复制
// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main

import (
	"context"
	"github.com/rookie-ninja/rk-boot"
	"github.com/rookie-ninja/rk-demo/api/gen/v1"
	"github.com/rookie-ninja/rk-grpc/boot"
	"google.golang.org/grpc"
)

// Application entrance.
func main() {
	// Create a new boot instance.
	boot := rkboot.NewBoot()

	// Get grpc entry with name
	grpcEntry := boot.GetEntry("greeter").(*rkgrpc.GrpcEntry)
	grpcEntry.AddRegFuncGrpc(registerGreeter)

	// Bootstrap
	boot.Bootstrap(context.Background())

	// Wait for shutdown sig
	boot.WaitForShutdownSig(context.Background())
}

func registerGreeter(server *grpc.Server) {
	greeter.RegisterGreeterServer(server, &GreeterServer{})
}

type GreeterServer struct{}

func (server *GreeterServer) Greeter(ctx context.Context, request *greeter.GreeterRequest) (*greeter.GreeterResponse, error) {
	return &greeter.GreeterResponse{}, nil
}

4.创建 client.go

我们试着传输 10MB 的数据。

代码语言:txt
AI代码解释
复制
// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main

import (
	"context"
	"github.com/rookie-ninja/rk-demo/api/gen/v1"
	"google.golang.org/grpc"
	"log"
)

func main() {
	opts := []grpc.DialOption{
		grpc.WithInsecure(),
		grpc.WithBlock(),
	}

	// 1: Create grpc client
	conn, client := createGreeterClient(opts...)
	defer conn.Close()

	kb := 1024
	mb := 1024*kb

	// 2: Call server with 10mb size of data
	if _, err := client.Greeter(context.Background(), &greeter.GreeterRequest{Msg: make([]byte, 10*mb, 10*mb)}); err != nil {
		panic(err)
	}
}

func createGreeterClient(opts ...grpc.DialOption) (*grpc.ClientConn, greeter.GreeterClient) {
	// 1: Set up a connection to the server.
	conn, err := grpc.DialContext(context.Background(), "localhost:8080", opts...)
	if err != nil {
		log.Fatalf("Failed to connect: %v", err)
	}

	// 2: Create grpc client
	client := greeter.NewGreeterClient(conn)

	return conn, client
}

5.文件夹结构

代码语言:txt
AI代码解释
复制
.
├── api
│   ├── gen
│   │   └── v1
│   │       ├── greeter.pb.go
│   │       └── greeter_grpc.pb.go
│   └── v1
│       └── greeter.proto
├── boot.yaml
├── buf.gen.yaml
├── buf.yaml
├── client.go
├── go.mod
├── go.sum
└── server.go

6.验证

不会出现任何错误。

代码语言:txt
AI代码解释
复制
$ go run server.go
$ go run client.go

因为服务端默认只允许接收 4MB 大小的数据,如果我们在 boot.yaml 里把 noRecvMsgSizeLimit 设置成 false,会得到如下错误。

代码语言:txt
AI代码解释
复制
rpc error: code = ResourceExhausted desc = grpc: received message larger than max (10485765 vs. 4194304)

调整【服务端】传输数据大小

上次的例子中,我们使用 noRecvMsgSizeLimit 选项取消了 gRPC 服务端的大小限制,这次,我们试着调整大小。

还是使用上面的 protobuf 文件。

1.修改 boot.yaml

这次我们把 noRecvMsgSizeLimit 设置成 false。

代码语言:txt
AI代码解释
复制
---
grpc:
  - name: greeter                   # Name of grpc entry
    port: 8080                      # Port of grpc entry
    enabled: true                   # Enable grpc entry
    noRecvMsgSizeLimit: false

2.修改 server.go

我们通过 AddServerOptions() 函数设置服务端接收最大值。

代码语言:txt
AI代码解释
复制
// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main

import (
	"context"
	"github.com/rookie-ninja/rk-boot"
	"github.com/rookie-ninja/rk-demo/api/gen/v1"
	"github.com/rookie-ninja/rk-grpc/boot"
	"google.golang.org/grpc"
)

// Application entrance.
func main() {
	// Create a new boot instance.
	boot := rkboot.NewBoot()

	// Get grpc entry with name
	grpcEntry := boot.GetEntry("greeter").(*rkgrpc.GrpcEntry)
	grpcEntry.AddRegFuncGrpc(registerGreeter)
	
	// *************************************** //
	// *** Set server receive size to 20MB ***
	// *************************************** //
	kb := 1024
	mb := 1024*kb
	grpcEntry.AddServerOptions(grpc.MaxRecvMsgSize(20*mb))

	// Bootstrap
	boot.Bootstrap(context.Background())

	// Wait for shutdown sig
	boot.WaitForShutdownSig(context.Background())
}

func registerGreeter(server *grpc.Server) {
	greeter.RegisterGreeterServer(server, &GreeterServer{})
}

type GreeterServer struct{}

func (server *GreeterServer) Greeter(ctx context.Context, request *greeter.GreeterRequest) (*greeter.GreeterResponse, error) {
	return &greeter.GreeterResponse{}, nil
}

3.验证

不会出现任何错误。

代码语言:txt
AI代码解释
复制
$ go run server.go
$ go run client.go

如果我们发送的数据大于 20mb,会出现如下错误。

代码语言:txt
AI代码解释
复制
rpc error: code = ResourceExhausted desc = grpc: received message larger than max (31457285 vs. 20971520)

调整【客户端】传输数据大小

如果服务端返回的数据大于 4MB,我们需要在客户端调整大小。

代码语言:txt
AI代码解释
复制
kb := 1024
mb := 1024*kb

opts := []grpc.DialOption{
	grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(20*mb)),
	grpc.WithInsecure(),
	grpc.WithBlock(),
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
这个Web新API让任何内容都能画中画!
“画中画”(Picture-in-Picture, PiP)说白了,就是让你能一边看视频,一边干别的,互不耽误。就像给你的桌面贴了个能播放视频的“便利贴”,你可以随便拖动它,调整大小,它还总在最前面,贼方便。
Immerse
2025/05/04
2290
这个Web新API让任何内容都能画中画!
Chrome 116:网页画中画 API 来了!
Chrome 116 刚刚发布了正式版本,其中比较值得关注的新增功能就是网页的画中画 API 了(Document Picture in Picture API )。
ConardLi
2023/08/23
9360
Chrome 116:网页画中画 API 来了!
基于Vue.js2.6结合h5来实现视频播放画中画技术(Picture-in-Picture)
    在开发基于vue.js的在线视频教育平台的时候,我们会注意一个小问题,就是如果用户在观看播放视频的同时,也会往下拖动窗口浏览一些评论,这样视频就会被滚动条覆盖,导致用户无法在浏览评论的同时观看视频,同理,如果想边刷微博边追剧怎么办?想边聊微信边看球赛怎么办?
用户9127725
2022/08/08
1.2K0
基于Vue.js2.6结合h5来实现视频播放画中画技术(Picture-in-Picture)
浏览器画中画模式
浏览器画中画模式 浏览器画中画功能允许用户在一个小的叠加窗口中弹出网页中播放的视频 ?,Chrome 版本大于 71 均默认开启该功能。下面简单介绍一下该 API 如何使用 ? 准备工作 首先要有个
JS菌
2019/04/10
3.4K0
浏览器画中画模式
Android开发笔记(一百六十七)Android8.0的画中画模式
前面的博文《Android开发笔记(一百五十九)Android7.0的分屏模式》介绍了Android7.0的多窗口特性,但是这个分屏的区域是固定的,要么在屏幕的上半部分,要么在屏幕的下半部分,不但尺寸无法调整而且还不能拖动,使得它的用户体验不够完美。为此Android8.0又带了另一种更高级的多窗口模式,号称“Picture in Picture”(简称PIP,即“画中画”)。应用一旦进入画中画模式,就会缩小为屏幕上的一个小窗口,该窗口可拖动可调整大小,非常适合用来播放视频。那么如何才能让App支持画中画呢?接下来将对画中画的开发工作进行详细介绍。 经过前面的学习,大家知道Activity默认是支持分屏模式的,当然开发者要给activity节点添加下面的属性描述,从而声明允许分屏也是可以的:
aqi00
2019/01/18
2.5K0
腾讯云音视频播放器又上新啦!短视频秒开组件、加密画中画等功能让音视频播放更专业!
根据腾讯云音视频官方的消息显示,播放器SDK是音视频终端SDK的子产品之一,它采用“腾讯视频”同款播放内核,经过内部业务长期优化和海量服务验证,对比系统播放器性能可提升20%-50%,同时具备“臻彩视听”、精准Seek、画中画等丰富功能,为用户提供直播、点播场景下流畅稳定的音视频播放能力,覆盖泛娱乐、电商、教育等多样化音视频业务场景,支持Web/H5、iOS、Android、Flutter平台。
三掌柜
2023/12/29
1.1K4
腾讯云音视频播放器又上新啦!短视频秒开组件、加密画中画等功能让音视频播放更专业!
[UWP]用画中画模式(CompactOverlay Mode)让用总在最前端显示
Windows 10 Creators Update以后UWP提供了一个新的视图模式CompactOverlay,中文翻译成 紧凑的覆盖层?反正大部分时间我们都会称它为画中画模式。
dino.c
2020/02/13
1.5K0
AVKit框架详细解析(二) —— 基于视频播放器的画中画实现(一)
如今,用户希望能够使用Picture in Picture (PiP) - 画中画播放视频。 PiP 模式将视频内容最小化到一个小窗口中,允许用户进行多任务处理。 在本教程中,您将学习如何向使用 UIKit 构建的现有视频应用程序添加画中画支持。
conanma
2021/09/04
3.3K0
怎么用 JavaScript 构建自定义的 HTML5 视频播放器
在网页中观看和分享视频内容是一个很常见的功能,多年来,视频嵌入网页的方式发生了变化。现在,我们在现代浏览器中使用 <video> 标签就可以添加视频文件到网页上,该标签支持多个视频格式。
Jimmy_is_jimmy
2023/03/09
12K0
怎么用 JavaScript 构建自定义的 HTML5 视频播放器
Android画中画(PIP)模式使用
现在手机端各大视频APP基本都有悬浮窗视频模式,我以前文章《Android制作带悬浮窗控制的录屏程序Demo》《Android实现可移动的悬浮窗》有介绍过悬浮窗的使用方式,而到了Android8.0时推出来画中画模式,就是让当前的Activity缩小后显示在其它Activity的上方,使用起来也非常的简单,本篇我们就来试试Android8.0后推出的画中画模式。
Vaccae
2022/12/29
2.8K0
Android画中画(PIP)模式使用
前端开发必读!7个HTML属性助你提升用户体验
HTML是一种强大的语言,用于创建网页。虽然大多数开发人员熟悉常用的HTML属性,但还有一些较少人知的属性可以提供额外的功能并增强用户体验。在本文中,我们将探讨7个这样的HTML属性,你可能还不知道。
前端小智@大迁世界
2023/08/16
7690
2023 年前端大事记
哈喽各位《code 秘密花园》的订阅者们,一年一度的年更系列又来了。关注我的老粉都知道,每到年末我会对前端生态在这一年的重大变化做一次总结,之前的总结:
ConardLi
2023/12/28
5970
2023 年前端大事记
FFmpeg中overlay滤镜用法-水印及画中画
overlay技术又称视频叠加技术。overlay视频技术使用非常广泛,常见的例子有,电视屏幕右上角显示的电视台台标,以及画中画功能,画中画是指在一个大的视频播放窗口中还存在一个小播放窗口,两个窗口不同的视频内容同时播放。
叶余
2019/04/02
7K2
FFmpeg中overlay滤镜用法-水印及画中画
从零开发弹幕视频播放器
这是一个系列文章。本文章将介绍,如何制作一个简单的视频播放器。用少量关键的代码来实现视频播放器核心功能。
羽月
2022/10/09
4.5K0
从零开发弹幕视频播放器
如何更优雅地看电影/刷剧
五一长假这几天看了几部电影,我不喜欢用APP看,都直接在电脑端看,这里就分享下如何优雅地看电影或者刷剧。
苏生不惑
2020/05/20
1.2K0
奥利奥好吃吗?Android 8.0新特性适配测试报告来啦!
谷歌2017 I/O开发者大会上发布了Android 8.0的正式版, 其官方代号为Oreo(奥利奥)。网上关于Android8.0新功能特性的介绍已铺天盖地,新功能特性会对程序应用带来哪些影响呢,我们从兼容性角度来看下这部分变化。
WeTest质量开放平台团队
2018/10/29
1.3K0
奥利奥好吃吗?Android 8.0 新特性适配测试报告来啦!
WeTest质量开放平台团队
2017/10/19
2.6K0
奥利奥好吃吗?Android 8.0 新特性适配测试报告来啦!
Android画中画(PIP)进阶---Action按钮的使用
上一篇《Android画中画(PIP)模式使用》介绍了画中画的使用,今天这篇来讲讲Action按钮的使用,主要是广播方式更新UI及Android 12后的兼容性问题。
Vaccae
2022/12/29
1.3K0
Android画中画(PIP)进阶---Action按钮的使用
技术解码 | 深入解析Web OBS的实现
Web 上实现直播推流的方式主要有两种,一种是通过 Flash 推流,一种是通过 WebRTC 推流。目前主流浏览器已经放弃了对 Flash 的支持,Chrome 从 88 版本开始彻底禁用了 Flash。因此,使用 WebRTC 进行直播推流成为了 Web 上最好的选择。
腾讯云音视频
2022/04/29
2K0
技术解码 | 深入解析Web OBS的实现
在P站做web前端,是种怎样的体验?
作者 | David Walsh 翻译 | 博轩 来源 | https://davidwalsh.name/pornhub-interview 今天,给大家分享一篇重口味的文章,请系好安全带。 对,你没看错,是P站,不是B站(bilibli)。 何谓P站?全称Pornhub,全球最大的sex影片分享网站,你们懂得。 坊间有云:没上过P站的程序员,不是一名优秀的前端切图仔。 无论你对不可描述内容采取什么立场,都无法否认成人网站行业对于推动 Web 的发展产生着巨大的影响。 从提高浏览器的视频限制,到通过 W
程序猿DD
2023/04/04
1.6K0
在P站做web前端,是种怎样的体验?
推荐阅读
相关推荐
这个Web新API让任何内容都能画中画!
更多 >
LV.4
北京点目科技有限公司创始人
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档