Grpc系列二 Grpc4种服务方法的定义和实现

本文介绍了gRPC中的四种服务方法,包括一元RPC、服务器流RPC、客户端流RPC和双向流RPC,并分别展示了同步RPC和异步RPC的实现。文章通过服务定义、代码生成及服务端和客户端的测试代码,详细阐述了gRPC的基本使用和工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 概述

1.1 服务定义

向其它的RPC服务一样,GPRC的基础是服务的定义。服务定义远程调用方法的名称、传入参数和返回参数。GRPC默认使用 Protobuf描述服务,protobuf的信息见这篇博客Protobuf3 的第一个Java demo

GRPC一共定义4种服务方法:

  1. 一元RPC(Unary RPCs ):这是最简单的定义,客户端发送一个请求,服务端返回一个结果
  2. 服务器流RPC(Server streaming RPCs):客户端发送一个请求,服务端返回一个流给客户端,客户从流中读取一系列消息,直到读取所有小心
  3. 客户端流RPC(Client streaming RPCs ):客户端通过流向服务端发送一系列消息,然后等待服务端读取完数据并返回处理结果
  4. 双向流RPC(Bidirectional streaming RPCs):客户端和服务端都可以独立向对方发送或接受一系列的消息。客户端和服务端读写的顺序是任意。

    以上的服务方法定义在proto文件,如下:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.hry.spring.grpc.mystream";
option java_outer_classname = "HelloStreamEntity";

service HelloStream {
  // A Unary RPC.
  rpc simpleRpc(Simple) returns (SimpleFeature) {}

  // A server-to-client streaming RPC.
  rpc server2ClientRpc(SimpleList) returns (stream SimpleFeature) {}

  // A client-to-server streaming RPC.
  rpc client2ServerRpc(stream Simple) returns (SimpleSummary) {}

  // A Bidirectional streaming RPC.
  rpc bindirectionalStreamRpc(stream Simple) returns (stream Simple) {}
}


message Simple {
  int32 num = 1;
  string name = 2;
}

message SimpleList {
  repeated Simple simpleList = 1;
}

message SimpleFeature {
  string name = 1;
  Simple location = 2;
}

message SimpleSummary {
  int32 feature_count = 2;
}

// 测试类
message SimpleFeatureDatabase {
  repeated SimpleFeature feature = 1;
}

1.2 同步RPC和异步RPC

GRPC 同时支持同步RPC和异步RPC。
同步RPC调用服务方法只支持流RPC(Server streaming RPCs)和一元RPC(Unary RPCs )。异步RPC调用服务方法支持4种方法。

1.3 生成基础代码 ###

参考的Grpc系列一 第一个hello world 例子生成protobuf基础类和HelloStreamGrpc,详细见这里代码

2. 测试代码

这里实现服务端和客户端代码

2.1 服务端

服务端类的实现,通过继承HelloStreamGrpc.HelloStreamImplBase实现,具体服务接口实现见下面:

/**
     * 服务端类的实现
     *
     */
    private static class HelloStreamService extends HelloStreamGrpc.HelloStreamImplBase {
   
   
        private final List<SimpleFeature> features;

        public HelloStreamService(List<SimpleFeature> features) {
            this.features = features;
        }
    ...
  • 一元RPC(Unary RPCs )服务端实现:
        @Override
        public void simpleRpc(Simple request, StreamObserver<SimpleFeature> responseObserver) {
            SimpleFeature rtn = SimpleFeature.newBuilder().setName(request.getName() + "simpleRpc").setLocation(request)
                    .build();
            logger.info("recevier simpleRpc : {}", request);
            responseObserver.onNext(rtn);
            responseObserver.onCompleted();
        }
  • 服务器流RPC(Server streaming RPCs)服务端实现:
        @Override
        public void server2ClientRpc(SimpleList request, StreamObserver<SimpleFeature> responseObserver) {
            logge
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值