Go Http框架性能测评: Fiber vs. Gin vs. Go标准库

本内容是对知名性能评测博主 Anton Putra Fiber vs. Gin vs. Go (stdlib): Performance (Latency - Throughput - Saturation - Availability): Performance (Latency - Throughput - Saturation - Availability)内容的翻译与整理, 有适当删减, 相关内容和结论以原作地址为准

介绍

本视频中,我们将对比 FiberGin 这两个 HTTP 框架,以及 Golang 标准库Go 1.22 版本新增的改进型多路复用器 。为了进行测试,我会将这些应用部署到 Kubernetes ,然后使用 Prometheus 监测 CPU内存 的使用情况,并在 Grafana 中进行可视化展示。

我们还会对比 客户端延迟 以及每个框架所能处理的 每秒请求数(RPS) 。在这次测试中,我增加了外部客户端的数量,以产生足够的负载,从而迫使 Kubernetes 对这些应用进行调节。最终,我们会得出一个 明确的胜者

为了运行此次测试,我在 AWS 上创建了一个 生产级 Kubernetes 集群 ,并使用了 m6a.4xlarge 实例类型。如果你想了解更多相关内容,我还有一门专门针对 EKS 初学者 的完整课程


框架概述

Go 1.22 版本之前,仅使用 Go 标准库 来开发 REST API 是一项十分困难的任务。其主要原因之一是:标准库中的 HTTP 请求多路复用器(multiplexer)不支持将 URI 模式映射到 HTTP 方法 ,而这对于设计 RESTful 资源至关重要。因此,许多开发者最终选择了使用诸如 GinFiber 之类的 第三方路由库。 (还有如Gorilla Mux,Chi)

但到了 Go 1.22 之后,其标准库已经足够强大,你 不再需要 额外的第三方 Web 框架来构建 REST API。当然,你仍然可以使用一些 外部中间件 来提高开发效率,但标准库 已经具备了所有必要的功能


测试

现在,让我们开始部署这些应用到 Kubernetes ,并让它们在 空闲状态 下运行 10-15 分钟

可以看到,Gin 框架 运行时的 内存和 CPU 占用略高 ,而 Go 标准库 的资源使用情况与 Fiber 相当接近。

正式测试

接下来,我将部署 20 个客户端 来为每个应用 生成流量 ,并逐步 增加请求量 。整个测试耗时 约 1.5 小时,在视频中将其压缩成数分钟,并在最后展示最终结果。

从测试流程来看,每 5 分钟 ,我们会 增加额外的 1000 RPS 负载 到每个应用。从一开始,我们就能观察到明显的趋势:

  • Gin 占用 更多的 CPU 和内存 ,并且 客户端延迟最高
  • Go 标准库资源占用接近 Fiber ,但其 延迟略高于 Fiber
  • FiberCPU 和内存使用率最低 ,并且 延迟最低,在所有框架中表现最佳。

Fiber 基于 Fasthttp 框架 ,但很多人不喜欢它。Fasthttp 是一个 非标准的 HTTP 实现 ,它主要 专注于特定场景的高性能优化 。除非你 确实需要它的特定优势,并且了解相关风险 ,否则它 并不是一个推荐的默认选择 。甚至 官方文档 也建议 大多数情况下应使用标准的 http 库


推至极限

让我们继续运行测试,直到所有应用 开始崩溃

  • Gin 最先 达到了 Kubernetes 设定的 Pod 资源限制 ,导致 Kubernetes 开始对其进行调节(throttling) ,这直接 影响了性能,并增加了延迟 。如果你在 Kubernetes 中运行 CPU 密集型应用 ,一定要 监控throttling的情况

  • 每秒请求数(RPS)图表 可以看到,Gin2 个 CPU 和 256MB 内存的 Pod 限制 下,最多只能处理 15,000个请求。

  • 其次,Go 标准库 也开始 失败 ,并被 Kubernetes 限流,这导致其 延迟上升 。在同样的配置下,它最多能处理 17,000 RPS
  • 最后,Fiber 也达到了极限,在约 20,000 RPS开始退化

测试结果分析

接下来,我们分别查看 整个测试期间的各项数据图表

  1. 每秒请求数(RPS):展示了每个应用的最大吞吐量。
  2. 客户端延迟:测量了从客户端角度的响应时间。
  1. CPU 使用率:直观反映了每个框架的计算资源消耗情况。
  1. Kubernetes 限流(Throttling) :在理想状态下应为 0 秒 ,但由于我们将应用推至极限,Kubernetes 开始对它们进行 限流
  1. 内存使用情况:展示了每个应用的内存消耗。

最终,Fiber 是本次测试毫无疑问的赢家 ,但它 并不适用于所有场景 。从我的个人观点来看,你可以 尝试在下一个 Go Web 或 REST 项目中使用标准库 ,因为它 已经具备所有必要的功能


总结

如果你对 源代码 有任何改进建议,欢迎提交 Pull Request ,我一定会 审核并进行测试 。同时,也欢迎在 评论区 告诉我 你希望我测试哪些内容

相关推荐
王达舒199436 分钟前
Spring Boot中定时任务Cron表达式的终极指南
java·spring boot·后端
demonlg011240 分钟前
Go 语言标准库中Channels,Goroutines详细功能介绍与示例
开发语言·后端·golang
王强你强43 分钟前
Spring Boot 启动参数终极解析:如何优雅地控制你的应用?
java·spring boot·后端
vener_1 小时前
基于Flask的通用登录注册模块,并代理跳转到目标网址
后端·python·flask
Asthenia04121 小时前
git的回退:revert还是reset?来个例子看看吧!
后端
Asthenia04121 小时前
接口速度太慢,排除DB影响,试试通过异步来优化吧!
后端
Asthenia04121 小时前
Lombok注解详解:从朴素构造到高效开发
后端
杨凯凡2 小时前
Apache Shiro 全面指南:从入门到高级应用
java·后端·shiro
图书馆钉子户2 小时前
django orm的优缺点
后端·python·django
linuxxx1102 小时前
django报错:RuntimeError: populate() isn‘t reentrant
后端·python·django