java 调用远程grpc_帮你节省一半时间的gRPC入门指南
写在前面
从上图和文档中我们可以了解到,用gRPC来进行远程服务调用就仅仅需要gRPC Stub(Client)用Proto Request向远方的gRPC Server发起服务调用,然后远方的gRPC Server通过Proto Response(s)将调用结果返回给gRPC Stub。
上面这段逻辑的背后,gRPC做了什么:
一个gRPC从开始发起请求到返回总共要经历过序列化,编解码,以及网络传输这些内容。这些东西在我们使用gRPC框架做远程服务调用的时候完全感知不到!
至于gRPC的stub之间的连接管理,健康检查,负载均衡,异常重试,优雅启停机,熔断限流等等是需要我们从gRPC源码中获得这些知识的!
从0写一个Java-gRPC项目
本demo项目代码:https://github.com/cld378632668/gRPC-java-introductiongithub.com
首先编写.proto文件,其中会定义service和message,比如这里我们定义:
service user{
rpc login(LoginRequest) returns (APIResponse);
rpc logout(Empty) returns (APIResponse);
}
message LoginRequest{
string username = 1;
string passwd = 2;
}
message APIResponse{
string responsemessage = 1;
int32 responseCode = 2;
}
message Empty{
}
然后不同的语言有不同的工具根据.proto生成源代码文件(如.java,本文以JAVA来讲解)。
例如我们在定义了service HelloService,mesage HelloRequest,message HelloResponse,自动生成的文件有:
Hello.java
HelloRequest.java
HelloRequestOrBuilder.java
HelloResponse.java
HelloResponseOrBuilder.java
在不同的RPC版本中,上面五个类可能全都放在一个Hello.java文件中
GreetingService.java
生成RPC通信代码:
HelloServiceGrpc.java,在其他RPC版本中该文件的名字可能为helloGrpc.java
该文件中包含有类:
helloServiceImplBase
helloStub
helloBlockingStub
helloFutureStub
自定义Service类
接下来我们需要在自己创建的服务端项目中实现一个HelloService类,这个类继承helloServiceImplBase,然后重写login和logout两个方法,这两个方法在后面的客户端中可以通过stub.login(..)的形式被调用。
class HelloService extends HelloGrpc.HelloImplBase {
@Override
public void login(User.LoginRequest request, StreamObserver responseObserver) {
String username = request.getUsername();
String password = request.getPasswd();
User.APIResponse.Builder response = User.APIResponse.newBuilder();
// APIResponse对应.proto里对应的一个message的名字
if (username.equals(password)){
response.setResponseCode(0).setResponsemessage("SUCCESS");
}else{
response.setResponseCode(100).setResponsemessage("INVALID PASSWD");
}
responseObserver.onNext(response.build());
responseObserver.onCompleted();
}
}
自定义服务端
一共三行核心代码。
// 服务的添加:
io.grpc.Server server = ServerBuilder.forPort(9090).addService(new 自定义的Service类名1()).
.addService(new Service2()).addService(new Service3()).build();
// 服务的启动:
server.start();
// 服务的关闭:
server.awaitTermination();
自定义客户端
自定义的客户端通过stub调用服务端的方法,服务端的方法一开始是定义在.proto的service中的,如rpc login(LoginRequest) returns (APIResponse); LoginRequest和APIResponse被定义为两个message.
标准的grpc client调用代码,最简单的方式,就三行代码:
ManagedChannelImpl channel = NettyChannelBuilder.forAddress("127.0.0.1", 6556).build();
// 其他写法1:
// ManagedChannelImpl channel = ManagedChannelBuilder.forAddress(host, port)
.usePlaintext()
.build();
DemoServiceGrpc.DemoServiceBlockingStub stub = DemoServiceGrpc.newBlockingStub(channel);
stub.login(LoginRequest.getDefaultInstance());
这三行代码,完成了grpc客户端调用服务器端最重要的三个步骤:创建连接到远程服务器的 channel
构建使用该channel的客户端stub
通过stub调用服务方法,执行RPC调用
代码参考
完整的代码构建过程可以参考:
1、微信文章.孟君的编程札记.一步步完成gRPC示例。
2、youtube教程:https://www.youtube.com/watch?v=JFzAe9SvNaU&list=PLI5t0u6ye3FGXJMh5kU2RvN0xrul67p7Rwww.youtube.com
Go Generated Code Reference
Thread-safety: note that client-side RPC invocations and server-side RPC handlersare thread-safeand are meant to be run on concurrent goroutines. But also note that forindividual streams, incoming and outgoing data is bi-directional but serial; so e.g.individual streamsdo not supportconcurrent readsorconcurrent writes(but reads are safely concurrentwithwrites).
推荐资料
java 调用远程grpc_帮你节省一半时间的gRPC入门指南相关推荐
- 核电集团数字化转型该怎么做?这篇案例分析帮你节省90%时间
当前,我国智能电网的最终目标是建设成为覆盖电力系统整个生产过程,包括发电.输电.变电.配电.用电及调度等多个环节的全景实时系统. 而支撑智能电网安全.可靠运行的基础是电网全景实时数据采集.传输和存储, ...
- 计算机二级有趣的圆锥,高考数学圆锥曲线常用二级结论帮你节省解题时间(精).pdf...
高考数学平圆锥曲线常用二级结论--帮你节省解题时间 高考数学平圆锥曲线常用二级结论--帮你节省解题时间 椭圆 椭圆 2 2 2 2 x a x y x a cos x y cosq ì q ì a b ...
- java让服务器停止运行,java调用远程服务器的shell脚本以及停止的方法实现
最近接了个需求,要求远程调shell脚本,你没听错!!!需求就一句话,咱是谁,咱是优秀的开发选手.考虑再三,有两种实现方式: 方案一:脚本所在服务器安装一个客户端,也就是自己写的一个小程序,本地通过端 ...
- linux 循环执行ip停止服务,java调用远程服务器的shell脚本以及停止的方法实现
最近接了个需求,要求远程调shell脚本,你没听错!!!需求就一句话,咱是谁,咱是优秀的开发选手.考虑再三,有两种实现方式: 方案一:脚本所在服务器安装一个客户端,也就是自己写的一个小程序,本地通过端 ...
- java调用远程 接口_java通过url调用远程接口返回json数据
java通过url调用远程接口返回json数据,有用户名和密码验证, 转自 https://blog.csdn.net/wanglong1990421/article/details/78815856 ...
- 十个小贴士!帮你节省编程时间、减少挫败感
全文共3373字,预计学习时长10分钟 来源:Pexels 在坚持学习之前,笔者至少四次开始立下决心好好学习编程课程,然而都无疾而终. 为此,笔者对数据科学专业学生做了相应调查,发现像笔者这样情况的并 ...
- java web swing 教程_【教程】Swing开发者快速入门指南
要求:JDK 1.6及更高版本 1.下载JxBrowser库 要下载JxBrowser库导航到 http://www.teamdev.com/jxbrowser,然后单击"下载"按 ...
- WebService工具类调用远程接口服务时java.io.IOException: Server returned HTTP response code: 500 for URL XXX
问题描述:在本地测试时,使用个人封装的Webservice代码工具类调用远程接口服务时,一切正常.但是一旦将该代码放到一个已有项目的中使用时,就会出现如下所示的错误提示 java.io.IOExcep ...
- webservice java接口远程调用
webservice 例如:java接口远程调用 文章目录 webservice 一.使用步骤 1引入Maven依赖 2.读入数据 总结 一.使用步骤 1引入Maven依赖 <!-- axis ...
最新文章
- Datawhale团队第四期录取名单!
- Bitcoin.com支持BCH第N弹——派息神器SLP Dividend Calculator
- 使用VS2010代码分析功能增强ASP.NET应“.NET研究”用程序安全
- 职场攻略:每天淘汰自己的不足
- mysql explain select_type
- Fail to queue the whole FAL gap in dataguard一例
- Java封装JSON数据
- 调用第三方接口发送短信
- Anylogic学习--------------数学函数
- 转并学习: 将rar文件转换为zip格式
- 深度学习 | 误差反向传播法
- 管道的故事(一)管道的故事
- UEBA架构设计之路3:复杂事件处理引擎
- AngularJS 事件绑定(ng-click)
- BN、CB领投Project Galaxy(GAL),即将在CoinList公募
- 一些大数据学习书籍pdf
- 【技术类】【ArcGIS对国产卫星的支持2:高分一号卫星】篇8、无缝镶嵌产品生产
- Gmap.net学习(一)程序配置
- 做模具设计的,为什么那么多人要用UG
- 警惕不良商家利用Panasonic SDFormatter 软件对SD/TF卡容量造假