grpc"/>
http1.0、http1.1、http2.0、protobuf、grpc
一、http1.0、http1.1、http2.0的区别
- 传输方面
http1.0 : 每次请求都需要建立一个新的tcp连接, 所以每次请求都需要经历tcp的三次握手四次挥手。 如果是同一个客户端发起的请求,完全不需要每次建立连接。
http1.1: 保持首次建立的那个tcp连接, 知道被通知关闭才关闭连接。这样就解决了http1.0中多次建立连接的问题。 但是http1.1的消息需要一个一个请求、响应, 如果第一个请求在服务端被阻塞了, 那么第二个请求也不会被处理, 直到第一个请求被处理完了第二个请求才会被处理(队头阻塞)。 这个也可以通过新建一个tcp连接的方式解决,但是tcp连接数有限且建立需要开销。
http2.0 :如下, http1一个请求消息和响应消息是以message为单位的, message 又是无序的, 所以需要等待上一个请求返回了下一个请求才能进行。而http2中封装了一层stream,stream有一个id作为序列号, 这样在响应的时候就可以通过对应的streamid定位到请求方。正是因为有了这个序列号,http2.0可以并发的进行发送请求,处理请求的时候也不需要考虑顺序, 只要把对应的streamid传回去就可以了。
- 编码方面
http2.0对请求头进行了压缩和编码, 具体编码方法是使用用数字作为key,常见的请求头作为vulue,在哈希表哈希表中存储请求头, 比如静态表里面存储的是61种常见的请求头,动态表里面是存储所有后面发过来的不包含在动态表里面的请求头(包括用户自定义的token等)。压缩方式是使用静态 Huffman 编码。
二、Protobuf 如何提高编码效率? (参考17 | Protobuf是如何进一步提高编码效率的?-极客时间)
我们常用的json使用键值对的方式定义数据,非常便于查看。 但是仔细想下我们的服务在调用的时候, 其实json里面的key是不需要写得很具体的, 参考 http2.0里面对请求头的编码, Protobuf 在定义数据的时候, proto文件中将key映射为一个数字, 接收方再通过这个数字去解析这个到底是哪个key, 这样传输的时候这部分数据就不需要传输了。还有就是使用默认值的情况下不传输,对传输的数字、字符串等做压缩。
三、GRPC
18 | 如何通过gRPC实现高效远程过程调用?-极客时间
Rpc的全称是远程过程调用,需要做到以本地函数调用形式向应用开发者提供网络访问的能力,这里跟http的通信一样, 也需要实现连接的建立和数据的传输,方法有很多种,其中 grpc 是性能比较好的一种开源框架。
Grpc默认基于http2.0实现对数据的传输, 默认基于Protobuf 实现对数据的编码。
Grpc请求体报文解析:传输协议使用http2.0, 自然会对一些头部信息做压缩。
【包头】部信息有
Path:例如 “/demo.GRPCDemo/SimpleMethod”。 通过“/ 包名. 服务名 / 方法名”的形式确定了 RPC 方法
content-type : 例如“application/grpc”, 确定消息编码格式为 Protobuf。
他的路由不是根http一样放在url里面做的, 而是通过头部的path去路由的。
【包体】部分也不是直接传输protobuf数据, 而是在首部加了5个字节, 一个表示包体长度, 一个表示是否压缩过。
Grpc的响应体 :
相应的包体部分头部同样包含前5个字节的是否压缩、包体长度信息。
响应头被拆成了两部分, 将响应体包裹在中间, 这样就允许服务器在发送完消息后再给出错误码。
gRPC 中的 HTTP 头部与普通的 HTTP 请求完全一致,因此,它兼容当下互联网中各种七层负载均衡,这使得 gRPC 可以轻松地跨越公网使用。
更多推荐
http1.0、http1.1、http2.0、protobuf、grpc
发布评论