rpc 即 remote procedure call,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。
在一个典型 rpc 的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件,其中 “rpc 协议” 就指明了程序如何进行网络传输和序列化。
一个 rpc 的核心功能主要有由客户端、客户端 stub、网络传输模块、服务端 stub、服务端 5 个部分组成。
在 rpc 中,所有的函数都必须有自己的一个 id 并且在客户端和服务端分别维护一张函数和 call id 的映射表,这样在客户端和服务端的进程中 call id 才是一致的的。
客户端在做远程过程调用时,必须附上这个 id。当客户端需要进行远程调用时,它就查一下这个表,找出相应的 call id,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
网络协议只能传输二进制数据,所以我们需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。
在 rpc 中可选的网络传输方式有多种,可以选择 tcp 协议、udp 协议、http 协议。每一种协议对整体的性能和效率都有不同的影响,如何选择一个正确的网络传输协议呢?首先要搞明白各种传输协议在 rpc 中的工作方式。
1.基于 tcp 协议的 rpc 调用
由服务的调用方与服务的提供方建立 socket 连接,并由服务的调用方通过 socket 将需要调用的接口名称、方法名称和参数序列化后传递给服务的提供方,服务的提供方反序列化后再利用反射调用相关的方法 *** 将结果返回给服务的调用方,整个基于 tcp 协议的 rpc 调用大致如此。但是在实例应用中则会进行一系列的封装,如 rmi 便是在 tcp 协议上传递可序列化的 java 对象。
2.基于 http 协议的 rpc 调用
该方法更像是访问网页一样,只是它的返回结果更加单一简单。
其大致流程为:由服务的调用者向服务的提供者发送请求
(get、post、put、delete 等中的一种),服务的提供者根据 url 进行方法调用,而方法所需要的参数可能是对服务调用方传输过去的 xml 数据或者 json 数据解析后的结果,最终返回 josn 或者 xml 的数据结果。
应用级的服务框架
:阿里的 dubbo/dubbox、google grpc、spring boot/spring cloud、facebook thrift、twitter finagle 。远程通信协议
:rmi、socket、soap(http xml)、rest(http json)。通信框架
:mina 和 netty。