【Grpc(二)】两种stub, 四种模式(unary,客户端stream,服务端strea)示例

本文主要是介绍【Grpc(二)】两种stub, 四种模式(unary,客户端stream,服务端strea)示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

protobuff定义:

syntax = "proto3";package com.liyao;option java_package = "com.liyao.protobuf.test.service";
option java_outer_classname = "MyServiceProto";
option java_multiple_files = true;message MyRequest {repeated uint32 keys = 1;
}message MyResponse {string value = 1;
}service MyService {rpc GetByKey (MyRequest) returns (MyResponse);rpc GetByKeyServerStream (MyRequest) returns (stream MyResponse);rpc GetByKeyClientStream (stream MyRequest) returns (MyResponse);rpc GetByKeyBiStream (stream MyRequest) returns (stream MyResponse);
}

服务比较简单,请求包含一个int的list,返回对应的key。

服务端实现类:

public class MyRpcServiceImpl extends MyServiceGrpc.MyServiceImplBase {private final Map<Integer, String> map = ImmutableMap.<Integer, String>builder().put(1, "v1").put(2, "v2").put(3, "v3").put(4, "v4").put(5, "v5").build();@Overridepublic void getByKey(MyRequest request, StreamObserver<MyResponse> responseObserver) {int key = request.getKeys(0);String value = map.getOrDefault(key, "null");responseObserver.onNext(MyResponse.newBuilder().setValue(value).build());responseObserver.onCompleted();}@Overridepublic void getByKeyServerStream(MyRequest request, StreamObserver<MyResponse> responseObserver) {for (int key : request.getKeysList()) {String value = map.getOrDefault(key, "null");responseObserver.onNext(MyResponse.newBuilder().setValue(value).build());}responseObserver.onCompleted();}@Overridepublic StreamObserver<MyRequest> getByKeyClientStream(StreamObserver<MyResponse> responseObserver) {return new StreamObserver<MyRequest>() {String values = "";@Overridepublic void onNext(MyRequest myRequest) {int key = myRequest.getKeys(0);values += map.getOrDefault(key, "null");}@Overridepublic void onError(Throwable throwable) {}@Overridepublic void onCompleted() {responseObserver.onNext(MyResponse.newBuilder().setValue(values).build());responseObserver.onCompleted();}};}@Overridepublic StreamObserver<MyRequest> getByKeyBiStream(StreamObserver<MyResponse> responseObserver) {return new StreamObserver<MyRequest>() {@Overridepublic void onNext(MyRequest myRequest) {int key = myRequest.getKeys(0);String value = map.getOrDefault(key, "null");responseObserver.onNext(MyResponse.newBuilder().setValue(value).build());}@Overridepublic void onError(Throwable throwable) {}@Overridepublic void onCompleted() {responseObserver.onCompleted();}};}
}

服务端启动类:

public class RpcServer {public static final int port = 8088;public static void main( String[] args ) throws IOException, InterruptedException {MyRpcServiceImpl service = new MyRpcServiceImpl();Server server = io.grpc.ServerBuilder.forPort(port).addService(service).build();server.start();server.awaitTermination();}
}

客户端启动类:

public class RpcClient {private static ManagedChannel channel = ManagedChannelBuilder.forAddress("127.0.0.1", RpcServer.port).usePlaintext().build();private static MyServiceGrpc.MyServiceBlockingStub blockingStub = MyServiceGrpc.newBlockingStub(channel);private static MyServiceGrpc.MyServiceStub asyncStub = MyServiceGrpc.newStub(channel);private static final StreamObserver<MyResponse> responseObserver = new StreamObserver<MyResponse>() {@Overridepublic void onNext(MyResponse response) {System.out.println("receive: " + response.getValue());}@Overridepublic void onError(Throwable t) {System.out.println("error");}@Overridepublic void onCompleted() {System.out.println("completed");}};public static void main(String[] args) throws InterruptedException {simpleSync();simpleAsync();serverStreamSync();serverStreamAsync();clientStream();biStream();Thread.sleep(100000);}private static void simpleSync() {MyRequest request = MyRequest.newBuilder().addKeys(1).build();String value = blockingStub.getByKey(request).getValue();System.out.println(value);}private static void simpleAsync() {MyRequest request = MyRequest.newBuilder().addKeys(1).build();asyncStub.getByKey(request, responseObserver);}private static void serverStreamSync() {MyRequest request = MyRequest.newBuilder().addKeys(1).addKeys(2).addKeys(3).build();Iterator<MyResponse> itr = blockingStub.getByKeyServerStream(request);while (itr.hasNext()) {System.out.println(itr.next());}}private static void serverStreamAsync() {MyRequest request = MyRequest.newBuilder().addKeys(1).addKeys(2).addKeys(3).build();asyncStub.getByKeyServerStream(request, responseObserver);}private static void clientStream() {StreamObserver<MyRequest> requestData = asyncStub.getByKeyClientStream(responseObserver);for (int i = 1; i <= 5; i++) {requestData.onNext(MyRequest.newBuilder().addKeys(i).build());}requestData.onCompleted();}private static void biStream() {StreamObserver<MyRequest> requestData = asyncStub.getByKeyBiStream(responseObserver);for (int i = 1; i <= 5; i++) {requestData.onNext(MyRequest.newBuilder().addKeys(i).build());}requestData.onCompleted();}
}

对于同步stub,只能调用unary以及服务端stream的方法;对于异步stub,可以调用任意方法;

unary以及服务端stream写法比较简单;对于客户端stream的情况,需要在构建请求参数的observer。

更具体的见https://blog.csdn.net/u010900754/article/details/106203724

这篇关于【Grpc(二)】两种stub, 四种模式(unary,客户端stream,服务端strea)示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/999489

相关文章

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

java Stream操作转换方法

《javaStream操作转换方法》文章总结了Java8中流(Stream)API的多种常用方法,包括创建流、过滤、遍历、分组、排序、去重、查找、匹配、转换、归约、打印日志、最大最小值、统计、连接、... 目录流创建1、list 转 map2、filter()过滤3、foreach遍历4、groupingB

Python实现阶乘的四种写法

《Python实现阶乘的四种写法》本文主要介绍了Python实现阶乘的六种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录第一种:推导式+循环遍历列表内每个元素相乘第二种:调用functools模块reduce的php累计