gRPC 四种RPC类型异同

news2024/9/30 7:25:09

        gRPC定义了如下四种RPC,刚开始接触的时候,感觉挺奇怪的,RPC不就是接口调用吗,区分这么多干啥?难道实现原理不一样?未读源码之前,还想着有啥神秘的地方,看完源码之后,才发现这四种RPC底层实现本质上是一样的,仅仅是部分接口调用细节不同。

Unary RPC (一元RPC or 简单RPC)

Client streaming RPC (客户端流式RPC)

Server streaming RPC (服务端流式RPC)

Bidirectional streaming RPC (双向流式RPC)

Unary RPC:

        Unary 中文翻译为一元,这里可以理解为简单的意思。Unary RPC指的是客户端发送一个请求,服务端发送一个响应,和普通函数调用类似,这是最简单的RPC。通过protobuf定义unary rpc 格式如下, rpc 方法名(请求参数) returns(响应参数):

rpc SayHello(HelloRequest) returns (HelloResponse);

Client streaming RPC 

        客户端流式RPC指的是客户端可以发送一连串请求,发送完成之后等待服务器处理并返回一个响应。gRPC保证单个stream里的客户端的请求顺序一致,即按照其发送的顺序。(之所以能够保证顺序,应该是因为发送的时候是按照写入的顺序逐个发送的),我理解所谓的流式(streaming)就是多个。通过protobuf定义 client streaming rpc 格式如下, 可以看到请求中多了一个stream 占位符。

rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);

Server streaming RPC

        服务端流式RPC,这个和客户端流式RPC刚好相反。客户端发送一个请求,服务端发送多个响应。同样,gRPC保证同一个stream上多个消息顺序和发送时一致。通过protobuf定义 server streaming rpc 格式如下:

rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);

Bidirectional streaming RPC

        双向流式RPC,  顾名思义,两端都可以发送多条消息。两端收发顺序独立互不影响。典型的一个场景比如聊天程序,双向通信,不过这种场景下是不是使用websocket更好一点?

        通过PB定义BidirectionalStreamingRPC格式如下,请求和响应参数里都有stream占位符。

rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);

gRPC-Go 代码库目录下examples/route_guide 定义了四种RPC使用例子,下面给出这四种RPC的调用流程图:

图1 左 UnaryRPC&右ClientStreamingRPC

 

图2 左ServerStreamingRPC&右BidirectionalStreamingRPC

         通过流程图可以看到,这四种RPC本质上都一样,都是建立传输层然后通过传输层读取数据。对于客户端来说,unary rpc 和 streaming rpc 除了发送请求次数不一样外,发送end_stream标记的时机也不一样。unary因为只发送一个请求,所以该请求会携带end_stream标志。streaming则存在多个请求,因此需要额外发送一个空data frame来携带end_stream。

        对于server 侧streaming,客户端则是调用多次recvmsg。

        另外,http2 协议规范定义end_stream标志为:如果该标志位为1,则表示当前frame为该端点最后一个frame。

        综上,这四种RPC底层实现没太大区别,仅仅是调用方式上的异同。在我们的业务中使用的都是UnaryRPC,还没看到有其它类型RPC的使用。

        上面的图基于gRPC-GO 1.54.0-dev版本制作,具体的代码就无需粘贴上来了,有兴趣的同学可以下载代码看看。

参考资料:

1. Core concepts, architecture and lifecycle | gRPC

2. RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Guns社区医疗项目

又是一年毕业季,计算机专业大四的同学们要接受毕业设计的考验啦。又有多少同学为了毕业设计而愁眉苦脸,心力憔悴。考虑到这些,这里为同学们分享一个适合你们毕业设计的作品以及详细介绍,让正在焦头烂额的同学们有所启发&#xff0…

MPC的560x系列的运行模式的介绍

一、模式简介 1、运行模式 一共11种模式,分别为RESET、DRUN、SAFE、TEST、RUN0、RUN1、RUN2、RUN3、HALT、STOP、STANDBY。其中RESET、DRUN、SAFE、TEST是系统工作模式,用户不用个特别关系,而后面几种是用于经常使用到的工作模式。 RESET&a…

ASP.NET Core - 依赖注入(二)

2,NET Core 依赖注入的基本用法 话接上篇,这一章介绍 .NET Core 框架自带的轻量级 Ioc 容器下服务使用的一些知识点,大家可以先看看上一篇文章 [ASP.NET Core - 依赖注入(一)] 2.3 服务解析 通过 IServiceCollection 注册了服务之后&#xf…

五一假期将近,给景区视频监控方案提几点建议

一、行业背景 随着旅游业的不断发展,旅游安全问题越来越受到重视。尤其是五一假期将近,为确保游客在景区内的人身安全和财产安全,景区必须采用高效、可靠的安防视频监控系统,并进行科学规划和设计,从而实现及时发现安…

Simulink simscape绳索和滑轮的使用总结

在做仿真的时候使用了绳索和滑轮,网上的资料不是很多,所以想想还是自己做一下记录,提供了一个小案例,文件上传到我的资源里了。 1.滑轮约束 Pulley 这个模块可以建立滑轮和绳索之间的约束。这个约束保证了绳子和滑轮之间 The pull…

Memory Analyzer Mat

目录 一、JDK 、JRE和JVM 的关系 二、Java进程内存占用查询命令 2.1JAVA 代码是如何执行的 2.2何时用hrpof文件分析内存 三、Memory Analyzer Mat 3.1Memory Analyzer Mat安装 3.2 Overview视图 3.2.1直方图视图(histogram) 3.2.2 Dominator Tr…

计算机图形学 Animation 学习笔记

1、做插值: 线性插值和用贝塞尔曲线做插值,贝塞尔曲线做插值可以看起来更生动形象 2、物理模拟(Simulate Physics) 原理是利用“ 力 质量 x 加速度”,知道了这些信息,那么下一帧的位置就可以提前被运算出来…

Ethercat学习-从站FOE固件更新(TwinCAT主站)

文章目录简介协议说明1.读请求2.写请求3.数据4.应答5.错误码6.忙数据传输流程1.读流程2.写流程3.忙操作代码实现1.源码生成与移植2.代码解析1.FOE_ServiceInd2.FOE_Read3.FOE_Write4.FOE_Ack5.FOE_Data6.FOE_Error7.FOE_Busy其他TwinCAT测试简介 FOE(File Access over Etherca…

React从入门到入土系列3-使用React构建你的应用

这是我自己系统整理的React系列博客,主要参考2023年3月开放的最新版本react官网内容,欢迎你阅读本系列内容,希望能有所收货。 本文是该系列的第3篇文章,阅读完本文后你将收获: 如何使用React逐步构建你的应用了解prop…

《分布式商业》

读完《分布式商业:数字化时代的新商业变革》,说实话,如果读者没有技术研发背景,读完此书,是很难在技术和商业层面引起共鸣。我甚至觉得,这本书就是写给技术类岗位的同学看的;而写这本书的人&…

Softing工业边缘产品的新功能助力工业数据集成到IT解决方案中

Softing的edgeConnector和edgeAggregator产品在3.40版本中新增了一系列功能,使数据集成到IT解决方案变得更加容易。 基于Docker的edgeConnector产品系列支持访问SIMATIC S7、SINUMERIK 840D和Modbus TCP等控制器中的过程数据。同样基于Docker的edgeAggregator产品可…

柔性数组【结构体和动态内存的结合】

全文目录前言柔性数组的定义语法柔性数组的特点柔性数组的使用柔性数组的优势前言 很多人可能没有听过柔性数组这个概念,但是在C99中柔性数组是确实存在的。我个人感觉有点像动态内存和结构体的结合。 柔性数组的定义语法 结构中的最后一个元素允许是未知大小的数…

一起学 WebGL:绘制三角形

大家好,我是前端西瓜哥。画了好几节课的点,这次我们来画三角形了。 三角形可太重要了,再复杂的三维模型都是由一个个小三角形组合而成,越多越精细越真实。 绘制三角形 这次绘制三角形,要绘制的点就有三个了&#xf…

C语言之 单链表1(simply linked list)

单链表 链表优点: 1.按需申请空间,需要就申请,不需要就释放 2.头部或中间插入数据,不需要挪动数据 3.不存在空间浪费 缺点: 1.每次存放一个数据,到要存一个指针去链接后面的数据节点 2.不支持随机访问&a…

让你的ChatGPT更加强大——200+小白用来解锁ChatGPT高级功能的提示(Prompts)

让你的ChatGPT更加强大——200小白用来解锁ChatGPT高级功能的提示(Prompts)使用说明标签筛选关键词搜索展示区复制语言切换常见问题为什么提示词用英文?中文搜索出错输出虚假信息提示词不好用为什么执着于 ChatGPT?最后参考博客其…

Vue.js 2.0 单文件组件

Vue.js 2.0 单文件组件介绍 在很多Vue项目中,我们使用 Vue.component 来定义全局组件,紧接着用 new Vue({ el: #container }) 在每个页面内指定一个容器元素。 这种方案在只是使用 JavaScript 增强某个视图的中小型项目中表现得很好。然而在更复杂的项…

对象树、QT的坐标系、信号和槽机制

目录 1、QT中什么是对象树 2、QT的坐标系 3、信号和槽机制 3.1、信号槽的理解 3.2、信号槽的工作原理 3.3、信号槽的使用 3.3.1、系统的信号和槽 3.3.2、自定义信号和槽函数 3.3.3、信号和槽函数之间的参数传递 3.3.4、信号和槽的注意 1、QT中什么是对象树 在创建 QO…

重构·改善既有代码的设计.04之重构手法(下)完结

1. 前言 本文是代码重构系列的最后一篇啦。前面三篇《重构改善既有代码的设计.01之入门基础》、《重构改善既有代码的设计.02之代码的“坏味道”》、《重构改善既有代码的设计.03之重构手法(上)》介绍了基础入门,代码异味,还有部…

如何在ubuntu上搭建minio

由于腾讯的对象存储服务器(COS)的半年免费试用期已过,所以寻思鼓捣一下minio,试着在自己的服务器上搭建一套开源的minio对象存储系统。 单机部署基本上有以下两种方式。 一、直接安装 最基础的一种单机安装,这里不做…

记录-js基础练习题

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 隔行换色(%): window.onload function() {var aLi document.getElementsByTagName(li);for(var i 0; i < aLi.length; i){if(i%2 1){aLi[i].style.background #bfa;}} } <ul><li>…