1. 前言
gRPC
  • 客户端流
  • 服务端流
  • 双向流
HTTP
2. HTTP连接
HTTPTCP
3. HTTP连接管理

3.1 串行连接(短连接)

如果对HTTP连接只进行简单的管理,当HTTP事务串行加载时,TCP的连接时延就会叠加起来,如下图:

3.2 并行连接

通过多条TCP连接发起并发的HTTP请求,克服单条连接的空载时间和带宽限制。但是并行连接会导致服务端打开大量连接从而消耗内存资源,引发性能问题

3.3 持久连接(长连接)

重用TCP连接,以消除连接及关闭时延。HTTP/1.1(包括HTTP/1.0的各种增强版本)允许事务处理结束后保持TCP连接处于打开状态

3.4 管道化连接

无论是串行连接还是持久连接,HTTP报文都遵循一发一收的流程,HTTP/1.1引入的管道化连接允许将多条请求放入队列,依次发送,服务端按照与请求相同的顺序回送HTTP响应(这种机制可能导致队首阻塞问题,即如果服务端的某一个请求处理耗时过久,会导致后面请求对应的响应阻塞,不能发送给客户端)

3.5 HTTP/2.0中的流(stream)

不同HTTP/1.0协议,HTTP/2.0在TCP层(或者TLS层,如果有)和HTTP层之间添加一层二进制分帧层(Binary Framing Layer),将HTTP报文分为更小的Headers帧(对应HTTP/1.0报文的起始行和首部)和DATA帧(对应HTTP/1.0报文主体部分),然后进行二进制编码发送给对端

stream(流message(消息)frame(帧)
streammessageHeaders FrameDATA FrameTypeStream IdentifierframeFlags

如下是一个HTTP/2.0帧格式和gRPC报文格式

HEADERS帧DATA帧
4. HTTP/2.0与gRPC的流模式

gRPC框架中的C/S通信就是使用的HTTP/2.0协议

HTTP/2.0的优点除了降低了通信时延,另一方面使C/S通信不再局限于HTTP/1.0的一发一收模式,同时有效地解决了HTTP/1.1的管道化连接带来的响应报文队首阻塞问题(注:这里的队首阻塞仅是指HTTP层)

客户端可以发送多个message请求,服务端在获取所有的message请求后返回message响应(对应gRPC中的客户端流模式);客户端发送单个message请求,服务端接收处理后,可以返回多个message响应(对应gRPC中的服务端流模式);客户端也可以每发送一个message请求,服务端接受处理后就返回一个message响应(对应gRPC中的双向流模式)