本文分享自华为云社区《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) {}

客户端的双向流调用

  1. 定义一个reponseOberserver, 即响应观察者,用于定义如何处理服务端返回的消息。 一般都是把消息放到一个某个阻塞队列或者单容量队列SettableFuture中。

  2. 调用stub.sendMessage(reponseOberserver), 即告诉grpc框架, 我要用这个reponseOberserver去处理sendMessage消息的响应。
    注意,这个sendMesage方法名,取决于我们的proto中怎么定义的。

  3. 然后stub.sendMessage()方法回返回给我们一个requestObserver,让我们用这个观察者.onNext()去发送请求,可以任意发多次,都是立刻返回的。

  4. 当不需要再发送时,可以调用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;}}

服务端的处理方式:

  1. 我们建立服务端的时候,需要调用nettyServer,建立netty服务,并绑定一个xxxServiceImpl抽象类。 这个xxxServiceImpl就是我们在proto中定义的server结构,支持处理我们定义的消息。

  2. xxxServiceImpl中, 有很多需要覆写的方法, 需要你定义如何处理收到的请求, 以及如何给客户端发送响应。发送响应的动作就是参数里的requestObserver.onNext(响应消息)

  3. 返回的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段代码告诉你相关推荐

  1. ASP.NET Core 3.0 gRPC 双向流

    目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 认证授权 一.前言 在前一文 < 二. 什么 ...

  2. grpc双向流 python_gRPC Golang/Python使用

    gRPC Golang/Python使用 以前开发网站都是用http协议,学过TCP/IP协议的人都知道,在传输层TCP的基础上,应用层HTTP就是填充了一定规则的文本. 1.gRPC使用和介绍 工作 ...

  3. Gin + gRPC双向流模式 + sse实现grpc客户端到前端界面的消息推送

    Gin + gRPC + sse实现grpc客户端到前端界面的消息推送 功能需求 工厂客户端与服务端通过gRPC连接 突破工厂防火墙(不需要额外开启端口) 前端可以控制数据推送的开启和停止 前端数据大 ...

  4. java版gRPC实战之五:双向流,rabbitmq持久化原理

    responseObserver.onNext(DeductReply.newBuilder() .setCode(code) .setMessage(message) .build()); } @O ...

  5. java版gRPC实战之五:双向流

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos <java版gRPC实战>全系列链接 用p ...

  6. gRPC的通信方式-客户端流式、服务端流式、双向流式在Java的调用示例

    场景 gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/ ...

  7. 基于ANSYS 2019R1全解一款双吸泵的双向流固耦合方法

    作者:李雷 一.导读 对于旋转机械来说,传统设计从理论计算到手工木模图,再到模型泵的加工制造,最后进行相关性能试验.当性能试验与预期效果差距较大的时候还需要修改水力模型.这种传统的设计不仅设计周期长, ...

  8. Slide:配置Oracle 10g双向流复制

    配置Oracle 10g 双向流复制 View more documents from Maclean Liu 本文转自maclean_007 51CTO博客,原文链接:http://blog.51c ...

  9. workbench双向流固耦合分析

    一. 双向流固耦合的特点 1.1双向流固耦合都是瞬态分析,在单独设置流体.固体瞬态分析特性外基础上要统一流固耦合的时间步: 1.2双向流固耦合需要考虑大变形问题,以及大变形带来的网格变形问题: 1.3 ...

最新文章

  1. IROS 2020 | 跨视角语义分割前沿进展
  2. JS 中settimeout和setinterval函数的区别
  3. php jquery 全选删除,jQuery+php简单实现全选删除的方法
  4. CodeForces 1610H Squid Game(延迟贪心 + 构造 + 树状数组)
  5. stripfxg php,zzcms v8.2 中的众多cve分析
  6. 2017.5.8 飞扬的小鸟 失败总结
  7. Spring MVC测试框架详解——服务端测试
  8. spring集成Quartz时区问题造成任务晚执行八小时
  9. Git 与 GitHub
  10. 漫谈Java IO之 NIO那些事儿
  11. 如何彻底删除SQL 2005数据库(完整版)
  12. 中文核心期刊目录(2008年最新版)
  13. 64位驱动 hp630打印机_惠普630打印机驱动
  14. 【期末复习】电子商务
  15. 中国城市燃气行业供需前景及未来竞争走势研究报告2021版
  16. 华盛顿邮报专访苹果CEO库克:带领苹果是个孤独的工作
  17. 想哭的鱼最新QQ伤感日志发布:你不该,不相信我
  18. golang gin框架全局捕获500和404
  19. Disk-expansion
  20. android手机线控失效,耳机线控失效 苹果iOS 10.0.2终于修好了

热门文章

  1. xcom2.0_发布Xcom 2,Elliot Quest,Mesa图形库以及更多开放式游戏新闻
  2. JavaScript的三大高阶函数
  3. mysql中什么是空集合_mysql 中使用笛卡尔积 避免其中一方为空集时结果就是空集的方法...
  4. ROS Rviz 显示地图 Python
  5. CAN笔记(22) 特殊协议
  6. ROS笔记(3) Melodic 的安装和配置
  7. ROS笔记(2) Kinetic 的安装和配置
  8. java https post get请求_JAVA利用HttpClient进行POST和GET请求(HTTPS)
  9. html自定义标签模板,javascript – 模板与HTML自定义元素的使用
  10. antdesign 柱状图_以Ant Design为例:看B端设计的基本套路