ZTTP:一个轻量 零依赖 快速的Go后端Web框架


ZTTP是一个轻量级的,零依赖的,非常快速的后端框架,用Go语言编写,直接构建在原始TCP套接字上。它被设计成一个用于教育目的的玩具项目,它从GofiberJ.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

import (
    "github.com/muhammadzkralla/zttp"
)

func main() {
    app := zttp.NewApp()

    app.Get(
"/", func(req *zttp.Req, res *zttp.Res) {
        res.Status(200).Send(
"Hello from ZTTP!")
    })

    app.Start(8080)
}