HTTP框架修炼
HTTP请求
前端:API接口层
后端:请求解析
1.HTTP协议
HTTP:超文本传输协议(超文本指除文本形式以外的格式同样进行传输) HTTP(Hypertext Transfer Protocol)是一种用于在计算机网络中传输超文本(Hypertext)数据的协议。它是互联网上数据通信的基础,用于在客户端(通常是Web浏览器)和服务器之间传递信息。
1.1 为什么需要HTTP协议
信息需要明确的边界(开始/结束)
携带消息的类型
- 数据传输:HTTP协议允许在客户端(如浏览器)和服务器之间传输数据,包括文本、图像、音频、视频等各种类型的内容。这使得互联网用户能够通过浏览器访问网页、观看视频、下载文件等。
- 超文本传输:HTTP支持超文本,这意味着网页可以包含链接和嵌套内容,使用户可以通过点击链接跳转到其他页面或资源,从而构建了丰富的网页结构。
- 客户端-服务器通信:HTTP建立了客户端-服务器模型,允许用户端(客户端)发出请求,服务器端对请求进行处理并返回响应。这种模型使用户能够请求需要的数据并在浏览器中展示。
- 标准化通信:HTTP定义了请求和响应的标准格式,确保了不同平台和应用之间的互操作性。这使得不同系统能够有效地进行通信和数据交换。
- Web浏览:HTTP是支持万维网(World Wide Web)的基础。通过HTTP,用户能够在浏览器中访问不同的网站,查看网页内容,点击链接跳转页面,从而实现了网页浏览。
- API通信:除了浏览器上的互动,HTTP也被用于应用程序之间的通信,尤其是在构建Web API(Application Programming Interface)时。开发者可以使用HTTP来创建应用程序之间的通信接口,实现数据的传递和操作。
- 资源定位:HTTP通过URL(Uniform Resource Locator)来定位网络上的资源,使用户能够通过指定URL来访问特定的网页、文件、图像等。
- 分布式应用:HTTP不仅限于传统的网页浏览,还用于构建分布式应用,包括微服务、移动应用、API通信等。HTTP的通用性使得它成为各种应用的通信基础。
1.2 HTTP协议中的内容
请求行 元数据 空行 包(接受的数据包括换行符)
1.请求行/状态行(方法名 URL 协议版本)
2.响应头/请求头
3.请求体/响应体
1.3请求流程
完成业务逻辑->完成服务治理逻辑->协议编(解)码->传输层
HTTP传输请求的基本流程:
- 建立TCP连接:在客户端(如浏览器)发起HTTP请求之前,首先需要建立与服务器的TCP连接。这是通过域名解析、三次握手等步骤完成的。一旦连接建立,客户端和服务器之间就可以进行数据传输。
- 发送HTTP请求:客户端向服务器发送HTTP请求。这个请求由请求行、请求头和请求主体组成。请求行包含请求方法(如GET、POST)、资源路径(URL)、协议版本等信息。请求头包含关于请求的其他元数据,如浏览器信息、Cookie等。请求主体(在POST请求中存在)包含要发送给服务器的数据。
- 服务器处理请求:一旦服务器接收到HTTP请求,它会解析请求行和请求头,根据请求方法和资源路径确定要执行的操作。服务器可能会查询数据库、处理逻辑等,以生成响应数据。
- 生成HTTP响应:服务器根据请求的处理结果生成HTTP响应。响应由状态行、响应头和响应主体组成。状态行包含响应状态码(如200表示成功、404表示未找到等)和协议版本。响应头包含响应的元数据,如日期、内容类型等。响应主体包含要发送给客户端的数据。
- 发送HTTP响应:服务器将生成的HTTP响应发送回客户端。响应经过TCP连接传输,到达客户端。
- 客户端解析响应:客户端接收到服务器发送的HTTP响应后,解析响应状态行、响应头和响应主体。客户端根据状态码判断请求是否成功,并从响应主体中获取服务器返回的数据。
- 关闭TCP连接:在数据传输完成后,客户端和服务器可以选择关闭TCP连接,释放资源。但是,HTTP/1.1引入了持久连接,允许多个请求和响应在同一连接上进行,以减少连接建立和关闭的开销。
- 展示内容:如果响应主体包含HTML、图像、视频等数据,客户端(如浏览器)会根据内容类型进行渲染或展示。用户最终能够在浏览器中看到请求的网页内容。
2.HTTP框架的设计和实现
2.1 分层设计
HTTP作用于应用层
分层设计方便扩展
2.2应用层设计
提供合理的API
2.3 中间件设计(洋葱模型)
配合handler实现一个完整的请求处理生命周期
拥有预处理和后处理逻辑
可以注册多中间件
对上层模块用户逻辑模块易用
需要同一调用栈用Next否则则不用
2.4 路由设计(前缀匹配树)
明确需求 业界调研 方案权衡 方案评审 确定开发
2.5 协议层设计
抽象出合适的接口
2.6 网络层设计(网络模型)
BIO NIO(使用监听器)
3.性能修炼
3.1 针对网络库的优化
go net:流式友好 小包性能好
netpoll:中大包性能好 时延低
3.2 针对协议的优化 -- Headers解析
找到Header Line的边界
Header key规范化
高转换效率和多内存开销
3.3 热点资源池化
减少内存分配,提高内存复用,性能提升
额外Reset逻辑
4.企业实践
追求性能
追求易用,减少误用(减少人力成本)
打通内部生态
文档建设 用户群建设