写在前面

从上图和文档中我们可以了解到,用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. BugkuCTF-Reverse题easy-100(LCTF)
  2. 3d打印主要的切片参数类型_3D打印机切片参数详情说明
  3. Flyweight设计模式
  4. 果园机器人作文开头_易学好用的万能开头—热点事件引入式
  5. pytorch torch.narrow
  6. pythonturtle库画图_python 用turtle库画图
  7. 调查作业时,注意 【 调查深度 】 ,以及总结 【 中间成果物 】
  8. 精装友好联络算法实现借壳和RI
  9. 卡巴世界,卡巴斯基,卡巴斯基key,卡巴斯基激活码,软件下载,每天更新
  10. 容联七陌×惠州燃气丨用服务之光,点燃美好生活
  11. AppleScript(0) : 文档与语法
  12. 解决Linux下adb devices找不到设备
  13. 计算机安全的最后一道防线,网络安全的第一道防线是(图文)
  14. PAT甲级 1087 条条大路通罗马
  15. mysql行转列简单例子_mysql行转列、列转行示例
  16. 人工智能 2.知识表示
  17. discuz目录结构 ano
  18. 山东科技大学计算机学院教科办电话,山东科技大学教务处
  19. 牛顿迭代法及其实际应用(附C++代码)
  20. java 包装类 equals_java的equals与==,包装类

热门文章

  1. NSP4——Network Simulator for P4
  2. C语言exp()函数,计算以e为底的x次方的值
  3. 百度站长HTML添加301错误,搜索资源平台(百度站长)添加网站 使用文件验证 验证失败,原因:未知原因:301的解决办法...
  4. Codeforces-1582 A: Luntik and Concerts
  5. Delaunay三角网
  6. WPS怎么在论文参考文献后插入致谢
  7. Java对接第三方支付渠道之支付宝支付
  8. floyed 算法计算最短路径
  9. 上海宏满实业档案管理规范化
  10. Excel表格快速生成LaTeX