Http 协议
前后端之间通过 Http 框架进行解析
Http 协议
超文本传输协议(Hypertext Transfer Protocol)
很显然,我们除了txt之类的东西,还想传递mp3 mp4 之类的数据,这是超文本的含义;
我们为什么需要协议?
- 我们需要明确的边界(从开始到结束)
- 能够携带什么信息(什么消息,消息的类型)
那我们举一个🌰: 一个简单的 Post 请求干了什么事情?
比如说 A 向 B 发送请求,B接收到请求行的时候就开始回应了,下列是1个例子
A:
POST /sis Http/1.1
Who: Alex
Content-Type: text/plain
Host: 127.0.0.1:8888
Content-Length: 28
Let's go!
B:
Http/1.1 200 OK
Server: hertz
Date: Thu,21 Apr 024 11:31:32 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 2
Upstream-Caught: 1650541592984580
OK
我们可以发现需要哪些东西?
我们可以用 hertz 写一个 Demo 看看:
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
)
func main() {
h := server.New()
h.POST("/sis", func(c context.Context, ctx *app.RequestContext) {
ctx.Data(200, "text/plain; charset=utf-8", []byte("Let's go!"))
})
h.Spin()
}
可以看到 postman 给出了回应
那么中间干了什么操作呢?
先从业务层框架提供的 API 出发;然后到了服务治理层(依托于中间件层),包括大家常说的垄断 限流 ;然后进入协议的编(解)码,在上述的例子中就是变成能让协议变成让 B 看得懂的形式;再进去传输层;
“垄断”通常是指在特定场景下限制某些资源或操作被多个请求同时访问,确保资源的独占使用。这种概念在微服务和分布式系统中有时用于控制并发访问或保证特定服务的稳定性。假设在电商系统中,某个特定的商品只有一个库存,两个用户几乎同时尝试购买,系统会限制并发,保证只有一个用户最终购买到这个商品,这种限制类似于"垄断"某个商品的购买权限。
server 层也大致如此,多了一个 route 层,根据对应的 URI 选择对应的 handler;
现有协议的不足
- HTTP1 基于 TCP,会有队头阻塞的问题,后续分片必须等前面分片到来才能继续发;传输效率比较低;明文传输不安全
- H2 解决了一部分,包括头部压缩;二进制格式解决更高效;并发传输;服务器主动推送资源,还引入了
TOS这部分握手的开销也是没有优化的 - 于是就出现了
QUIC,它是通过 UDP 实现的,解决了队头阻塞问题,加密减少握手次数,支持快速启动