grpc双向流究竟是什么情况?2段代码告诉你
本文分享自华为云社区《grpc双向流究竟是什么情况?2段代码告诉你》,作者:breakDawn。
为什么需要grpc双向流?
有时候请求调用和返回过程,并不是简单的一问一答形式,可能会涉及一次发送,多次分批返回,或者两边随意互相发送。
因此简单的restful模型无法满足上述常见,grpc双向流应运而生,通过一个tpc链接实现了双向的异步IO通信
grpc双向流
一个 双向流式 RPC 是双方使用读写流去发送一个消息序列。
两个流独立操作,因此客户端和服务器 可以以任意喜欢的顺序读写:
比如, 服务器可以在写入响应前等待接收所有的客户端消息,或者可以交替的读取和写入消息,或者其他读写的组合。
- 可以理解为常见IO模型里的异步IO的使用
每个流中的消息顺序被预留。你可以通过在请求和响应前加 stream 关键字去制定方法的类型。
// Accepts a stream of RouteNotes sent while a route is being traversed,// while receiving other RouteNotes (e.g. from other users).rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
客户端的双向流调用
定义一个reponseOberserver, 即响应观察者,用于定义如何处理服务端返回的消息。 一般都是把消息放到一个某个阻塞队列或者单容量队列SettableFuture中。
调用stub.sendMessage(reponseOberserver), 即告诉grpc框架, 我要用这个reponseOberserver去处理sendMessage消息的响应。
注意,这个sendMesage方法名,取决于我们的proto中怎么定义的。然后stub.sendMessage()方法回返回给我们一个requestObserver,让我们用这个观察者.onNext()去发送请求,可以任意发多次,都是立刻返回的。
当不需要再发送时,可以调用onCompleted告知对方可以结束了
下面是官网摘抄的代码示例:
public void routeChat() throws Exception {info("*** RoutChat");final SettableFuture<Void> finishFuture = SettableFuture.create();// 定义了如何处理收到的返回消息观察者StreamObserver reponseObserver = new StreamObserver<RouteNote>() {@Overridepublic void onNext(RouteNote note) {info("Got message \"{0}\" at {1}, {2}", note.getMessage(), note.getLocation().getLatitude(), note.getLocation().getLongitude());}@Overridepublic void onError(Throwable t) {finishFuture.setException(t);}@Overridepublic void onCompleted() {// 往finishFuture设置空时,说明完成了消息流关闭了finishFuture.set(null);}};// 框架返回给我一个请求流观察者,让我用这个观察者.onNext(message)去发请求, 返回结果和我传给他的responseServer绑定了。StreamObserver<RouteNote> requestObserver =asyncStub.routeChat();try {RouteNote[] requests ={newNote("First message", 0, 0), newNote("Second message", 0, 1),newNote("Third message", 1, 0), newNote("Fourth message", 1, 1)};for (RouteNote request : requests) {info("Sending message \"{0}\" at {1}, {2}", request.getMessage(), request.getLocation().getLatitude(), request.getLocation().getLongitude());requestObserver.onNext(request);}requestObserver.onCompleted();finishFuture.get();info("Finished RouteChat");} catch (Exception t) {requestObserver.onError(t);logger.log(Level.WARNING, "RouteChat Failed", t);throw t;}}
服务端的处理方式:
我们建立服务端的时候,需要调用nettyServer,建立netty服务,并绑定一个xxxServiceImpl抽象类。 这个xxxServiceImpl就是我们在proto中定义的server结构,支持处理我们定义的消息。
xxxServiceImpl中, 有很多需要覆写的方法, 需要你定义如何处理收到的请求, 以及如何给客户端发送响应。发送响应的动作就是参数里的requestObserver.onNext(响应消息)
返回的xxxService类,会在第一步提供给netty以及grpc框架, 收到消息时,会通过他的异步机制,分隔网络线程和业务线程,走到这边执行的地方。
下面是官网摘抄的代码示例:
class xxxService extend xxxServiceImpl{@Overridepublic void listFeatures(Rectangle request, StreamObserver<Feature> responseObserver) {int left = min(request.getLo().getLongitude(), request.getHi().getLongitude());int right = max(request.getLo().getLongitude(), request.getHi().getLongitude());int top = max(request.getLo().getLatitude(), request.getHi().getLatitude());int bottom = min(request.getLo().getLatitude(), request.getHi().getLatitude());for (Feature feature : features) {if (!RouteGuideUtil.exists(feature)) {continue;}int lat = feature.getLocation().getLatitude();int lon = 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 认证授权 一.前言 在前一文 < 二. 什么 ...
- grpc双向流 python_gRPC Golang/Python使用
gRPC Golang/Python使用 以前开发网站都是用http协议,学过TCP/IP协议的人都知道,在传输层TCP的基础上,应用层HTTP就是填充了一定规则的文本. 1.gRPC使用和介绍 工作 ...
- Gin + gRPC双向流模式 + sse实现grpc客户端到前端界面的消息推送
Gin + gRPC + sse实现grpc客户端到前端界面的消息推送 功能需求 工厂客户端与服务端通过gRPC连接 突破工厂防火墙(不需要额外开启端口) 前端可以控制数据推送的开启和停止 前端数据大 ...
- java版gRPC实战之五:双向流,rabbitmq持久化原理
responseObserver.onNext(DeductReply.newBuilder() .setCode(code) .setMessage(message) .build()); } @O ...
- java版gRPC实战之五:双向流
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos <java版gRPC实战>全系列链接 用p ...
- gRPC的通信方式-客户端流式、服务端流式、双向流式在Java的调用示例
场景 gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/ ...
- 基于ANSYS 2019R1全解一款双吸泵的双向流固耦合方法
作者:李雷 一.导读 对于旋转机械来说,传统设计从理论计算到手工木模图,再到模型泵的加工制造,最后进行相关性能试验.当性能试验与预期效果差距较大的时候还需要修改水力模型.这种传统的设计不仅设计周期长, ...
- Slide:配置Oracle 10g双向流复制
配置Oracle 10g 双向流复制 View more documents from Maclean Liu 本文转自maclean_007 51CTO博客,原文链接:http://blog.51c ...
- workbench双向流固耦合分析
一. 双向流固耦合的特点 1.1双向流固耦合都是瞬态分析,在单独设置流体.固体瞬态分析特性外基础上要统一流固耦合的时间步: 1.2双向流固耦合需要考虑大变形问题,以及大变形带来的网格变形问题: 1.3 ...
最新文章
- IROS 2020 | 跨视角语义分割前沿进展
- JS 中settimeout和setinterval函数的区别
- php jquery 全选删除,jQuery+php简单实现全选删除的方法
- CodeForces 1610H Squid Game(延迟贪心 + 构造 + 树状数组)
- stripfxg php,zzcms v8.2 中的众多cve分析
- 2017.5.8 飞扬的小鸟 失败总结
- Spring MVC测试框架详解——服务端测试
- spring集成Quartz时区问题造成任务晚执行八小时
- Git 与 GitHub
- 漫谈Java IO之 NIO那些事儿
- 如何彻底删除SQL 2005数据库(完整版)
- 中文核心期刊目录(2008年最新版)
- 64位驱动 hp630打印机_惠普630打印机驱动
- 【期末复习】电子商务
- 中国城市燃气行业供需前景及未来竞争走势研究报告2021版
- 华盛顿邮报专访苹果CEO库克:带领苹果是个孤独的工作
- 想哭的鱼最新QQ伤感日志发布:你不该,不相信我
- golang gin框架全局捕获500和404
- Disk-expansion
- android手机线控失效,耳机线控失效 苹果iOS 10.0.2终于修好了
热门文章
- xcom2.0_发布Xcom 2,Elliot Quest,Mesa图形库以及更多开放式游戏新闻
- JavaScript的三大高阶函数
- mysql中什么是空集合_mysql 中使用笛卡尔积 避免其中一方为空集时结果就是空集的方法...
- ROS Rviz 显示地图 Python
- CAN笔记(22) 特殊协议
- ROS笔记(3) Melodic 的安装和配置
- ROS笔记(2) Kinetic 的安装和配置
- java https post get请求_JAVA利用HttpClient进行POST和GET请求(HTTPS)
- html自定义标签模板,javascript – 模板与HTML自定义元素的使用
- antdesign 柱状图_以Ant Design为例:看B端设计的基本套路