fasthttp
fasthttp安装教程
fasthttp 是一个用于 Go 的快速 HTTP 包,针对高性能进行了调整,在热路径中实现零内存分配,比 net/http 快 10 倍以上,目前,fasthttp 被 VertaMedia 成功地用于生产中,为每台物理服务器上超过 150 万个并发的保持连接提供 200K rps 的服务。

常见问题
为什么要创建另一个 http 包而不是优化 net/http?
因为 net/http API 限制了许多优化机会。比如说。
net/http 请求对象的寿命不受请求处理器执行时间的限制。所以服务器必须为每个请求创建一个新的请求对象,而不是像 fasthttp 那样重复使用现有的对象。
net/http 头信息被存储在 map[string][]string 中。所以服务器必须解析所有的头信息,将它们从[]字节转换成字符串,并在调用用户提供的请求处理程序之前将它们放入 map 中。这一切都需要不必要的内存分配,而 fasthttp 则可以避免。
net/http客户端API需要为每个请求创建一个新的响应对象。
为什么 fasthttp API 与 net/http 不兼容?
因为 net/http API 限制了许多优化机会。更多细节见上面的答案。同时,某些 net/http API 的部分也是次优的使用方式。
比较 net/http 的连接劫持和 fasthttp 的连接劫持。
比较 net/http 的 Request.Body 读取和 fasthttp 的请求体读取。
为什么 fasthttp 不支持 HTTP/2.0 和 WebSockets?
HTTP/2.0的支持正在进行中。WebSockets已经完成了。第三方也可以使用RequestCtx.Hijack来实现这些好东西。
与 fasthttp 相比,net/http 是否有已知的优势?
是的。
net/http 从 go1.6 开始支持 HTTP/2.0。
net/http的API是稳定的,而fasthttp的API是不断发展的。
net/http 可以处理更多的 HTTP 角落情况。
net/http 应该包含更少的 bug,因为它被更多的人使用和测试。
net/http可以在1.5以上的Go上工作。
为什么 fasthttp API 倾向于返回 []byte 而不是字符串?
因为[]字节到字符串的转换不是免费的 - 它需要内存分配和复制。如果你喜欢用字符串而不是字节片来工作,可以随意将返回的[]byte 结果包装成 string()。但请注意,这有非零的开销。
fasthttp 支持哪些 GO 版本?
Go1.5 以上。旧的版本将不被支持,因为它们的标准包缺少有用的功能。
注意:Go 1.9.7 是最老的测试版本。我们建议你尽快更新。从 1.11.3 开始,我们将放弃对 1.9.x 的支持。
请提供真实的基准数据和服务器信息
请看这个问题。
是否有计划向 fasthttp 添加请求路由?
没有计划将请求路由添加到 fasthttp 中。使用第三方路由器和支持 fasthttp 的 web 框架。
fasthttp-routing
路由器
框架
lu
阿特雷戈
光纤
齿轮箱
更多信息请参见此问题。
我在 fasthttp 中检测到了数据竞赛!
酷!归档一个错误。但是在这样做之前,请在你的代码中检查以下内容。
确保从 RequestHandler 返回后没有对 RequestCtx 或其成员的引用。
确保在从 RequestHandler 返回之前调用 TimeoutError,如果有对 RequestCtx 或其成员的引用,这可能会被其他 goroutine 访问。
我在这里没有找到我的问题的答案
试着探索一下这些问题。
更新日志
v1.24.0
620f0c8 增加中间件设置自定义远程地址的选项(#1009)(Lauris BH)。
894272e 修复 golangci-lint 动作(#1010)(Lauris BH)。
