RPC 实战与核心原理
何小锋
京东云混合云首席架构师
40244 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
RPC 实战与核心原理
15
15
1.0x
00:00/00:00
登录|注册

06 | RPC实战:剖析gRPC源码,动手实现一个完整的RPC

HTTP/2 Frame构造
writePayload
Header和Body数据分离
FrameListener处理数据
开启Netty Server
发送RPC请求
构建Stub
构建Channel连接
Protocol Buffer代码
利用HTTP/2的多路复用特性提升性能
gRPC是一种采用HTTP/2协议,默认采用PB序列化方式的RPC
接收原理
发送原理
生成消息对象和基础代码
定义接口
序列化支持PB和JSON
基于HTTP/2设计的通信协议
跨语言
高性能
总结
gRPC通信示例
gRPC特点
课后思考
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
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • 雨霖铃声声慢
    InputStream封装了底层传输的字节缓冲区实现,它通常是一组通过指针连接起来的内存块的集合,这些内存块由网络的零拷贝获取的。由于不能保证能够从内存块中获取一个byte[],我们不能传递一个简单的byte[]或byte[][],并且可能需要一个目标byte[]来从缓冲区中获取数据。 另外byte[]的缺点是需要从缓冲区中复制一个大的、连续的数据,而实际上没有什么方法可以使它执行得更好。当使用压缩时,我们也不知道消息未压缩的长度,它是动态解压缩的。

    作者回复: 没错,避免二次拷贝

    2020-03-03
    4
    68
  • 超威丶
    难道http2的核心实现不就是基于流实现?

    作者回复: stream传输是建立在多路复用的基础上

    2020-03-02
    9
  • 忆水寒
    老师,有个疑问。按道理客户端发起一次rpc调用,通过序列化、网络传输、服务端处理再响应,这期间有时间差的。上面客户端代码除非是阻塞的,否则不可能立马得到结果吧。

    作者回复: 是的,例子里面的需要在客户端等待

    2020-03-02
    7
  • 飞翔
    老师 有说法是内部调用用rpc 外部用http 这是为什么呀

    作者回复: 内部应用之间通信更强调性能

    2020-03-04
    5
    3
  • cricket1981
    以流的方式处理请求数据,适合请求数据数据量大情况。好比Sax和Dom区别。

    作者回复: 在传输层也需要用stream,避免二次拷贝

    2020-03-02
    2
  • 我们讲到,在 gRPC 调用的时候,我们有一个关键步骤就是把对象转成可传输的二进制,但是在 gRPC 里面,我们并没有直接转成二进制数组,而是返回一个 InputStream,你知道这样做的好处是什么吗? 这个不知道哎😂 猜测是为性能故,看评论区的讨论,猜测是正确的,不过细节还是不太清楚,需要后补一下。 Inputstream——避免二次拷贝(序列化+encode)——更高的性能。

    作者回复: 👍

    2020-05-13
    1
  • 密码123456
    为什么能避免二次拷贝?

    作者回复: 序列化和encode

    2020-04-27
    1
  • eason2017
    老师好,可以把 为客户端和服务器端生成消息对象和 RPC 基础代码 的命令提供出来吗?谢谢。

    作者回复: 可以看下grpc官网或者搜索一下

    2020-03-29
    2
    1
  • 蚂蚁内推+v
    这样跟HTTP2有什么区别呢

    作者回复: grpc是用http2来传输的

    2020-03-06
  • tulip
    老师可以出一期go 的嘛
    2020-03-29
    2
    28
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部