ZTTP是一个轻量级的,零依赖的,非常快速的后端框架,用Go语言编写,直接构建在原始TCP套接字上。它被设计成一个用于教育目的的玩具项目,它从Gofiber和J.js等现代Web框架中汲取灵感。
没有使用HTTP引擎,甚至没有使用Go的net/http标准库。从TCP层开始手动处理所有逻辑。
该项目遵循Front Controller设计模式,这是SpringBoot,Jupiter. js等Web框架中广泛采用的架构方法。
ZTTP支持智能路由、自定义路由器、中间件、(反)序列化、头/查询/参数处理、cookie、缓存控制、静态文件服务、TLS/SSL、多部分请求、会话管理、保持活动请求、自定义中间件等功能。
该项目是按照TDD(测试驱动开发)开发的,因为我创建了超过250个测试,涵盖了每个功能的不同测试用例。
核心功能
- 原始TCP HTTP/1.1服务器,支持并发连接处理
- 前端控制器设计模式实现
- 零依赖(纯GO标准库)
路由
- app.Get("/path", handler)
- app.Post("/path", handler)
- app.Put("/path", handler)
- app.Patch("/path", handler)
- app.Delete("/path", handler)
所有传入的TCP连接都通过集中式请求处理功能handleClient()并发地汇集,该功能执行以下职责:
- 解析HTTP请求(方法、路径、参数、查询、头、正文、cookie等)。
- 提取查询参数和动态路由参数。
- 使用方法和路径将请求匹配到已注册的路由处理程序。
- 将请求委托给具有统一请求/响应上下文的匹配处理程序。
- 集中管理错误、超时、中间件、连接生命周期等。
高性能
性能达到GoFiber的45%,并且优于其他框架,而不使用任何HTTP引擎和从TCP层开始处理事情,而Fiber依赖于一个名为fasthttp的外部HTTP引擎。
为了说明一些数字,我使用wrk在不同的框架下测试了相同的路由和基准测试,并取了平均值:
- 300k RPS,3.5 ms延迟(使用GoFiber)
- 135k RPS,8.7 ms延迟(使用ZTTP)
- 67k RPS,34 ms延迟,使用Spring WebMVC
- 55k RPS,19 ms延迟 使用Spring WebFlux
- 10k RPS,135 ms延迟,使用Express.js (Node)
- 1.7k RPS,128 ms延迟(使用Flask)
为什么选择ZTTP?
ZTTP的创建是为了深入研究Web框架如何在引擎盖下工作。从TCP套接字处理和手动HTTP解析到请求路由和中间件架构。这是一个使用Go进行系统级Web开发的实践练习,具有最少的抽象。
我决定不使用任何外部HTTP引擎,甚至不使用Go的net/http标准库,并从TCP层开始从头开始处理所有逻辑,以获得最大的知识和经验。
这个项目中的所有内容都与RFC标准和HTTP/1.1结构完全一致,因为在开始实现之前,我花了几天时间阅读每个特性的RFC标准。
无论你是在学习网络如何工作,还是在探索Go的网络功能,ZTTP都被设计得足够小,可以理解,但表达能力足够强,可以成长。
下面是一个如何启动简单ZTTP服务器的最小示例:
package main |