RPC和REST两种通信方式分布式架构中该怎么选
《RPC和REST两种通信方式分布式架构中该怎么选》共 0.3 万字,通篇围绕 架构、微服务、场景、量化 展开,归在「推理、部署与算力」这一层。
适合要把模型跑起来,还得跑得起的人
目录骨架(5 节)
- 一. 简介
- 二. 比较:
- 三. 适用场景
- 三. 总结
- 1. RPC(remote procedure call)
背景:
当下微服务架构都面临着服务间的远程调用,常见的远程调用方式有两种:
RPC:Remote Produce Call远程过程调用,类似的还有RMI。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型。
Rest:使用HTTP POST(或GET)进行数据交互http,请求数据和应答数据均为JSON格式(或XML)。http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用Http协议。也可以用来进行远程服务调用。缺点是消息封装臃肿。现在热门的Rest风格,就可以通过http协议来实现。
一. 简介
1. RPC(remote procedure call)

执行远程服务器上的一个function,,像调用本地服务(方法)一样调用服务器的服务(方法)。通常的实现有 XML-RPC , JSON-RPC , 通信方式基本相同, 所不同的只是传输数据的格式.
(1) 优点:
设计简洁,便于理解
轻量的payload
很高的性能表现
(2) 缺点:
前后端代码高耦合
代码可读性不好,相关代码不容易被定位
会导致有大量被定义的函数,难以管理
(3) 核心
RPC是分布式架构的核心,按响应方式分如下两种:
同步调用:客户端调用服务方方法,等待直到服务方返回结果或者超时,再继续自己的操作
异步调用:客户端把消息发送给中间件,不再等待服务端返回,直接继续自己的操作。
同步调用的实现方式有WebService和RMI。Web Service提供的服务是基于web容器的,底层使用http协议,因而适合不同语言异构系统间的调用。RMI实际上是Java语言的RPC实现,允许方法返回 Java 对象以及基本数据类型,适合用于JAVA语言构建的不同系统间的调用。
异步调用的JAVA实现版就是JMS(Java Message Service),目前开源的的JMS中间件有Apache社区的ActiveMQ、Kafka消息中间件,另外有阿里的RocketMQ。
2. REST(Representational state transfer), 表现层状态转移

在设计API时,使用路径定位资源,方法定义操作,通过Content-Type和Accept来协商资源的类型
REST是一种架构风格,指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。REST规范把所有内容都视为资源,网络上一切皆资源。
REST并没有创造新的技术,组件或服务,只是使用Web的现有特征和能力。 可以完全通过HTTP协议实现,使用 HTTP 协议处理数据通信。REST架构对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
REST即表述性状态传递(Representational State Transfer,简称REST),是一种软件架构风格。REST通过HTTP协议定义的通用动词方法(GET、PUT、DELETE、POST) ,以URI对网络资源进行唯一标识,响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。
(1) 优点:
前后端高度解耦
便于理解,即使没有看文档,也能大概知道接口是用来做什么的;
接口的功能有单一性,便于扩展和复用;
利用了HTTP原本的特性
(2) 缺点:
有时payload会变的特别大
同一个页面可能要调用很多个API,来获取不同的东西,在网络差的情况下会降低体验
(3) 特征:
资源:资源是以json(或其他Representation)为载体的、面向用户的一组数据集,资源对信息的表达倾向于概念模型中的数据
无状态:所谓无状态的,即所有的资源,都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变。
统一的接口:RESTful架构风格规定,数据的元操作,即CRUD(create, read, update和delete,即数据的增删查改)操作,分别对应于HTTP方法:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,这样就统一了数据操作的接口,仅通过HTTP方法,就可以完成对数据的所有增删查改工作。
URI:可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或识别符
(4) 设计原则:
网络上的所有事物都被抽象为资源
每个资源都有一个唯一的资源标识符
同一个资源具有多种表现形式(xml,json等)
