无论是采用 7 层网络模型中的哪一层 , 在网络请求过程中 , 数据都是以消息的形式进行传递 。而消息的组成是有一定结构的 , 消息头和消息体构成了所传输消息的主体 , 其中消息体表示需要传输的业务数据 , 而消息头用于进行传输控制 。
文章插图
可以看到 , 每个层次都从上层取得数据 , 加上消息头信息形成新的消息体 , 并将新的消息传递给下一层次 。通过对消息头和消息体进行扩展 , 我们就可以实现私有化的传输协议 。
这也是大部分 RPC 框架内部所采用的实现方式 , 这样做的主要目的是对公有协议进行精简 , 从而提升性能 。另外 , 出于扩展性的考虑 , 具备高度定制化的私有协议也比公共协议更加容易实现扩展 。这方面的典型示例还是 Dubbo 框架 , 它提供了完全自定义的 Dubbo 协议 。
远程调用明确了网络通信的基本方式、序列化手段以及所采用的传输协议之后 , 我们就可以发起真正的远程调用了 。RPC 本质也是一种服务调用 , 而服务调用存在两种基本方式 , 即单向(One Way)模式和请求应答(Request-Response)模式 , 前者体现为异步操作 , 后者一般执行同步操作 。
首先我们要知道 , 同步调用会造成业务线程阻塞 , 但开发和管理会相对简单 。这是为什么呢?我们先来看一下同步调用的时序图:
文章插图
从中可以看到 , 服务线程发送请求到 IO 线程之后 , 就一直处于等待阶段 , 直到 IO 线程完成与网络的读写操作之后 , 才会被主动唤醒 。
而使用异步调用的目的就在于获取高性能 。在实现异步调用过程中 , 我们通常都会使用到 Java 中所提供的 Future 机制 。Future 调用可以进一步细分成两种模式 , Future-Get 模式和 Future-Listener 模式 。Future-Get 模式参考下图:
文章插图
可以看到在这种模式下 , 服务线程通过主动 get 结果的方式获取 Future 结果 , 而这个 get 过程是串行的 , 会造成执行 get 方法的线程形成阻塞 。
Future-Listener 模式则不同 , 在 Future-Listener 模式中需要创建 Listener , 当 Future 结果生成时会唤醒注册到该 Future 上的 Listener 对象 , 从而形成异步回调机制 。
除了同步和异步调用之外 , 还存在并行(Parallel)调用和泛化(Generic)调用等调用方法 , 虽然也有其特定的应用场景 , 但对于 RPC 架构而言并不是主流的调用方式 , 这里就不具体展开了 。
总结可以说 , RPC 是分布式系统中一项基础设施类的技术体系 , 但凡涉及服务与服务之间的交互就需要使用到 RPC 架构 。当你在使用一个分布式框架时 , 可以尝试用今天介绍的 RPC 架构的基本结构和技术体系进行分析 , 从而加深对这项技术体系的理解 。
作者:码猿技术专栏
链接:https://juejin.cn/post/7199456238191116345
来源:稀土掘金
著作权归作者所有 。商业转载请联系作者获得授权 , 非商业转载请注明出处 。
【10分钟带你了解RPC 架构的基本结构】
推荐阅读
- 苹果为何要做AR/VR头戴设备?库克给出了解答
- 应届生|郑大学生自曝校招新陷阱,催你签offer未必是好事,应届生需了解
- 糯米配什么煮粥好吃
- |热血传奇:关于新兴职业弓箭手,你了解多少?
- 吕国泉|瞒天过海——《三十六计》带你玩转职场
- 文玩|关于文玩和田玉的10大陷阱,了解真相,却也无解!
- 童锦程|一分钟了解顶流网红“江南第一深情、撩妹界祖师爷”童锦程!
- 翡翠|了解翡翠的“种”,才算是翡翠基础入门
- |10张生活照了解许某馨,改名换姓模样大变,保送读博找了白人男友!
- 现挤的牛奶煮沸能喝吗