美文网首页
gRPC入门-双向流式通信

gRPC入门-双向流式通信

作者: ted005 | 来源:发表于2018-09-24 15:00 被阅读392次

Gradle工程的环境搭建依然和前文一致,参考:gRPC入门-Hello World

示例代码

  • src\main\proto下新建.proto契约,如下:

    syntax = "proto3";
    
    package com.mattie.netty.grpc;
    
    option java_package = "com.mattie.netty.grpc";
    option java_outer_classname = "HelloWorldProtos";
    
    service HelloService {
        //双向流
        rpc biStream (stream StreamReq) returns (stream StreamResp) {};
    }
    
    //双向流
     message StreamReq {
       string req_info = 1;
    }
    
    message StreamResp {
        string resp_info = 1;
    }
    
  • 执行gradle clean build,自动生成gRPC相关代码: HelloServiceGrpc, 我们需要使用就是它和它的几个内部类。

  • 自定义服务类MyServiceImpl继承HelloServiceGrpc的内部类HelloServiceImplBase并重写契约中定义的服务biStream注意到重写的方法接收的参数类型是StreamObserver(针对response),返回值的类型也是StreamObserver(针对request)。

    public class MyServiceImpl extends HelloServiceImplBase {
        @Override
        public StreamObserver<HelloWorldProtos.StreamReq> biStream(StreamObserver<HelloWorldProtos.StreamResp> responseObserver) {
      return new StreamObserver<HelloWorldProtos.StreamReq>() {
    
          //接收请求
          @Override
          public void onNext(HelloWorldProtos.StreamReq streamReq) {
              System.out.println(streamReq.getReqInfo());
              //接收请求后就返回一个响应
              responseObserver.onNext(HelloWorldProtos.StreamResp.newBuilder().setRespInfo("from server").build());
          }
    
          @Override
          public void onError(Throwable throwable) {
    
          }
    
          //客户端发送数据完毕
          @Override
          public void onCompleted() {
              //服务端也完毕
              responseObserver.onCompleted();
          }
        };
      }
    

RequestObserver在服务端实现,responseObserver在客户端实现。

因此,在服务代码MyServiceImpl中需要返回一个requestObserver,实现其中的回调方法:
1. onNext表示接收到一个request,这里通过responseObserveronNext()立刻返回了一条数据。
2. onCompleted表示客户端已经发送数据完毕,这里调用responseObserveronCompleted()也告诉客户端连接关闭。

  • 客户端不仅需要发送数据,而且需要实现一个responseObserver:

      public void biCommute() {
          StreamObserver<HelloWorldProtos.StreamReq> reqStreamObserver = this.stub.biStream(new StreamObserver<HelloWorldProtos.StreamResp>() {
              //接收到服务返回
              @Override
              public void onNext(HelloWorldProtos.StreamResp streamResp) {
                  System.out.println(streamResp.getRespInfo());
              }
    
              @Override
              public void onError(Throwable throwable) {
    
              }
    
              //服务发送完毕
              @Override
              public void onCompleted() {
    
              }
          });
    
          reqStreamObserver.onNext(HelloWorldProtos.StreamReq.newBuilder().setReqInfo("hello server1").build());
          reqStreamObserver.onNext(HelloWorldProtos.StreamReq.newBuilder().setReqInfo("hello server2").build());
          reqStreamObserver.onNext(HelloWorldProtos.StreamReq.newBuilder().setReqInfo("hello server3").build());
          reqStreamObserver.onNext(HelloWorldProtos.StreamReq.newBuilder().setReqInfo("hello server4").build());
          reqStreamObserver.onCompleted();
    
         try {
            Thread.sleep(10000);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
       }
    
  1. 这里调用服务方法biStream使用的是stub(异步),而非之前的blockingStub(同步)。
  2. 调用biStream需要传入responseObserver作为参数,同时返回值是requestObserver
  3. 通过requestObserveronNext()不断发送数据。
  • 执行程序,客户端发送四条数据,服务端每接收到一条数据就响应一条from server给客户端。

为了能更好的看到执行效果,可以在程序最后增加sleep(10000),观察服务的异步响应过程。

双向流

相关文章

  • gRPC入门-双向流式通信

    Gradle工程的环境搭建依然和前文一致,参考:gRPC入门-Hello World 示例代码 在src\main...

  • 微服务优化之使用gRPC做微服务的内部通信

    gRPC是一个由Google开源的远程服务调用框架,具有多路复用和双向流式通信的特性。 大家好,在本文中将为大家介...

  • gRPC初探

    资源 [1] gRPC Java Example 关键词 高性能,开源,双向流式,多开发语言支持,Apache 2...

  • 深入学习 GRPC - 2. 加密非流式的字节结构

    本篇主要进行加密非流式 GRPC 的通信在字节层面的讨论,使用带 TLSv1.2 的 nginx 节点代理非加密的...

  • 3 grpc流

    1 grpc的四种通信模式 四种通信模式 一元模式 客户端流模式 服务的流模式 双向流模式 2 一元模式 前面已经...

  • gRPC实践--加密通信

    gRPC实践--加密通信 前提阅读: gRPC实践--Server&Client[https://blog.csd...

  • gRPC

    基础:GRPC的产生动机和设计原则grpc| python 实战 grpcPython版gRPC入门实验 - 知乎...

  • GRPC通信

  • GRPC待续

    异步grpc 有三个参与者:client、server、grpc runtime client和server通信:...

  • gRPC学习笔记2 - 示例

    0. 背景 编写一个 gRPC 的示例。 1. gRPC 简介 gRPC 是谷歌开源的轻量级 RPC 通信框架,...

网友评论

      本文标题:gRPC入门-双向流式通信

      本文链接:https://www.haomeiwen.com/subject/boncoftx.html