面向服务的体系结构SOA-RPC

283 阅读3分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

RPC

RPC (Remote Process Call)远程过程调用。

为什么提出RPC技术?

单台服务器的处理能力受硬件成本限制,不可无限提升。由此,通过将原本的本地调用转变为调用远程服务器上的方法,使得系统的处理能力和吞吐量的提升带来可能,这一整个过程,就是一个RPC的过程。

一次RPC的过程

客户端调用服务端,服务端执行调用方请求的方法,并将结果返回给客户端,这样一次RPC调用完成。客户端,就是服务的调用方。服务端就是服务的提供方。这其中,还涉及调用参数和响应结果的序列化和反序列化操作。

但是,当我们的业务达到一定程度时,

  • 服务调用者规模变大,那服务提供方的压力也将日益增加,可以通过服务扩容方式解决此问题
  • 服务提供方增加,不同业务不同服务,那么就必须考虑服务路由和负载均衡的问题,以保证调用者可以快速找到服务提供方,可以考虑网关,代理,服务发现等相关技术手段解决此问题

对象序列化

服务调用过程必定涉及到数据的传输问题,而RPC过程中将数据转为二进制流进行网络传输,这也是RPC能提升系统处理能力和吞吐量的原因之一。当然,使用XML和JSON数据格式也是支持的。对于大型系统,二进制流相对于是更有优势的。

  • 将对象转为二进制流的过程称为对象的序列化
  • 将二进制了恢复为对象的过程称为对象的反序列化

数据序列化,推荐使用Protobuf。Protobuf全称是Google Protocol Buffer,是一种高效轻便的结构化数据存储方式,可用于(数据)通信协议、数据存储等。也可以理解为结构化数据的序列化方法。为什么推荐使用呢?

  • 高效,比XML更小,更简单,更快
  • 和语言无关,和平台无关
  • 兼容性好,扩展性好,比如更新数据结构时不会影响原有的程序

Node 中也提供了Buffer 模块,可以很好的处理二进制数据流

现目前主流的 RPC 框架分为基于 HTTP 和基于 TCP 的两种。

  • 基于TCP协议实现RPC,能够更加灵活地对协议字段进行定制,减少网络开销,提高性能,实现更大的吞吐量和并发数。但是实现代价高
  • 基于HTTP协议实现RPC,可以使用JSON和XML格式的请求或响应数据,便于二次开发
  • 同等网络环境下,基于HTTP协议传输相同内容,效率比TCP协议效率低,传输时间也更长