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 ...
随机推荐
- LinCode落单的数
easy 落单的数 查看执行结果 60% 通过 给出2*n + 1 个的数字,除当中一个数字之外其它每一个数字均出现两次.找到这个数字. 您在真实的面试中是否遇到过这个题? Yes 例子 给出 [1, ...
- 第一个MapReduce的例子
第一个MapReduce的例子 Hadoop Guide的第一个MapReduce的例子是处理气象数据的(数据来源ncdc),终于跑通了.总结一下步骤,安装hadoop不在本文中介绍 1 数据预处理 ...
- DELPHI中调用XSD去验证XML的合法性
procedure TFrmPrintReport.Button3Click(Sender: TObject);var SchemaDoc, XmlDoc: IXMLDOMDocument2; S ...
- 关于LegacyExchangeDN的问题
IMCEAEX i NDR This problem is not common but quite annoying and usually hard to understood by users. ...
- Foj1683矩阵快速幂水题
Foj 1683 纪念SlingShot 题目链接:http://acm.fzu.edu.cn/problem.php?pid=1683 题目:已知 F(n)=3 * F(n-1)+2 * F(n-2 ...
- Purpose of ContextLoaderListener in Spring
The ApplicationContext is where your Spring beans live. The purpose of the ContextLoaderListener is ...
- (2.6)Mysql之SQL基础——存储引擎的查看与修改
(2.6)Mysql之SQL基础——存储引擎的查看与修改 可以使用 show engines; 查看数据库支持的所有的存储引擎: 目录: 1.数据库级别存储引擎 1.1查看现在默认的存储引擎 1.2 ...
- ambari rest api (三)
1.获取指定主机指定组件的信息列表 http://ip:8080/api/v1/clusters/hdp_dev/hosts/hadoop003.edcs.org/host_components/DA ...
- 使用QJM构建HDFS HA架构(2.2+)
转载自:http://blog.csdn.net/a822631129/article/details/51313145 本文主要介绍HDFS HA特性,以及如何使用QJM(Quorum Journa ...
- Linux修改信息
修改时间 sudo date -s MM/DD/YY //修改日期 sudo date -s hh:mm:ss //修改时间 在修改时间以后,修改硬件CMOS的时间 sudo hwclock --sy ...