【RPC】Grpc的Streaming

文章目录

    • 一、前言
    • 二、gRPC服务端流
    • 三、grpc客户端流
    • 四、gRPC双向流
    • 五、StreamObserver转换为反应式框架流
    • 六、总结

一、前言

grpc 是一个由 google 推出的、高性能、开源、通用的 rpc 框架。它是基于 HTTP2 协议标准设计开发,默认采用 Protocol Buffers 数据序列化协议,支持多种开发语言。

一般业务场景下,我们都是使用grpc的simple-rpc模式,也就是每次客户端发起请求,服务端会返回一个响应结果的模式。
【RPC】Grpc的Streaming_第1张图片
但是grpc除了这种一来一往的请求模式外,还有流式模式。

二、gRPC服务端流

服务端流模式是说客户端发起一次请求后,服务端在接受到请求后,可以以流的方式,使用同一连接,不断的向客户端写回响应结果,客户端则可以源源不断的接受到服务端写回的数据。
【RPC】Grpc的Streaming_第2张图片
我们通过简单例子,来说明如何使用服务端端流。
要实现服务端流,需要把grpc方法定义如下:


message Metric {
   
    google.protobuf.Timestamp timestamp = 1;
    int64 metric = 2;
}

message Average {
   
    double val = 1;
}

service MetricsService {
   
    rpc collectServerStream (Metric) returns (stream Average);
}

如上rpc方法的返回值类型前添加stream标识 是服务端流,然后服务端实现代码如下:

import com.example.server.streaming.StreamingExample.Metric;
import io.grpc.stub.StreamObserver;
import com.example.server.streaming.StreamingExample.Average;

public class MetricsServiceImpl extends MetricsServiceGrpc.MetricsServiceImplBase {
   

    public StreamObserver<StreamingExample.Average> responseObserverT;
    /**
     * 服务端流
     *
     * @param request
     * @param responseObserver
     */
    @Override
    public void collectServerStream(Metric request,
                                    StreamObserver<Average> responseObserver) {
   
        //保存流式响应对象
        this.responseObserverT = responseObserver;
    }

最后启动服务,并当流式对象不为null时候,写回数据到客户端:


public class MetricsServerServerStream {
   
    public static void main(String[] args) throws InterruptedException, IOException {
   
        //启动服务
        MetricsServiceImpl metricsService = new MetricsServiceImpl();
        Server server = ServerBuilder.forPort(8080).addService(metricsService).build();
        server.start();

        //获取steam响应对象,不断的向客户端写回数据
        new Thread(new Runnable() {
   
            @Override
            public void run() {
   
                for (; ; ) {
   
                    if (null != metricsService.responseObserverT) {
   
                        metricsService.responseObserverT.onNext(StreamingExample.Average.newBuilder()
                                .setVal(new Random(1000).nextDouble())
                                .build());
                        System.out.println("send to client");
                    }
                    try {
   
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
   

你可能感兴趣的:(Go,grpc,Streaming)