13046685510

微服务调用为什么用RPC框架,而不使用http?

RPC:Remote Procedure Call,中文意思就是远程过程调用。


那么我们先看看题目中的问题,其实,这个问题本身就是有问题的!


01. 既然有 HTTP ,为什么还要用 RPC ?


HTTP 和 RPC 并不是两个并行的概念,虽然很多书或文章,都介绍 HTTP 和 RPC 是在“应用层”,但实际上可以把应用层细分成多层,RPC 的所处的位置是高于 HTTP 的;HTTP 是网络协议,而RPC 可以看做是一种编程模式或实现方案;


RPC 通常包含传输协议和序列化协议,单说传输协议,RPC 可以建立在 TCP 协议之上(比如 Dubbo),也可以建立在 HTTP 协议之上(比如 gRPC);如果是基于数据形式分类,RPC 又可以分成基于二进制、XML 和 JSON 三种;


而现在非常流行的开源 RPC 框架,比如上文中提到的Dubbo 和 gRPC 分别出身于阿里和谷歌,它们更多地是封装了服务注册发现、负载均衡、链路跟踪等功能,也可以这么理解,RPC 框架是对服务更高级的封装。


02. RPC VS Restful 风格的 API


如果非要比较的话,可以比较 RPC 和 Restful 风格的 API。


RPC:面向过程,也就是要做一件什么事情,只发送 GET 和 POST 请求;GET 用来查询信息,其他情况下一律用 POST;请求参数是动词。


RESTful:面向资源,这里的资源可以是一段文字、一个文件、一张图片,总之是一个具体的存在,可以使用 GET、POST、DELETE、PUT 请求,对应了增删查改的操作;请求参数是名词。


比如按照id 查找用户:

如果是 RPC 风格的 url 应该是这样的:GET /queryUser?userid=xxx;

而 RESTful 风格通常是这样的:GET /user/{userid}


03. 究竟选择哪一个?


RPC 特别适用于是分布式环境;它让客户端进行远程调用时,可以像调用本地方法一样方便;RPC 框架屏蔽了很多底层的细节,开发人员不需要关注这些细节,比如序列化和反序列化、网络传输协议;一些功能强大的 RPC 框架还提供了连接池管理、负载均衡、故障转移、超时管理、上下文管理器、异步回调、收发包队列、工作线程等功能。


RPC 和 Restful 风格的 API,如果非要争出来个第一第二,那么也要结合具体的使用场景,选择更适合的那个。


如果是偏向内部的 API,提供的 API 很难进行资源的抽象,没有规范的 API 的设计,性能要求更高,这些情况下更适合使用 RPC ;如果偏向外部 API,需要有更为规范的 API 设计,并且 API 天生是以资源为维度展开的,这时候可以选择 Restful 风格的 API。

7x24小时服务专线 130-4668-5510
官方微信 关闭