gRPC学习之一元rpc和服务端流式RPC

107 阅读1分钟

参考up:孙哥
孙哥主页

四种通信方式

简单rpc 一元rpc(Unary RPC)

第一个RPC程序就是 一元RPC
特点:
1. 当client发起调用后,提交数据,并且等待 服务端响应
2. 开发过程中 主要采用的就是一元RPC的这种通信方式

service HelloServer{
  rpc hello(HelloRequest) returns (HelloResponse){}
  rpc hello1(HelloRequest1) returns (HelloResponse1){}
}

服务端流式RPC (Server Streaming RPC)

一个请求对象,服务端可以返回多个结果对象
使用场景:
股票系统   
client ------>发送股票编号--->Server
      	<--------发送 某一个时刻的 股票行情

语法

service HelloServer{
  rpc hello(HelloRequest) returns (HelloResponse){}
  rpc hello1(HelloRequest1) returns (HelloResponse1){}
  rpc c2ss(HelloRequest) returns(stream HelloResponse){}
}

服务端代码

        @Override
    public void c2ss(HelloProto.HelloRequest request, StreamObserver<HelloProto.HelloResponse> responseObserver) {
        // 获取请求中的name参数
        String name = request.getName();
        System.out.println("name参数:" + name);

        // 循环发送10个响应消息
        for (int i = 0; i < 10; i++) {
            // 创建响应消息的构建器
            HelloProto.HelloResponse.Builder builder = HelloProto.HelloResponse.newBuilder();
            // 设置响应消息的内容为name参数加上当前时间戳
            builder.setResult(name + " 你好" + System.currentTimeMillis());
            // 构建响应消息
            HelloProto.HelloResponse helloResponse = builder.build();
            // 发送响应消息给客户端
            responseObserver.onNext(helloResponse);
            try {
                // 线程等待1秒
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        // 响应消息发送完毕
        responseObserver.onCompleted();
    }

存在问题:服务端存在阻塞,必须处理完所有消息才给客户端返回 监听 异步方式 处理服务端

客户端代码

   public static void main(String[] args) {
       // 创建 ManagedChannel 对象,用于与服务端建立连接
       ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost", 9000).
               usePlaintext().build();

       try {
           // 创建 HelloServerGrpc.HelloServerBlockingStub 对象,用于与服务端进行 RPC 调用
           HelloServerGrpc.HelloServerBlockingStub helloService = HelloServerGrpc.newBlockingStub(managedChannel);

           // 创建 HelloProto.HelloRequest 对象,用于构建请求参数
           HelloProto.HelloRequest.Builder builder = HelloProto.HelloRequest.newBuilder();
           HelloProto.HelloRequest helloRequest = builder.setName("blue").build();

           // 调用服务端的 hello 方法,传入请求参数
           Iterator<HelloProto.HelloResponse> helloResponseIterator = helloService.c2ss(helloRequest);
           while (helloResponseIterator.hasNext()){
               HelloProto.HelloResponse helloResponse = helloResponseIterator.next();
               String result = helloResponse.getResult();
               System.out.println("result="+result);
           }
       } catch (Exception e) {
           throw new RuntimeException(e);
       } finally {

           managedChannel.shutdown();

       }
   }