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. 编程之美 set 12 快速找出故障机器

    题目 1. 所有的 ID 都出现 2 次, 只有一个例外, 找到那个例外的 ID 2. 所有的 ID 都出现两次, 只有两个例外, 找出例外的那两个 总计 1. 剑指 offer 上有这两道题的解法, ...

  2. 解决ScrollView滑动RecyclerView的卡顿

    我们不的不了解ViewConfiguration这个类,官方是这么解释的Contains methods to standard constants used in the UI for timeou ...

  3. Android无线测试之—UiAutomator UiScrollable API介绍四

    获取与设置最大滚动次数常量值 一.获取与设置最大滚动次数常量值相关API 返回值 API 描述 int getMaxSearchSwipes() 获取执行搜索滑动过程中的最大滑动次数,默认最大滚动次数 ...

  4. [libwww-perl]——POST方法的使用

    libwww-perl是我在学习varnish的时候遇到的一个工具. 具体libwww-perl是干什么的,可以参考官网https://github.com/libwww-perl/libwww-pe ...

  5. CS无线电语

    [Radio Commands (" Z "键) - 无线电指令] 1."Cover me" (掩护我) 2."You Take The Point& ...

  6. [算法][LeetCode]Search a 2D Matrix——二维数组的二分查找

    题目要求 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the ...

  7. [Jenkins] Manage Jenkins from Web Interface

    URL 说明 [jenkins_url]/safeRestart This will restart Jenkins after the current builds have completed. ...

  8. Hadoop中正确地添加和移除节点

    正确地添加和移除节点 添加节点 克隆 克隆一台全新的Linux(如有IP冲突,可右击VMware右下角网络图标断开连接) 打开/etc/hostname修改主机名 打开/etc/sysconfig/n ...

  9. 部分 II. 保护web篇

    转载:http://www.mossle.com/docs/auth/html/pt02-web.html 部分 II. 保护web篇   2012-12-5 23:42:36 org.springf ...

  10. make_ext4fs 失败

    root@fengyun-server:/home/fmake_ext4fsengyun/android/reverse_engineer/rom制作# ./make_ext4fs -l 700M - ...