【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 Lettuce 客户端入门到生产的实现步骤

《JavaLettuce客户端入门到生产的实现步骤》本文主要介绍了JavaLettuce客户端入门到生产的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录1 安装依赖MavenGradle2 最小化连接示例3 核心特性速览4 生产环境配置建议5 常见问题

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java高效实现PowerPoint转PDF的示例详解

《Java高效实现PowerPoint转PDF的示例详解》在日常开发或办公场景中,经常需要将PowerPoint演示文稿(PPT/PPTX)转换为PDF,本文将介绍从基础转换到高级设置的多种用法,大家... 目录为什么要将 PowerPoint 转换为 PDF安装 Spire.Presentation fo

Java8 Collectors.toMap() 的两种用法

《Java8Collectors.toMap()的两种用法》Collectors.toMap():JDK8中提供,用于将Stream流转换为Map,本文给大家介绍Java8Collector... 目录一、简单介绍用法1:根据某一属性,对对象的实例或属性做映射用法2:根据某一属性,对对象集合进行去重二、Du

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺