一、RPC是什么
RPC(Remote Procedure Call)中文意思为远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务 A、B部署在两台不同的机器上,那么服务A如果想要调用服务B中的某个方法该怎么办呢?使用HTTP请求,当然可以,但是可能会比较慢而且一些优化做的并不好。 而RPC的出现就是为了解决这个问题。
二、RPC原理
RPC调用原理如下图所示:
对以上图解释如下:
1、服务消费方(client)像调用本地服务一样调用远程服务;
2、client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
3、client stub找到服务地址,并将消息发送到服务端;
4、server stub收到消息后进行解码;
5、server stub根据解码结果调用本地的服务;
6、服务器端执行本地服务并将结果返回给server stub;
7、server stub将返回结果打包成消息并发送至消费方;
8、client stub接收到消息,并进行解码;
9、服务消费方得到最终结果;
10、至此完成调用远程服务的整个过程。
在看下RPC调用时序图:
从上面对RPC原理的解析中,概括来讲RPC主要解决了:让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。
三、常见的RPC框架
- RMI(JDK自带): JDK自带的RPC,有很多局限性,不推荐使用。
- Dubbo: Dubbo是阿里巴巴公司开源的一个高性能的优秀服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。目前Dubbo已经成为Spring Cloud Alibaba中的官方组件。
- gRPC :gRPC是可以在任何环境中运行的现代开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心和跨数据中心的服务,以实现负载平衡、跟踪、运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备、移动应用程序和浏览器连接到后端服务。
- Hessian: Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
- Thrift: Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。
四、HTTP与RPC的区别
RPC只是一种概念、一种设计,目的是为了解决不同服务之间的调用问题,它一般会包含有传输协议和序列化协议。
而HTTP是一种超文本传输协议,RPC框架可以使用HTTP协议作为传输协议或者直接使用TCP作为传输协议,使用不同的协议一般也是为了适应不同的场景。
HTTP和TCP协议的区别:
在网络层次结构中,HTTP 属于应用层协议。应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。而HTTP会基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP协议工作于客户端——服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端,即WEB服务器发送请求,Web服务器根据接收到的请求进行处理后,向客户端发送响应信息。HTTP协议建立在TCP协议之上。
而TCP是传输层协议,主要解决数据如何在网络中传输。传输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。相比于UDP,TCP提供的是面向连接的,可靠的数据传输服务。