06 | RPC实战:剖析gRPC源码,动手实现一个完整的RPC
何小锋
该思维导图由 AI 生成,仅供参考
你好,我是何小锋。上一讲我分享了动态代理,其作用总结起来就是一句话:“我们可以通过动态代理技术,屏蔽 RPC 调用的细节,从而让使用者能够面向接口编程。”
到今天为止,我们已经把 RPC 通信过程中要用到的所有基础知识都讲了一遍,但这些内容多属于理论。这一讲我们就来实战一下,看看具体落实到代码上,我们应该怎么实现一个 RPC 框架?
为了能让咱们快速达成共识,我选择剖析 gRPC 源码(源码地址:https://github.com/grpc/grpc-java)。通过分析 gRPC 的通信过程,我们可以清楚地知道在 gRPC 里面这些知识点是怎么落地到具体代码上的。
gRPC 是由 Google 开发并且开源的一款高性能、跨语言的 RPC 框架,当前支持 C、Java 和 Go 等语言,当前 Java 版本最新 Release 版为 1.27.0。gRPC 有很多特点,比如跨语言,通信协议是基于标准的 HTTP/2 设计的,序列化支持 PB(Protocol Buffer)和 JSON,整个调用示例如下图所示:
gRPC调用示例图
如果你想快速地了解一个全新框架的工作原理,我个人认为最快的方式就是从使用示例开始,所以现在我们就以最简单的 HelloWord 为例开始了解。
在这个例子里面,我们会定义一个 say 方法,调用方通过 gRPC 调用服务提供方,然后服务提供方会返回一个字符串给调用方。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
gRPC是一款高性能、跨语言的RPC框架,采用HTTP/2协议和Protocol Buffer序列化方式,充分利用HTTP/2的多路复用特性,解决了HTTP/1.X的性能问题。本文通过剖析gRPC源码,以HelloWorld示例为例,介绍了如何使用Protocol Buffer定义接口、生成消息对象和gRPC通信所需的基础代码。在调用端代码中,通过生成的Stub对象发起RPC调用,实现了RPC通信的透明化。文章深入讲解了gRPC的请求发送原理,包括对象序列化、HTTP/2协议的特点以及构造HTTP/2 Frame等细节。此外,还介绍了服务提供方收到请求后的处理流程,以及开启Netty Server并绑定编解码逻辑的步骤。通过本文,读者可以快速了解gRPC的工作原理和实现一个完整的RPC框架的方法。文章还提到了gRPC的负载均衡、服务发现等功能,以及通过Stream方式来调用服务以提升调用性能。整体而言,本文通过深入剖析gRPC源码和示例代码,使读者能够全面了解gRPC的技术特点和工作原理。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《RPC 实战与核心原理》,新⼈⾸单¥59
《RPC 实战与核心原理》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(20)
- 最新
- 精选
- 雨霖铃声声慢InputStream封装了底层传输的字节缓冲区实现,它通常是一组通过指针连接起来的内存块的集合,这些内存块由网络的零拷贝获取的。由于不能保证能够从内存块中获取一个byte[],我们不能传递一个简单的byte[]或byte[][],并且可能需要一个目标byte[]来从缓冲区中获取数据。 另外byte[]的缺点是需要从缓冲区中复制一个大的、连续的数据,而实际上没有什么方法可以使它执行得更好。当使用压缩时,我们也不知道消息未压缩的长度,它是动态解压缩的。
作者回复: 没错,避免二次拷贝
2020-03-03468 - 超威丶难道http2的核心实现不就是基于流实现?
作者回复: stream传输是建立在多路复用的基础上
2020-03-029 - 忆水寒老师,有个疑问。按道理客户端发起一次rpc调用,通过序列化、网络传输、服务端处理再响应,这期间有时间差的。上面客户端代码除非是阻塞的,否则不可能立马得到结果吧。
作者回复: 是的,例子里面的需要在客户端等待
2020-03-027 - 飞翔老师 有说法是内部调用用rpc 外部用http 这是为什么呀
作者回复: 内部应用之间通信更强调性能
2020-03-0453 - cricket1981以流的方式处理请求数据,适合请求数据数据量大情况。好比Sax和Dom区别。
作者回复: 在传输层也需要用stream,避免二次拷贝
2020-03-022 - 钱我们讲到,在 gRPC 调用的时候,我们有一个关键步骤就是把对象转成可传输的二进制,但是在 gRPC 里面,我们并没有直接转成二进制数组,而是返回一个 InputStream,你知道这样做的好处是什么吗? 这个不知道哎😂 猜测是为性能故,看评论区的讨论,猜测是正确的,不过细节还是不太清楚,需要后补一下。 Inputstream——避免二次拷贝(序列化+encode)——更高的性能。
作者回复: 👍
2020-05-131 - 密码123456为什么能避免二次拷贝?
作者回复: 序列化和encode
2020-04-271 - eason2017老师好,可以把 为客户端和服务器端生成消息对象和 RPC 基础代码 的命令提供出来吗?谢谢。
作者回复: 可以看下grpc官网或者搜索一下
2020-03-2921 - 蚂蚁内推+v这样跟HTTP2有什么区别呢
作者回复: grpc是用http2来传输的
2020-03-06 - tulip老师可以出一期go 的嘛2020-03-29228
收起评论