socket是什么
socket 是针对TCP或UDP的具体接口实现,提供了在传输层进行网络编程的方法。
rpc流程
为什么要使用自定义 tcp 协议的 rpc 做后端进程通信
要解决这个问题就应该搞清楚 http 使用的 tcp 协议,和我们自定义的 tcp 协议在报文上的区别。
- http 协议相较于自定义tcp报文协议,增加的开销不在于连接的建立与断开。http协议是支持连接池复用的,也就是建立一定数量的连接不断开,并不会频繁的创建和销毁连接。
- 要说的是http也可以使用protobuf这种二进制编码协议对内容进行编码,因此二者最大的区别还是在传输协议上。
通用定义的http1.1协议的tcp报文包含太多废信息,一个POST协议的格式大致如下
1 | HTTP/1.0 200 OK |
即使编码协议也就是body是使用二进制编码协议,报文元数据也就是header头的键值对却用了文本编码,非常占字节数。上面所使用的报文中有效字节数仅仅占约 30%,也就是70%的时间用于传输元数据废编码。当然实际情况下报文内容可能会比这个长,但是报头所占的比例也是非常可观的。
那么假如我们使用自定义tcp协议的报文如下
报头占用的字节数也就只有16个byte,极大地精简了传输内容。这也就是为什么后端进程间通常会采用自定义tcp协议的rpc来进行通信的原因。
基于HTTP的远程调用方案:
HTTP+Restful,其优势很大。它可读性好,且可以得到防火墙的支持、跨语言的支持。而且,在近几年的报告中,Restful大有超过RPC的趋势。
但是使用该方案也有其缺点,这是与其优点相对应的:
- 首先是有用信息占比少,毕竟HTTP工作在第七层,包含了大量的HTTP头等信息。
- 其次是效率低,还是因为第七层的缘故,必须按照HTTP协议进行层层封装。
- 还有,其可读性似乎没有必要,因为我们可以引入网关增加可读性。
- 此外,使用HTTP协议调用远程方法比较复杂,要封装各种参数名和参数值。
http与rpc的选择
- RPC是一个完整的远程调用方案,它包括了:接口规范+序列化反序列化规范+通信协议等。
- http是最常用的承载RPC的通信协议之一。
- http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议 进行传输。
- 但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先(基于TCP协议的情况下)就是长链接,不必每次通信都要像http 一样去3次握手什么的,减少了网络开销;
- 其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统 一化的操作。
- 第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑。
RPC 中要解决的问题
建立通信
:在客户端与服务端建立起数据传输通道,大都是TCP连接(gRPC使用了HTTP2)。寻址
:A服务器上的应用需要告诉RPC框架:B服务器地址、端口,调用函数名称。所以必须实现待调用方法到call ID的映射。序列化与反序列化
:由于网络协议都是二进制的,所以调用方法的参数在进行传递时首先要序列化成二进制,B服务器收到请求后要再对参数进行反序列化。恢复为内存中的表达方式,找到对应的方法进行本地调用,得到返回值。返回值从B到A的传输仍要经过序列化与反序列化的过程。
HTTP/2新特性简介
新的二进制格式:HTTP1.X都是基于文本解析,而因为文本表现形式的多样性,基于文本协议的格式解析天然存在健壮性问题。而采用二进制格式后实现方便且健壮。
多路复用:多个request共享一个连接。
header压缩:在HTTP1.x中header信息很多,且每次都会重复发送,造成很大浪费。HTTP2.0使用encoder减少了传输的header大小,且通信双方都缓存一份包含了header信息的表,此后的请求可以只发送差异数据,避免信息的重复传输,进一步减少需要传输的内容大小。
服务端推送:主要的思想是:当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端。这个功能帮助客户端将Z放进缓存以备将来之需。也遵守同源策略,且客户端可以拒绝推送过来的资源。