一、概述
接口调用通常包含两个部分,序列化和通信协议:
1️⃣常见的序列化协议包括 json、xml、hession、protobuf、thrift、text、bytes 等;
2️⃣通信协议比较流行的是 http、soap、websockect。
首先解释下两种接口调用:
1️⃣Rest:严格的说接口很规范,操作对象即为资源,对资源的四种操作(post、get、put、delete),并且参数都放在 URL 上。不严格的说 Http+json、Http+xml,常见的 http api 都可以称为 Rest 接口。
2️⃣RPC:常说的远程方法调用,就是像调用本地方法一样调用远程方法,通信协议大多采用二进制方式。RPC 通常基于 TCP 实现,常用框架例如 dubbo、netty、mina、thrift。
二、http vs 高性能二进制协议
http 相对更规范,更标准,更通用,无论哪种语言都支持 http。如果是对外开放 API,外部的编程语言多种多样,无法拒绝对每种语言的支持。相应的,如果采用 http,无疑在实现 SDK 之前,支持了所有语言,所以现在开源中间件,基本最先支持的几个协议都包含 RESTful。
RPC 协议性能要高的多,例如 Protobuf、Thrift、Kyro 等,(如果算上序列化)吞吐量大概能达到 http 的二倍。响应时间也更为出色。千万不要小看这点性能损耗,公认微服务做的比较好的,例如,netflix、阿里,曾经都传出过为了提升性能而合并服务。如果是交付型的项目,性能更为重要,因为你卖给客户往往靠的就是性能上微弱的优势。
无论是Google、Amazon、netflix(据说很可能转向grpc),还是阿里,实际上内部都是采用性能更高的RPC方式。而对外开放的才是RESTful。
Rest 调用及测试都很方便,RPC 就显得有点麻烦,但是 RPC 的效率是毋庸置疑的。所以建议在多系统之间采用 RPC,对外提供服务,Rest 是很适合的。
duboo 在生产者和消费者两个微服务之间的通信采用的就是 RPC,无疑在服务之间的调用 RPC 更变现的优秀。
三、RPC在微服务中的利用
1️⃣RPC 框架是架构微服务化的首要基础组件 ,它能大大降低架构微服务化的成本,提高调用方与服务提供方的研发效率,屏蔽跨进程调用函数(服务)的各类复杂细节。
2️⃣RPC 框架的职责是:让调用方感觉就像调用本地函数一样调用远端函数;让服务提供方感觉就像实现一个本地函数一样来实现服务。
四、RPC的好处
RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。 为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。
服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦。
如果没有统一的服务框架—RPC 框架,各个团队的服务提供方就需要各自实现一套序列化、反序列化、网络框架、连接池、收发线程、超时处理、状态机等“业务之外”的重复技术劳动,造成整体的低效。所以,统一 RPC 框架把上述“业务之外”的技术劳动统一处理,是服务化首要解决的问题
五、几种协议
- Socket 使用时可以指定协议 TCP、UDP 等;
- RIM 使用 Jrmp 协议,Jrmp 又是基于 TCP/IP;
- RPC 底层使用 Socket 接口,定义了一套远程调用方法;
- HTTP 是建立在 TCP 上,不是使用 Socket 接口,需要连接方主动发数据给服务器,服务器无法主动发数据给客户端。
- Web Service 提供的服务是基于 web 容器的,底层使用 http 协议,类似一个远程的服务提供者,比如天气预报服务,对各地客户端提供天气预报,是一种请求应答的机制,是跨系统跨平台的。就是通过一个 servlet,提供服务出去。
- hessian 是一套用于建立 web service 的简单的二进制协议,用于替代基于 XML 的 web service,是建立在 rpc 上的,hessian 有一套自己的序列化格式将数据序列化成流,然后通过 http 发送给服务器。