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入门(三)的更多相关文章

  1. 微服务架构攀登之路(三)之gRPC入门

    一.gRPC入门 1. gRPC 简介 gRPC 由 google 开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC 客户端和服务端可以在多种环境中运行和交互,例如用 java 写一个 ...

  2. Go 中的 gRPC 入门详解

    目录 Go GRPC 入门 1,安装包 2,gRPC 服务端 3,gRPC 客户端 4,编译运行 5,其它 GRPC Protobuf buffer 字段类型 字段规则 Protobuf gRPC 四 ...

  3. 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

  4. Swift语法基础入门三(函数, 闭包)

    Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...

  5. Thinkphp入门三—框架模板、变量(47)

    原文:Thinkphp入门三-框架模板.变量(47) [在控制器调用模板] display()   调用当前操作名称的模板 display(‘名字’)  调用指定名字的模板文件 控制器调用模板四种方式 ...

  6. DevExpress XtraReports 入门三 创建 Master-Detail(主/从) 报表

    原文:DevExpress XtraReports 入门三 创建 Master-Detail(主/从) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用 ...

  7. 微服务(入门三):netcore ocelot api网关结合consul服务发现

    简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...

  8. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  9. 3.Python爬虫入门三之Urllib和Urllib2库的基本使用

    1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...

随机推荐

  1. iOS开发之--NSNotificationCenter的使用

    NSNotification是IOS中一个调度消息通知的类,采用单例模式设计,在程序中实现传值.回调等地方应用很广 iOS中通知中心NSNotificationCenter应用总结 一.了解几个相关的 ...

  2. Linux命令之乐--read

    read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 -p:后接屏幕输出的提示语句 -n:设定输入的字符个数,当达到指定的个数则自动退出,并将输入赋予给变量 -t:当输 ...

  3. vue2.0非父子间进行通讯

    在vue中,父组件向之组件通讯使用的是props,子组件向父组件通讯使用的是$emit+事件,那非父子间的通讯呢,在官方文档上只有寥寥数笔, 概念很模糊,这个空的vue实例应该放在哪里呢,光放文档并没 ...

  4. MySQL的system命令在渗透测试中的使用以及UDF提权

    声明:下面引用关于SYSTEM的东西是自己之前的内容,是自己没有研究透导致的错误结论:有了错就要改,做技术的不能弄虚作假,时时刻刻要求自己要谨慎,虽然我的博客没人看,但是也要向所有已经看到的人道歉,错 ...

  5. 【黑金原创教程】【Modelsim】【第二章】Modelsim就是电视机

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  6. 前端性能优化-减少http请求,dns预解析,减少repaint和reflow

    前端性能优化方法: 一 . 减少http请求 (1)通过合并图片,减少请求,俗称css sprites(css精灵)css sprites (2)lazyload懒加载,在需要的时候再加载 1.定义: ...

  7. Ubuntu 16.04 安装 Phpmyadmin 出现的问题及解决

    ubuntu 16.04 install phpmyadmin $ apt install phpmyadmin 安装时出现一个错误: An error occurred while installi ...

  8. 桌面不显示IE图标解决方法

    如果你的是WIN7,恰好你的桌面上IE图标不知道怎么被搞咩了. 向这里看过来,这里有一个文件你正好能用上. 使用方法很简单: 猛戳下载,猛戳两下安装 下载解决

  9. 用angular引入复杂的json文件2

    昨天我们也说了一下angular引入复杂json文件的方法,今天我们再来学习一种方法,而且更简单,更快捷. 首先我们引入一个angular插件,并且写上引入模块和控制台,在html中书写上模块名和控制 ...

  10. http协议------>概述和动手实践认识Http协议

    http协议是用来定义客户端和web服务器通讯格式 浏览器与服务器的交互过程 是tcp/ip的应用层 版本:http/1.0(客户端和web服务器建立连接后只能访问一个web资源)   http/1. ...