【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

相关文章

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面