- 目录
- 1. 前言
- 2. REST与RPC的概念
- 2.1什么是REST
- 2.2什么是RPC
- 2.3常见RPC框架结构图
- 2.3.1架构图解释
- 2.3.2调用过程主要步骤
- 2.3.3 RPC调用过程图
- 2.4 RPC与REST的区别
- 2.5 RPC与REST的应用场景
- 3. 总结与建议
1.前言
今天接触了公司的支付接口项目代码,刚刚接触好像有点压力,因为支付接口用的是云商通的支付接口,公司技术人员将按RPC规范封装成API接口,随着代码的观摩和尝试写一个接口调用,我明白我需要了解RPC的规范,以及RPC与RESTful的区别.
2.REST与RPC的概念
2.1什么是REST
REST是一种架构风格,指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。REST规范把所有内容都视为资源,网络上一切皆资源。
REST并没有创造新的技术,组件或服务,只是使用Web的现有特征和能力。 可以完全通过HTTP协议实现,使用 HTTP 协议处理数据通信。REST架构对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
2.2什么是RPC
远程方法调用,就是像调用本地方法一样调用远程方法。
2.3常见RPC框架结构图
2.3.1架构图解释
假设存在两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
比如说,A服务器想调用B服务器上的一个方法:
Employee getEmployeeByName(String fullName)
2.3.2调用过程主要步骤
2.3.2.1建立通信
首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接。
而如何选择网络通信?查阅了各种论坛博客,给出以下答案:
- 多数RPC框架选择TCP作为传输协议,也有部分选择HTTP。如gRPC使用HTTP2。不同的协议各有利弊。TCP更加高效,而HTTP在实际应用中更加的灵活。
- 因此主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
2.3.2.2服务寻址
要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么。通常情况下我们需要提供B机器(主机名或IP地址)以及特定的端口,然后指定调用的方法或者函数的名称以及入参出参等信息,这样才能完成服务的一个调用。
2.3.2.3网络传输
A->B序列化
当A机器上的应用发起一个RPC调用时,调用方法和其入参等信息需要通过底层的网络协议如TCP传输到B机器,由于网络协议是基于二进制的,所有我们传输的参数数据都需要先进行序列化(Serialize)或者编组(marshal)成二进制的形式才能在网络中进行传输。然后通过寻址操作和网络传输将序列化或者编组之后的二进制数据发送给B机器。
B->A反序列化
当B机器接收到A机器的应用发来的请求之后,又需要对接收到的参数等信息进行反序列化操作(序列化的逆操作),即将二进制信息恢复为内存中的表达方式,然后再找到对应的方法(寻址的一部分)进行本地调用(一般是通过生成代理Proxy去调用,通常会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),之后得到调用的返回值。
2.3.2.4服务调用
B机器进行本地调用(通过代理Proxy)之后得到了返回值,此时还需要再把返回值发送回A机器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值之后,则再次进行反序列化操作,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理(一般是业务逻辑处理操作)。
2.3.3 RPC调用过程图
至少包含四个组件:
- 客户端Client:服务调用方
- 客户端存根Client Stub:存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端
- 服务端存根Server Stub:接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理
- 服务端Server:服务的真正提供者
2.4 RPC与REST的区别
都是网络交互的协议规范。通常用于多个微服务之间的通信协议。
比较项/规范 | REST | RPC |
通信协议 | HTTP | 一般为TCP |
性能 | 低 | 高 |
灵活度 | 高 | 低 |
注意:高低是相对而不是绝对,根据实际情况而定.
2.5 RPC与REST的应用场景
REST和RPC都常用于微服务架构中。HTTP相对更规范,更标准,更通用,无论哪种语言都支持http协议。如果你是对外开放API,例如开放平台,外部的编程语言多种多样,你无法拒绝对每种语言的支持,现在开源中间件,基本最先支持的几个协议都包含RESTful。RPC 框架作为架构微服务化的基础组件,它能大大降低架构微服务化的成本,提高调用方与服务提供方的研发效率,屏蔽跨进程调用函数(服务)的各类复杂细节。让调用方感觉就像调用本地函数一样调用远端函数、让服务提供方感觉就像实现一个本地函数一样来实现服务。
3.总结与建议
REST调用及测试都很方便,RPC就显得有点繁琐,但是RPC的效率是毋庸置疑的,所以建议在多系统之间的内部调用采用RPC。对外提供的服务,Rest更加合适。