自定义头部 -->

远程调用对比

远程调用对比

目前远程调用主要包括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
img img img

基于golang天然的并发优势,在java环境下通过上面的介绍可以看到,grpc 的高性能很大程度上依赖了http2 的能力.

Http

http协议是应用层协议.HTTP协议是超文本传送协议(HyperText Transfer Protocol)的缩写,万维网(World Wide Web)的基础.

http信息交换过程: 建立连接、发送请求信息、发送响应信息、关闭连接.

规定了网络传输的请求格式、响应格式、资源定位和操作的方式等.但是底层采用什么网络传输协议,并没有规定,不过现在都是采用TCP协议作为底层传输协议

http2 特性

  1. 二进制协议
    众所周知,二进制协议比文本形式的协议,发送的数据量肯定是更小,传输效率更高的.所以
    http2比http/1.x更效,因为二进制是不可读的,所以会损失部分可读性.

  2. 多路复用的流
    http/1.x一个stream是需要一个 tcp连接的,其实从性能上来说是比较浪费的.http2 可以复
    用tcp连接,实现一个tcp连接可以处理多个stream,同时可以为每一个 stream设置优先
    级,可以用来告诉对端哪个流更重要.当资源有限的时候,服务器会根据优先级来选择应该先发
    送哪些流

  3. 头部压缩
    由于http协议是一个无状态的协议, 导致了很多相同或者类似的http请求重复发送时,带的头
    部信息很多时候是完全一样的. http2 对头部进行压缩,可以减少数据包大小,提高协议性能

  4. 请求reset
    在http/1.x中,当一个含有确切值的Content-Length的http消息发出之后,需要断开tcp连
    接才能中断.这样会导致需要通过三次握手来重新建立一个新的 tcp连接,代价是比较大的.在
    http2里面,我们可以通过发送RST STREAM帧来终止当前消息发送,从而避免了浪费带宽和
    中断已有的连接.

  5. 服务器推送
    如果个client请求资源A,而server知道client可能也会需要资源B,所以在client发起请
    求前,server 提前将B推送给A缓存起来,从而可以缩短资源A这个请求的响应时间.

  6. 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可以理解为是地方方言.

欢迎关注, 转发, 评论, 收藏, 点赞~

posted @ 2020-03-21 22:31  AllenAlan  阅读(453)  评论(0编辑  收藏  举报