给大家转发下我在 learnku 上写的答案,安利 fiber 的都辣鸡。
自己阅读过 echo gin http.Server 全部、beego 大部分、iris 少量代码,
net/http 体系下 echo > gin > beego > net/http > iris 、goframe 、fiber,下面列出我自己看到的一些不足,不推荐 fasthttp 原因生态相对弱,仅支持 http/1.1 。
echo 中间件闭包消耗大量资源(每一个中间件的成本与其他框架不成比例),router any 方法不具有优先级。单元测试:84%
gin Context 不合理的实现 context.Context 接口(尝试性传递 ctx 会出未知问题),Context 非接口无法扩展,没有内置 Logger 无法自动输出 err (所有 err 必须处理,否在运行出现了 err 自己都不知道),validator 注册不合理( v8 、v9 、v10 可能注册到不同版本里面去了),不支持路由优先级和 any 方法优先级(从 httprouter 继承的问题)。单元测试:98%
beego 程序是单例,代码复杂度过高一个核心方法 200+行( ServeHTTP 方法),内置对象太多导致框架过重无法扩展(内置嵌入了 csrf 、session 等功能但并不需要),体系相对成熟。单元测试:无公开数据
iris 代码抄袭 篡改 git 历史(抄袭 httprouter 被锤改 git 历史 [
https://github.com/avelino/awesome-go/pull/1135](
https://github.com/avelino/awesome-go/pull/1135)) 删除老版本代码( git 历史改了一些版本代码没了,老项目无法编译了),httptest 库测试 iris 会 panic,最新版本 api 设计还是不合理,中间件机制少个 for 导致设计极差不合理,HandleDone 方法画蛇添足使用不便,稳定性差每个大版本 api 全变(都 v12 还不合理怎么会稳定)。单元测试:无公开数据 自己单元测试引入 iris 触发 panic
goframe 以前看到的 gmap 组件的软文(18 年),单线程去对比测试 sync.Map ,得出的比 sync.Map 块一倍性能结果 2020 年看还在,这样低级错误严重怀疑水平,大部分代码是工具相关内容。单元测试: 69%
fiber: 低性能 for 循环路由器,没有单元测试,存在 Race Data 导致的 bug 。
关于性能都差不多的没有可以拉开性能差距的地方,随便学一个源码就可以了,结构都差别的没啥难点,看公司需要使用什么。echo 和 gin 加上依赖一共也都有 100 多 M,学那个框架都避不开 net/http 库,这个才是根本。
------------------------------------------------------------------------------------------------------
路由器实现,也都是渣渣。
httprouter 高性能 不支持路由优先级和 any 方法优先级,代码复杂度太高。
chi 中等性能,支持路由优先级,资源消耗是 httprouter 时间 5 倍、内存 10 倍
mux 非高性能路由器实现(没测试,但是实现方法至少慢 20 倍以上,看别人测试数据是比 httprouter 慢 300 倍),使用链式 api 太繁琐与其他库使用方法差距较大同时不具有明显独特优势。