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)内容的翻译与整理, 有适当删减, 相关内容和结论以原作地址为准

介绍

在本视频中,我们将对比 Fiber 和 Gin 这两个 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 资源至关重要。因此,许多开发者最终选择了使用诸如 Gin 或 Fiber 之类的 第三方路由库。 (还有如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。
  • Fiber 的 CPU 和内存使用率最低 ,并且 延迟最低,在所有框架中表现最佳。

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


推至极限

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

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

  • 从 每秒请求数(RPS)图表 可以看到,Gin 在 2 个 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 ,我一定会 审核并进行测试 。同时,也欢迎在 评论区 告诉我 你希望我测试哪些内容。

相关推荐
不识君7 分钟前
esl-client 2.0.0 发布:Java 项目接入 FreeSWITCH,从引入到使用
spring boot·后端·开源
牧瀬クリスだ23 分钟前
Redis五大数据类型全解析:从入门到实战
java·数据库·redis·后端·缓存
Rain的Java大神之路42 分钟前
北漂 13 年,我把 Java 家底钉成了这张知识图谱(全站免费)
java·后端·程序员
Amos_Web1 小时前
通过 Rspack 源码学 Rust(一):`mod`、`pub` 与 `use crate`/`use super`
后端
张彦峰ZYF1 小时前
拆得开不等于该拆开:微服务与模块化单体的边界判据、规模阈值、团队适配与一致性代价
后端·微服务·边界是否稳定·扩展天花板是否到顶·有无小组能独立值班·独立部署的自由会否被用上·这一刀是否切断不可降级的不变量
是江迪呀1 小时前
介绍一个开源项目 —— 烂笔头
前端·后端
captain3761 小时前
Spring Web MVC(2)
java·前端·spring boot·后端·spring·mvc
紧跟先前的步伐1 小时前
Go AI Agent 实战 17|模型适配层设计:让模型可替换
开发语言·人工智能·后端·ai·golang
IT_陈寒2 小时前
一文搞懂Java的核心概念
前端·人工智能·后端
铁皮饭盒2 小时前
workbuddy和codebuddy免费送1000积分, 10秒钟搞定
前端·后端