HTTP
HTTP/1.1
http 1.1 是目前所有微服务架构下使用场景最广泛的协议之一了。
轻量,无状态,容易调试,Server 和 Client 玩的能比花还花了。
没什么好讲的,但是要明白,这个协议的下一层是 TCP,TCP 是一个流协议,也就是说 HTTP 要解决流式传输下怎么去正确截断。HTTP 并不是一个可靠的协议,但是你要明白 TCP 是怎么解决可靠性问题的,比如 ACK,重传,重复。
RESTful
一套理想的、完全满足 REST 风格的系统应该满足以下六大原则
- 服务端与 客户端分离(Client-Server)
- 无状态(Stateless)
- 可缓存(Cacheability)
- 分层系统(Layered System)
- 统一接口(Uniform Interface)
- 按需代码(Code-On-Demand)
H2C(HTTP/2 Cleartext)
HTTP/2 增加了很多特性,例如二进制帧,多路复用,头信息压缩。
HTTP/2 要比 1.1 性能更好,但是在服务间调用,用不上很高级别的加密,所以 H2C 可以享受这些特性,但同时又可以 减负。
不强制使用 TLS 加密, HTTP/2 可以运行在普通的 http:// 地址上(默认端口 80),而非 HTTPS 的 443 端口.
H2C 能带来更低的延迟和更少的 CPU 消耗。同时,它也免去了证书管理和更新的运维负担。
协商
由于直接使用 HTTP 明文,H2C 的协议协商方式也有所不同。它通常通过 HTTP/1.1 的 Upgrade 头部来从 HTTP/1.1 升级到 HTTP/2,或者依靠客户端和服务器的直接协商。
# 协商
curl -v --http2 --location "http://localhost:8000/web/demo/version"
# 不协商
curl -v --http2-prior-knowledge --location "http://localhost:8000/web/demo/version"
HTTP/3
HTTP/3 对于移动端的支持非常非常强力,尤其是 1-RTT,连接ID,但是对于 Server-Side, 这些特性都用不上甚至会拖慢速度。(HTTP/3 在超高 QPS 下性能并不比 HTTP/1.1 快)
HTTP/3 的核心新特性在于它进行了一次传输层的彻底革新:从依赖 TCP 全面转向了基于 UDP 的 QUIC 协议。
将传输和加密握手合并,首次连接只需 1-RTT,对之前连接过的服务器支持 0-RTT 快速恢复。
使用连接ID识别连接,网络切换时连接可以无缝迁移而不中断。
强制默认加密,TLS 1.3 内置于 QUIC 协议中。