写在前面

从上图和文档中我们可以了解到,用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-introduction​github.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=PLI5t0u6ye3FGXJMh5kU2RvN0xrul67p7R​www.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入门指南相关推荐

  1. 核电集团数字化转型该怎么做?这篇案例分析帮你节省90%时间

    当前,我国智能电网的最终目标是建设成为覆盖电力系统整个生产过程,包括发电.输电.变电.配电.用电及调度等多个环节的全景实时系统. 而支撑智能电网安全.可靠运行的基础是电网全景实时数据采集.传输和存储, ...

  2. 计算机二级有趣的圆锥,高考数学圆锥曲线常用二级结论帮你节省解题时间(精).pdf...

    高考数学平圆锥曲线常用二级结论--帮你节省解题时间 高考数学平圆锥曲线常用二级结论--帮你节省解题时间 椭圆 椭圆 2 2 2 2 x a x y x a cos x y cosq ì q ì a b ...

  3. java让服务器停止运行,java调用远程服务器的shell脚本以及停止的方法实现

    最近接了个需求,要求远程调shell脚本,你没听错!!!需求就一句话,咱是谁,咱是优秀的开发选手.考虑再三,有两种实现方式: 方案一:脚本所在服务器安装一个客户端,也就是自己写的一个小程序,本地通过端 ...

  4. linux 循环执行ip停止服务,java调用远程服务器的shell脚本以及停止的方法实现

    最近接了个需求,要求远程调shell脚本,你没听错!!!需求就一句话,咱是谁,咱是优秀的开发选手.考虑再三,有两种实现方式: 方案一:脚本所在服务器安装一个客户端,也就是自己写的一个小程序,本地通过端 ...

  5. java调用远程 接口_java通过url调用远程接口返回json数据

    java通过url调用远程接口返回json数据,有用户名和密码验证, 转自 https://blog.csdn.net/wanglong1990421/article/details/78815856 ...

  6. 十个小贴士!帮你节省编程时间、减少挫败感

    全文共3373字,预计学习时长10分钟 来源:Pexels 在坚持学习之前,笔者至少四次开始立下决心好好学习编程课程,然而都无疾而终. 为此,笔者对数据科学专业学生做了相应调查,发现像笔者这样情况的并 ...

  7. java web swing 教程_【教程】Swing开发者快速入门指南

    要求:JDK 1.6及更高版本 1.下载JxBrowser库 要下载JxBrowser库导航到 http://www.teamdev.com/jxbrowser,然后单击"下载"按 ...

  8. WebService工具类调用远程接口服务时java.io.IOException: Server returned HTTP response code: 500 for URL XXX

    问题描述:在本地测试时,使用个人封装的Webservice代码工具类调用远程接口服务时,一切正常.但是一旦将该代码放到一个已有项目的中使用时,就会出现如下所示的错误提示 java.io.IOExcep ...

  9. webservice java接口远程调用

    webservice 例如:java接口远程调用 文章目录 webservice 一.使用步骤 1引入Maven依赖 2.读入数据 总结 一.使用步骤 1引入Maven依赖 <!-- axis ...

最新文章

  1. Datawhale团队第四期录取名单!
  2. Bitcoin.com支持BCH第N弹——派息神器SLP Dividend Calculator
  3. 使用VS2010代码分析功能增强ASP.NET应“.NET研究”用程序安全
  4. 职场攻略:每天淘汰自己的不足
  5. mysql explain select_type
  6. Fail to queue the whole FAL gap in dataguard一例
  7. Java封装JSON数据
  8. 调用第三方接口发送短信
  9. Anylogic学习--------------数学函数
  10. 转并学习: 将rar文件转换为zip格式
  11. 深度学习 | 误差反向传播法
  12. 管道的故事(一)管道的故事
  13. UEBA架构设计之路3:复杂事件处理引擎
  14. AngularJS 事件绑定(ng-click)
  15. BN、CB领投Project Galaxy(GAL),即将在CoinList公募
  16. 一些大数据学习书籍pdf
  17. 【技术类】【ArcGIS对国产卫星的支持2:高分一号卫星】篇8、无缝镶嵌产品生产
  18. Gmap.net学习(一)程序配置
  19. 做模具设计的,为什么那么多人要用UG
  20. 警惕不良商家利用Panasonic SDFormatter 软件对SD/TF卡容量造假

热门文章

  1. 关于虚拟现实叙事方式的终极入门指南
  2. 史上最全的vue插件库
  3. k8s安装kubesphere失败原因和解决方法
  4. 模型剪枝学习笔记--Pruning Filters for Efficient Convnets
  5. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用28
  6. delphi学习基础资料
  7. 使用云函数SCF+COS免费运营微信公众号
  8. 雅礼集训及WC2018划水记
  9. 百度董事长李彦宏的理念
  10. PHP开发微信支付代码及支付通知处理