初识 RPC 与 REST
RPC 和 REST 是两种主流的远程调用方式,也是分布式系统中常用的组件间通信手段。其实严格来说,RPC 是一种通信技术,而 REST 是一种软件架构风格,二者并不是同一类型的事物,只是有一些相似。不过,在远程服务调用这个场景,二者经常被拿来互相比较。
RPC
RPC 发展历程
RPC(Remote Procedure Call)的字面意思就是“远程服务调用”,它最初的目的就是让计算机可以像调用本地方法一样调用远程方法。在 RPC 发展的过程中,始终没有一款框架可以同时满足简单、普适、高性能这三点,因而这一小小的领域逐渐进入了百家争鸣的局面。如今,任何一款具有生命力的 RPC 框架都不再追求完美,而是以某个具有针对性的特点为主要的发展方向。
朝着面向对象发展,不满足于仅将面向过程的编码方式带入分布式场景
朝着性能发展,代表为 gRPC(Google) 和 Thrift(Facebook)
朝着简化发展,代表为 JSON-RPC,它简单轻便,但功能弱、速度慢
也正是每一种 RPC 框架都有不完美的地方,才导致不断有新的轮子出现。近几年,RPC 框架有向更高层次与插件化方向发展的趋势,不再追求大而全,而是设计扩展点,让用户自己选择相应的解决方案。框架自身则更聚焦于更高层次的能力,比如负载均衡、服务发现、可观测性等。这类框架以 Dubbo(阿里)和 Thrift 为代表。
所有 RPC 框架本质上都是在变着花样地解决以下三个问题,
如何表示数据,即如何让方法的参数和返回值在通信两端都能被正确的解析,而不受编程语言、OS、硬件等差异的影响,有效的做法就是统一转换为中立的数据流(序列化),然后两端各自解析回自己的数据类型(反序列化)。
如何传递数据,即选择何种传输协议。实际的服务交互不是只序列化一把就完事了,异常、认证授权、事务等都可能产生需要交换的信息。不过,如果要求足够简单,可以直接使用 HTTP 协议。
如何表示方法,即如何表达同一个方法,以及如何找到对应的方法。
Golang net/rpc 库
【待补充】
REST
REST 设计风格
REST 并不是一套规范或协议,而是一种设计风格,其中包含一些指导原则。Fielding 在一篇被认为是 REST 起源的论文中提出了六条指导原则。但事实上,完全符合 REST 所有指导原则的系统并不多见。Leonard Richardson 曾提出下面模型,来衡量一个系统 REST 的程度,其中第 2 级是目前大多数系统达到的 REST 级别。
第 0 级,完全不 REST。
第 1 级,开始引入资源的概念。
第 2 级,引入同一接口,映射到 HTTP 协议的方法上。
第 3 级,超媒体控制,用人话说就是:除了第一个请求外,其它后续可能的请求方式应该在返回信息中自描述。
REST 和 RPC 在核心思想上的差异就是面向资源与面向过程的区别。
RESTful API 实例
【待补充】