远程调用对比
远程调用对比
目前远程调用主要包括RPC和HTTP.两者都建立于OSI网络结构模型之上
OSI网络结构的七层模型
- 物理层: 利用传输介质为数据链路层提供物理连接,实现比特流的透明传输.(硬件: 网卡,网线,集线器,中继器,调制解调器)
- 数据链路层: 通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路,解决同一网络内节点之间的通信 (硬件网桥,交换机);
- 网络层: 通过路由选择算法,为报文或分组通过通信子网选择最适当的路径.数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进出路由等控制,将信息从一个网络设备传送到另一个网络设备,网络层主要解决不同子网间的通信(硬件:路由器)
- 传输层: 管理网络中端到端的信息传送; 通过错误纠正和流控制机制提供可靠且有序的数据包传送; 提供面向无连接的数 据包的传送(TCP,UDP)
- 会话层: 管理用户会话和对话; 控制用户间逻辑连接的建立和挂断; 报告上一层发生的错误
- 表示层: 掩盖不同系统间的数据格式的不同性; 指定独立结构的数据传输格式; 数据的编码和解码; 加密和解密; 压缩和 解压缩
- 应用层: 其实就是我们常说的接口
RPC
RPC其实是一种架构, 下面是RPC的官方说明:
一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI网络通信模型中,RPC跨越了传输层和应用层.RPC使得开发包括网络分布式多程序在内的应用程序更加轻易.
通俗一点就是: A计算机提供一个服务,B计算机可以像调用本地服务那样调用A计算机的服务.
Client, Server, Client Stub以及Server Stub作为RPC的四大核心组件, Stub这里理解为存根,存放消息地址.
-
客户端(Client): 服务的调用方.
-
服务端(Server): 真正的服务提供者.
-
Client Stub: 存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方.
-
Server Stub: 服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法
RPC信息协议由两个不同结构组成: 调用信息和答复信息.
RPC 的灵活性和自定制性很强,所以学习使用 RPC 可以从具体的协议和框架入手.JSON-RPC 就是是一套 RPC 协议, 使用 JSON 作为数据类型,RPC 也可以不走 HTTP 协议,而直接在 TCP 协议上去做定制,去获得更大的效率和灵活性.
目前流行的开源RPC框架:
- rpcx: 基于Go的服务治理的rpc框架、客户端支持跨语言
- grpc: Google 出品的跨语言rpc框架,很弱的(实验性的)负载均衡, 测试使用的是grpc-go
- go std rpc: Go标准库的rpc, 不支持跨语言(jsonrpc支持json rpc 1.0)
- thrift: 跨语言的rpc框架,facebook贡献
- dubbo: 国内较早开源的服务治理的Java rpc框架,虽然在阿里巴巴内部竞争中落败于HSF,沉寂了几年,但是在国内得到了广泛的应用,目前dubbo项目又获得了支持,并且dubbo 3.0也开始开发
- motan: 微博内部使用的rpc框架,底层支持java,生态圈往service mesh发展以支持多语言
- hprose: 国内开发人员开发的一个跨语言的rpc框架,非服务治理但是性能高效
- twirp: twitch.tv刚刚开源的一个restful风格的rpc框架
吞吐率 | 平均延迟 | P99 |
---|---|---|
基于golang天然的并发优势,在java环境下通过上面的介绍可以看到,grpc 的高性能很大程度上依赖了http2 的能力.
Http
http协议是应用层协议.HTTP协议是超文本传送协议(HyperText Transfer Protocol)的缩写,万维网(World Wide Web)的基础.
http信息交换过程: 建立连接、发送请求信息、发送响应信息、关闭连接.
规定了网络传输的请求格式、响应格式、资源定位和操作的方式等.但是底层采用什么网络传输协议,并没有规定,不过现在都是采用TCP协议作为底层传输协议
http2 特性
-
二进制协议
众所周知,二进制协议比文本形式的协议,发送的数据量肯定是更小,传输效率更高的.所以
http2比http/1.x更效,因为二进制是不可读的,所以会损失部分可读性. -
多路复用的流
http/1.x一个stream是需要一个 tcp连接的,其实从性能上来说是比较浪费的.http2 可以复
用tcp连接,实现一个tcp连接可以处理多个stream,同时可以为每一个 stream设置优先
级,可以用来告诉对端哪个流更重要.当资源有限的时候,服务器会根据优先级来选择应该先发
送哪些流 -
头部压缩
由于http协议是一个无状态的协议, 导致了很多相同或者类似的http请求重复发送时,带的头
部信息很多时候是完全一样的. http2 对头部进行压缩,可以减少数据包大小,提高协议性能 -
请求reset
在http/1.x中,当一个含有确切值的Content-Length的http消息发出之后,需要断开tcp连
接才能中断.这样会导致需要通过三次握手来重新建立一个新的 tcp连接,代价是比较大的.在
http2里面,我们可以通过发送RST STREAM帧来终止当前消息发送,从而避免了浪费带宽和
中断已有的连接. -
服务器推送
如果个client请求资源A,而server知道client可能也会需要资源B,所以在client发起请
求前,server 提前将B推送给A缓存起来,从而可以缩短资源A这个请求的响应时间. -
flow control
在http2中,每个http stream都有自己公示的流量窗口,对于每个stream来说,client 和
server都必须互相告诉对方自己能够处理的窗大小,stream 中的数据帧大小不得超过能处理
的窗值.
http与RPC的区别
- HTTP 请求往往围绕资源,而 RPC 的请求往往围绕一个动作.比如一个常见的 HTTP 请求是
GET index
,POST posts
,分别表示请求首页,或者发布一篇文章.而用 RPC 执行相同的任务,就是指定一个动作,说白了就是直接给出函数名,例如get_index()
或者create_post()
. - HTTP 请求的服务器上,通常是安装了 nginx 或者阿帕奇这样的 HTTP 服务器软件的,而提供 rpc 的服务器显然不一定需要安装这些软件.RPC 的思想是把本地函数映射到 API,也就是每一个公开给客户端的 API 对应的是一个服务器上函数.
总结
讲道理,其实我觉得http也是RPC的一种,HTTP 请求也一样是可以从本地发一个信号到服务器,服务器上执行某个函数,然后返回一些信息给客户端.两个不是同一层面的概念.
实际中人们常说的 RPC ,通常指自己手写的某种 RPC 的实现方式,区别于 HTTP 请求的一大特点是会直接呼叫远端的函数名.
说的再通俗点, http可以理解为一种普通话.各种RPC可以理解为是地方方言.
欢迎关注, 转发, 评论, 收藏, 点赞~