HTTP协议基础
HTTP协议是超文本传输协议,超文本不仅仅包括文本,还包括了图片、视频、文本等等格式。HTTP协议是对这些数据传输的传输规范。 HTTP协议的要求:
- 需要明确的边界,包括开始和结束
- 需要标明消息类型
- 第一行是请求行/状态行,是对当前HTTP版本的表示。请求行包括方法名,URL,协议版本。状态行包括协议版本,状态码和状态码情况
- 接下来是协议的源数据
- 最后一行是有效的数据 HTTP请求流程
package main
import (
"context"
"code. byted . org/middleware/hertz/ pkg/app"
"code . byted.org/middleware/ 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( "OK""))
})
h.Spin( )
}
请求流程包括业务层,服务治理层中间件层,路由层,协议编码层,传输层 HTTP不足与展望
- HTTP1
- 队头阻塞
- 传输效率低
- 明文传输不安全
- HTTP2
- 多路复用
- 头部压缩
- 二进制协议
- QUIC
- 基于UDP实现
- 解决队头阻塞加密减少握手次数
- 支持快速启动
2.HTTP框架设计与实现
- 分层设计 高内聚 低耦合 易复用 高拓展性
- 应用层设计 提供合理的API可理解性、简单性、冗余性、兼容性、可测性、可见性
- 中间件层 ·配合Handler实现一个完整的请求处理生命周期·拥有预处理逻辑与后处理逻辑 ·可以注册多中间件 ·对上层模块用户逻辑模块易用
- 路由设计 框架路由实际上就是为URL匹配对应的处理函数
- 协议层 抽象出合适的接口
type Server interface i
Serve( c context.Context,conn network.Conn ) error3 }
- 网络层设计 BIO/NIO BIO:没有数据会导致数据堵住 NIO:具有一个监听器,当听到有足够的数据,则进行下一步连接。
性能优化
- 针对网络库的优化:绑定一块缓冲区,存下全部的Header,拷贝出完整的Body
- 对协议的优化:针对Headers的快速解析;Header key的规范化
- 热点资源池化