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 ...
随机推荐
- Python 正则表达式贪婪模式
贪婪模式也就是我们使用 .* 匹配任意字符时会尽可能长地向后匹配,如果我们想阻止这种贪婪模式,需要加个问号,尽可能少地匹配,如下例子: In []: import re In []: html = ' ...
- 0.0.0.0:80端口被系统System占用
用netstat -ano命令查看,可以找到0.0.0.0:80占用的PID假设为4,然后在任务管理器中的详细信息面板中可以找到PID等于4的进程,如果用户名为SYSTEM, 不能直接终止掉,需要去注 ...
- Memcached 之 .NET(C#)实例分析
一:Memcached的安装 step1. 下载memcache(http://jehiah.cz/projects/memcached-win32)的windows稳定版(这里我下载了memcach ...
- .NET 4.0 中的契约式编程
契约式编程不是一门崭新的编程方法论.C/C++ 时代早已有之.Microsoft 在 .NET 4.0 中正式引入契约式编程库.博主以为契约式编程是一种相当不错的编程思想,每一个开发人员都应该掌握.它 ...
- Android软键盘的隐藏显示研究
http://winuxxan.blog.51cto.com/2779763/522810 全局推: android:windowSoftInputMode="adjustResize&qu ...
- Gson简要使用笔记(转载)
经过比较,gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需 ...
- Markdown安装与简单使用
早就听过Markdown的大名了,说是最适合程序员的编辑器,一点也不为过.平时写文章,写博客.除了内容以外,还要被一堆繁琐的样式困扰,毕竟样式太难看,既是自己的文章,也会懒得看的.今天正好看到博客上面 ...
- apt-get tips
1.通过apt-get安装指定版本的软件 apt-get install <package name>=<version> 2.通过apt-cache列举所有可获取的版本 ap ...
- django组件之ContentType
ContentTyep组件: 帮助我们关联所有数据库的表 帮助我们反向查询关联数据表中的所有策略信息 GenericForeignkey(帮助我们快速插入数据) GenericRelation(用于反 ...
- Django在生产环境中的部署
基本思路 1.方案:Nginx+uwsgi 这样大体的流程是:nginx作为服务器最前端,负责接收client的所有请求,统一管理.静态请求由Nginx自己处理.非静态请求通过uwsgi传递给Djan ...