[toc]
http://doc.oschina.net/grpc?t=60134
一个 双向流式 RPC 是双方使用读写流去发送一个消息序列。
两个流独立操作,因此客户端和服务器 可以以任意喜欢的顺序读写:
比如, 服务器可以在写入响应前等待接收所有的客户端消息
或者可以交替 的读取和写入消息
或者其他读写的组合。
每个流中的消息顺序被预留。你可以通过在请求和响应前加 stream 关键字去制定方法的类型。
1 | // Accepts a stream of RouteNotes sent while a route is being traversed, |
客户端的双向流调用#
- 定义一个reponseOberserver, 即响应观察者,用于定义如何处理服务端返回的消息。 一般都是把消息放到一个某个阻塞队列或者单容量队列SettableFuture中。
- 调用stub.sendMessage(reponseOberserver), 即告诉grpc框架, 我要用这个reponseOberserver去处理sendMessage消息的响应。
注意,这个sendMesage方法名,取决于我们的proto中怎么定义的。 - 然后stub.sendMessage()方法回返回给我们一个requestObserver,让我们用这个观察者.onNext()去发送请求,可以任意发多次,都是立刻返回的。
- 当不需要再发送时,可以调用onCompleted告知对方可以结束了
1 | public void routeChat() throws Exception { |
服务端的处理方式:#
- 我们建立服务端的时候,需要调用nettyServer,建立netty服务,并绑定一个xxxServiceImpl抽象类。 这个xxxServiceImpl就是我们在proto中定义的server结构,支持处理我们定义的消息。
- xxxServiceImpl中, 有很多需要覆写的方法, 需要你定义如何处理收到的请求, 以及如何给客户端发送响应。发送响应的动作就是参数里的requestObserver.onNext(响应消息)
- 返回的xxxService类,会在第一步提供给netty以及grpc框架, 收到消息时,会通过他的异步机制,分隔网络线程和业务线程,走到这边执行的地方。
1 | class xxxService extend xxxServiceImpl{ |