grpc双向流究竟是什么情况?2段代码告诉你
摘要:为什么需要grpc双向流?
本文分享自华为云社区《grpc双向流究竟是什么情况?2段代码告诉你》,作者:breakDawn。
为什么需要grpc双向流?
有时候请求调用和返回过程,并不是简单的一问一答形式,可能会涉及一次发送,多次分批返回,或者两边随意互相发送。
因此简单的restful模型无法满足上述常见,grpc双向流应运而生,通过一个tpc链接实现了双向的异步IO通信。
grpc双向流
一个双向流式RPC是双方使用读写流去发送一个消息序列。
两个流独立操作,因此客户端和服务器可以以任意喜欢的顺序读写:比如,服务器可以在写入响应前等待接收所有的客户端消息,或者可以交替的读取和写入消息,或者其他读写的组合。
- 可以理解为常见IO模型里的异步IO的使用
每个流中的消息顺序被预留。你可以通过在请求和响应前加stream关键字去制定方法的类型。
//AcceptsastreamofRouteNotessentwhilearouteisbeingtraversed,
//whilereceivingotherRouteNotes(e.g.fromotherusers).
rpcRouteChat(streamRouteNote)returns(streamRouteNote){}
客户端的双向流调用
- 定义一个reponseOberserver,即响应观察者,用于定义如何处理服务端返回的消息。一般都是把消息放到一个某个阻塞队列或者单容量队列SettableFuture中。
- 调用stub.sendMessage(reponseOberserver),即告诉grpc框架,我要用这个reponseOberserver去处理sendMessage消息的响应。
注意,这个sendMesage方法名,取决于我们的proto中怎么定义的。 - 然后stub.sendMessage()方法回返回给我们一个requestObserver,让我们用这个观察者.onNext()去发送请求,可以任意发多次,都是立刻返回的。
- 当不需要再发送时,可以调用onCompleted告知对方可以结束了
下面是官网摘抄的代码示例:
publicvoidrouteChat()throwsException{
info("***RoutChat");
finalSettableFuture<Void>finishFuture=SettableFuture.create();
//定义了如何处理收到的返回消息观察者
StreamObserverreponseObserver=newStreamObserver<RouteNote>(){
@Override
publicvoidonNext(RouteNotenote){
info("Gotmessage\"{0}\"at{1},{2}",note.getMessage(),note.getLocation()
.getLatitude(),note.getLocation().getLongitude());
}
@Override
publicvoidonError(Throwablet){
finishFuture.setException(t);
}
@Override
publicvoidonCompleted(){
//往finishFuture设置空时,说明完成了消息流关闭了
finishFuture.set(null);
}
};
//框架返回给我一个请求流观察者,让我用这个观察者.onNext(message)去发请求,返回结果和我传给他的responseServer绑定了。
StreamObserver<RouteNote>requestObserver=
asyncStub.routeChat();
try{
RouteNote[]requests=
{newNote("Firstmessage",0,0),newNote("Secondmessage",0,1),
newNote("Thirdmessage",1,0),newNote("Fourthmessage",1,1)};
for(RouteNoterequest:requests){
info("Sendingmessage\"{0}\"at{1},{2}",request.getMessage(),request.getLocation()
.getLatitude(),request.getLocation().getLongitude());
requestObserver.onNext(request);
}
requestObserver.onCompleted();
finishFuture.get();
info("FinishedRouteChat");
}catch(Exceptiont){
requestObserver.onError(t);
logger.log(Level.WARNING,"RouteChatFailed",t);
throwt;
}
}
服务端的处理方式:
- 我们建立服务端的时候,需要调用nettyServer,建立netty服务,并绑定一个xxxServiceImpl抽象类。这个xxxServiceImpl就是我们在proto中定义的server结构,支持处理我们定义的消息。
- xxxServiceImpl中,有很多需要覆写的方法,需要你定义如何处理收到的请求,以及如何给客户端发送响应。发送响应的动作就是参数里的requestObserver.onNext(响应消息)
- 返回的xxxService类,会在第一步提供给netty以及grpc框架,收到消息时,会通过他的异步机制,分隔网络线程和业务线程,走到这边执行的地方。
下面是官网摘抄的代码示例:
class xxxServiceextendxxxServiceImpl{
@Override
publicvoidlistFeatures(Rectanglerequest,StreamObserver<Feature>responseObserver){
intleft=min(request.getLo().getLongitude(),request.getHi().getLongitude());
intright=max(request.getLo().getLongitude(),request.getHi().getLongitude());
inttop=max(request.getLo().getLatitude(),request.getHi().getLatitude());
intbottom=min(request.getLo().getLatitude(),request.getHi().getLatitude());
for(Featurefeature:features){
if(!RouteGuideUtil.exists(feature)){
continue;
}
intlat=feature.getLocation().getLatitude();
intlon=feature.getLocation().getLongitude();
if(lon>=left&&lon<=right&&lat>=bottom&&lat<=top){
responseObserver.onNext(feature);
}
}
responseObserver.onCompleted();
}
}
grpc双向流究竟是什么情况?2段代码告诉你的更多相关文章
- ASP.NET Core 3.0 gRPC 双向流
目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 认证授权 一.前言 在前一文 <ASP.NE ...
- java版gRPC实战之五:双向流
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- GRPC单向/双向流
开始食用grpc(之二)https://www.cnblogs.com/funnyzpc/p/9570992.html 开始食用grpc(之一)https://www.cnblogs.com/funn ...
- [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码
[洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...
- IO流----操作文件的9种方法代码实现
IO流----操作文件的9种方法代码实现: 1:使用字节流读写数据: 四种方式: method1: 每次读写一个字节,边读边写: /* * 复制文本文件. * * 数据源:从哪里来 ...
- 基于grpc的流式方式实现双向通讯(python)
grpc介绍 grpc是谷歌开源的一套基于rpc实现的通讯框架(官网有更完整的定义).在搞懂grpc之前,首先要弄懂rpc是什么.下面是自己理解的rpc定义,若有不对,望指出: rpc官方称为 远程过 ...
- 为什么从REST转向gRPC 需要流式传输搜索结果,也就是在有第一批结果时就开始传输
https://mp.weixin.qq.com/s/aEO3Y8SkObNgfQU3z8sH2w 我们为什么从REST转向gRPC 原创 Levin Fritz InfoQ 2019-06-23 作 ...
- html/css基础篇——DOM中关于脱离文档流的几种情况分析
所谓的文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列.并最终窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素.脱离文档流即是元素打乱了这个排列,或是从排版中拿走. ...
- hdu4862 2014多校B题/ 费用流(最优情况下用不大于K条路径覆盖)(不同的解法)
题意: 一个数字矩阵,可以出发K次,每次可以从右边或者下面走,要求(在收益最大情况下)覆盖全图,不能则输出-1.(规则:每次跳一步的时候若格子数字相等则获得该数字的能量,每跳一步消耗距离的能量).每个 ...
- html/css 关于脱离文档流的几种情况
所谓的文档流 顾名思义就是按照顺序流下来,指的是html元素从上往下 从左往右的流式排列, 比如说写了5个Div,正常的文档流是依次显示这5个div块: 脱离文档流就是指它所显示的位置和文档代码就不一 ...
随机推荐
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-22-处理select下拉框-上篇
1.简介 在实际自动化测试过程中,我们也避免不了会遇到下拉框选择的测试,因此宏哥在这里直接分享和介绍一下,希望小伙伴或者童鞋们在以后工作中遇到可以有所帮助.今天,我们讲下playwright的下拉框怎 ...
- Unity anchoredPosition转localPosition
参考 https://zhuanlan.zhihu.com/p/119442308 在已经有结果的情况下,先捋一下unity对相关字段的注释就能得出很多公式 (rectMinPos表示左下角在父节点坐 ...
- spring---面向切面(AOP @Pointcut 表达式篇)
AOP(面向切面编程),可以说是OOP(面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合. 当我们需要为分散的对象引入公共行为的时候,O ...
- CART算法解密:从原理到Python实现
本文深入探讨了CART(分类与回归树)算法的核心原理.实现方法以及应用场景.文章首先介绍了决策树的基础知识,然后详细解析了CART算法的工作机制,包括特征选择和树的构建.接着,通过Python和PyT ...
- Android app兼容低版本Java环境
原文地址: Android app兼容低版本Java环境 - Stars-One的杂货小窝 起因是修复一个Bug遇到的问题,找到了一个可以让app兼容低版本java的方法 众所周知,Android版本 ...
- windows server 2019 2012 server 2022 无线网卡驱动安装报错,无线网卡驱动不能安装, inf服务安装段落无效
windows server 2019 无线网络 服务安装段落无效 windows server 2019 无线网卡驱动安装报错,无线网卡驱动不能安装, inf服务安装段落无效 indows serv ...
- 【Javaweb】JavaEE项目的三层架构 | 快速搭建
逻辑类图 分层的目的是为了解耦.解耦就是为了降低代码的耦合度.方便项目后期的维护和升级. 不同的层有不同的包 web层 com.stguigu.web/servlet/controller servi ...
- New Type Functions/Utilities for Dealing with Ranges in C++20
Generic Types of Ranges 类型萃取从字面意思上来说其实就是帮助我们挑选某个对象的类型,筛选特定的对象来做特定的事.可以先来回顾一下以前的写法. #include <ve ...
- Excel 中使用数据透视图进行数据可视化
使用数据透视表(PivotTable)是在Excel中进行数据可视化的强大工具.下面将提供详细的步骤来使用数据透视表进行数据可视化. **步骤一:准备数据** 首先,确保你有一个包含所需数据的Exce ...
- Socket是什么/怎么理解Socket
Socket 先来看一下百度百科对于Socket的介绍:套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O ...