grpc入门(三)
grpc入门(三)
一.介绍
本文是关于grpc的第三篇博文,是对前两篇博文的具体代码实现,秉着个人一贯的风格,没有太多抒情和总结,直接就上代码。
文章代码参考:https://github.com/grpc/grpc-java/tree/master/examples/src/main/java/io/grpc/examples
二.grpc具体实现
2.1 服务器端的编写
public class GrpcServer { private Server server; public void start() throws IOException {
int port = 8899;
server = ServerBuilder.forPort(port)
.addService(new DemoService())
.build()
.start();
} public void stop() {
if(null != server) {
server.shutdown();
}
} public void blockingUtilShutdown() throws InterruptedException {
if(null != server) {
server.awaitTermination();
}
} public static void main(String[] args) throws Exception {
GrpcServer grpcServer = new GrpcServer();
grpcServer.start();
grpcServer.blockingUtilShutdown();
}
}
2.2 服务器端对接口的实现
public class DemoService extends DemoGrpc.DemoImplBase{ /**
* rpc GetUserById(MyRequest) returns (MyResponse);
*/
@Override
public void getUserById(MyRequest request, StreamObserver<MyResponse> responseObserver) {
System.out.println("客户端的参数: " + request.getId());
responseObserver.onNext(MyResponse.newBuilder().setRealname("张三").build());
responseObserver.onCompleted();
} /**
* rpc GetInfos(InfoRequest) returns (InfoResponse);
*/
@Override
public void getInfos(InfoRequest request, StreamObserver<InfoResponse> responseObserver) {
System.out.println("客户端请求数据: " + request.getMsg()); Map<Long, String> m1 = new HashMap<>();
m1.put(1L, "AAAA");
m1.put(2L, "BBBB");
Info i1 = Info.newBuilder().setAge(10).setName("张三").setFlag(false).putAllOthers(m1).build(); Map<Long, String> m2 = new HashMap<>();
m2.put(3L, "XXXX");
m2.put(4L, "YYYY");
Info i2 = Info.newBuilder().setAge(20).setName("李四").setFlag(true).putAllOthers(m2).build(); responseObserver.onNext(InfoResponse.newBuilder().addAllInfos(Arrays.asList(i1, i2)).build());
responseObserver.onCompleted();
} /**
* rpc Greeting(stream GreetRequest) returns (GreetResponse);
*/
@Override
public StreamObserver<GreetRequest> greeting(StreamObserver<GreetResponse> responseObserver) {
return new StreamObserver<GreetRequest>() {
//该方法会等待着客户端的onCompleted()方法被调用,如果客户端调用了onCompleted()方法,那么该方法会被调用
@Override
public void onCompleted() {
responseObserver.onNext(GreetResponse.newBuilder().setDate(new Date() + "").setMsg("data1").build());
responseObserver.onCompleted();
} @Override
public void onError(Throwable throwable) {
} //该方法会一直监听客户端的 onNext()方法,如果客户端调用了onNext()方法,那么该方法就会被触发
@Override
public void onNext(GreetRequest request) {
System.out.println("客户端的数据: " + request.getName());
}
};
} /**
* rpc GetPeoplesByName(PeopleRequest) returns (stream PeopleList);
*/
@Override
public void getPeoplesByName(PeopleRequest request, StreamObserver<PeopleList> responseObserver) {
System.out.println("客户端请求的数据: " + request.getName()); People p1 = People.newBuilder().setAge(10).setHeight(166.67f).setName("张三").setMoney(45).setIsMarried(true).build();
People p2 = People.newBuilder().setAge(20).setHeight(176.67f).setName("李四").setMoney(4500).setIsMarried(true).build();
People p3 = People.newBuilder().setAge(30).setHeight(186.67f).setName("王五").setMoney(45.90).setIsMarried(false).build(); PeopleList list = PeopleList.newBuilder().addAllPeoples(Arrays.asList(p1, p2, p3)).build(); responseObserver.onNext(list);
responseObserver.onCompleted();
} /**
* rpc GetStudents(stream StudentRequest) returns (stream StudentList);
*/
@Override
public StreamObserver<StudentRequest> getStudents(StreamObserver<StudentList> responseObserver) {
return new StreamObserver<StudentRequest>() { @Override
public void onCompleted() {
Student s1 = Student.newBuilder().setName("张三").setScore(100).build();
Student s2 = Student.newBuilder().setName("李四").setScore(90).build(); StudentList l1 = StudentList.newBuilder().addAllStudents(Arrays.asList(s1, s2)).build(); responseObserver.onNext(l1);
responseObserver.onCompleted();
} @Override
public void onError(Throwable throwable) {
} @Override
public void onNext(StudentRequest studentRequest) {
System.out.println(studentRequest.getInfosMap());
}
};
}
}
2.3 客户端的编写
public class GrpcClient { private ManagedChannel channel; //阻塞的方式,一元的方法和请求为非流式数据都可以采用该方式
private DemoGrpc.DemoBlockingStub blockingStub; //非阻塞方式,所有的方法都可以采用这种方式,对于请求为流式数据,必须使用该方式
private DemoGrpc.DemoStub demoStub; public GrpcClient(String host, int port) {
this(ManagedChannelBuilder.forAddress(host, port)
.usePlaintext(true)
.build());
} public GrpcClient(ManagedChannel channel) {
this.channel = channel;
this.blockingStub = DemoGrpc.newBlockingStub(channel);
this.demoStub = DemoGrpc.newStub(channel);
} /**
* 一元方法, 普通的调用
* rpc GetUserById(MyRequest) returns (MyResponse);
*/
public void getUserById() {
MyResponse resp = this.blockingStub.getUserById(MyRequest.newBuilder().setId(80000).build());
System.out.println("服务端返回的数据: " + resp.getRealname());
} /**
* rpc GetInfos(InfoRequest) returns (InfoResponse);
*/
public void getInfos() {
InfoResponse resp = this.blockingStub.getInfos(InfoRequest.newBuilder().setMsg("信息一").build());
resp.getInfosList().forEach(info -> {
System.out.println(info.getAge() + ";;" + info.getName() + ";;" + info.getFlag());
info.getOthersMap().forEach((k, v) -> {
System.out.println(k + " == " + v);
});
System.out.println("------------------------------------------------");
});
} /**
* rpc Greeting(stream GreetRequest) returns (GreetResponse);
*/
public void greeting() {
StreamObserver<GreetRequest> requestStream = demoStub.greeting(new StreamObserver<GreetResponse>() {
//服务端的onNext()方法调用后,该方法会被调用
@Override
public void onNext(GreetResponse resp) {
System.out.println(resp.getDate() + ";;" + resp.getMsg());
} @Override
public void onError(Throwable throwable) {
} //服务端的onCompleted()方法调用后,该方法会被调用。
@Override
public void onCompleted() {
System.out.println("服务端的onComplete()方法执行完毕");
}
}); requestStream.onNext(GreetRequest.newBuilder().setName("张三号").build());
requestStream.onCompleted();
} /**
* rpc GetPeoplesByName(PeopleRequest) returns (stream PeopleList);
*/
public void getPeoplesByName() {
PeopleRequest req = PeopleRequest.newBuilder().setName("刘XX").build(); demoStub.getPeoplesByName(req, new StreamObserver<PeopleList>() {
@Override
public void onCompleted() {
} @Override
public void onError(Throwable throwable) {
} @Override
public void onNext(PeopleList peopleList) {
List<People> list = peopleList.getPeoplesList();
list.forEach(p -> {
System.out.println(p.getAge() + ";;" + p.getHeight() + ";;" + p.getMoney()
+ ";;" + p.getIsMarried() + ";;" + p.getName());
});
}
});
} /**
* rpc GetStudents(stream StudentRequest) returns (stream StudentList);
* @throws InterruptedException
*/
public void getStudentsList() throws InterruptedException {
StreamObserver<StudentRequest> requestStream = demoStub.getStudents(new StreamObserver<StudentList>() {
@Override
public void onCompleted() {
} @Override
public void onError(Throwable throwable) {
} @Override
public void onNext(StudentList studentList) {
Iterator<Student> iter = studentList.getStudentsList().iterator();
while(iter.hasNext()) {
Student s = iter.next();
System.out.println(s.getName() + ";;" + s.getScore());
}
}
}); Map<String, String> map = new HashMap<>();
map.put("xx", "XX");
map.put("zz", "ZZ"); requestStream.onNext(StudentRequest.newBuilder().putAllInfos(map).build());
requestStream.onCompleted();
} public static void main(String[] args) throws InterruptedException {
GrpcClient client = new GrpcClient("localhost", 8899);
//client.getUserById();
//client.getInfos();
//client.greeting();
client.getStudentsList();
Thread.sleep(10000);
}
}
grpc入门(三)的更多相关文章
- 微服务架构攀登之路(三)之gRPC入门
一.gRPC入门 1. gRPC 简介 gRPC 由 google 开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC 客户端和服务端可以在多种环境中运行和交互,例如用 java 写一个 ...
- Go 中的 gRPC 入门详解
目录 Go GRPC 入门 1,安装包 2,gRPC 服务端 3,gRPC 客户端 4,编译运行 5,其它 GRPC Protobuf buffer 字段类型 字段规则 Protobuf gRPC 四 ...
- 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...
- Swift语法基础入门三(函数, 闭包)
Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...
- Thinkphp入门三—框架模板、变量(47)
原文:Thinkphp入门三-框架模板.变量(47) [在控制器调用模板] display() 调用当前操作名称的模板 display(‘名字’) 调用指定名字的模板文件 控制器调用模板四种方式 ...
- DevExpress XtraReports 入门三 创建 Master-Detail(主/从) 报表
原文:DevExpress XtraReports 入门三 创建 Master-Detail(主/从) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用 ...
- 微服务(入门三):netcore ocelot api网关结合consul服务发现
简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...
- 脑残式网络编程入门(三):HTTP协议必知必会的一些知识
本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...
- 3.Python爬虫入门三之Urllib和Urllib2库的基本使用
1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...
随机推荐
- 编程之美 set 12 快速找出故障机器
题目 1. 所有的 ID 都出现 2 次, 只有一个例外, 找到那个例外的 ID 2. 所有的 ID 都出现两次, 只有两个例外, 找出例外的那两个 总计 1. 剑指 offer 上有这两道题的解法, ...
- 解决ScrollView滑动RecyclerView的卡顿
我们不的不了解ViewConfiguration这个类,官方是这么解释的Contains methods to standard constants used in the UI for timeou ...
- Android无线测试之—UiAutomator UiScrollable API介绍四
获取与设置最大滚动次数常量值 一.获取与设置最大滚动次数常量值相关API 返回值 API 描述 int getMaxSearchSwipes() 获取执行搜索滑动过程中的最大滑动次数,默认最大滚动次数 ...
- [libwww-perl]——POST方法的使用
libwww-perl是我在学习varnish的时候遇到的一个工具. 具体libwww-perl是干什么的,可以参考官网https://github.com/libwww-perl/libwww-pe ...
- CS无线电语
[Radio Commands (" Z "键) - 无线电指令] 1."Cover me" (掩护我) 2."You Take The Point& ...
- [算法][LeetCode]Search a 2D Matrix——二维数组的二分查找
题目要求 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the ...
- [Jenkins] Manage Jenkins from Web Interface
URL 说明 [jenkins_url]/safeRestart This will restart Jenkins after the current builds have completed. ...
- Hadoop中正确地添加和移除节点
正确地添加和移除节点 添加节点 克隆 克隆一台全新的Linux(如有IP冲突,可右击VMware右下角网络图标断开连接) 打开/etc/hostname修改主机名 打开/etc/sysconfig/n ...
- 部分 II. 保护web篇
转载:http://www.mossle.com/docs/auth/html/pt02-web.html 部分 II. 保护web篇 2012-12-5 23:42:36 org.springf ...
- make_ext4fs 失败
root@fengyun-server:/home/fmake_ext4fsengyun/android/reverse_engineer/rom制作# ./make_ext4fs -l 700M - ...