V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
HaroldChen
V2EX  ›  Go 编程语言

2020 年末了,目前的 Go web 框架怎么选?

  •  
  •   HaroldChen · 2020-12-01 14:34:53 +08:00 · 21040 次点击
    这是一个创建于 1443 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想用 Go 写点东西,看了不少帖子,gin, echo 的名字出现的频率很高,后来发现了 iris,看了框架作者的对比 https://github.com/kataras/iris/issues/1396,觉得也有一定优势。

    目前的疑问是,为什么 gin 的热度这么高呢(先发优势+易用性?),iris 是否可以考虑使用,缺陷在哪?

    70 条回复    2023-03-20 18:24:41 +08:00
    wiluxy
        1
    wiluxy  
       2020-12-01 14:44:58 +08:00
    gin 吧,简单易用
    ck65
        2
    ck65  
       2020-12-01 14:50:05 +08:00
    基于 httprouter 自己撸的一个
    ck65
        3
    ck65  
       2020-12-01 14:51:50 +08:00
    上手就选 gin 吧,好用且新手友好。等发现自己的痛点了就知道要比较哪些方面了。
    zjsxwc
        4
    zjsxwc  
       2020-12-01 14:57:02 +08:00
    我自己平时都用 beego,虽然老了点,但熟悉

    cmdOptionKana
        5
    cmdOptionKana  
       2020-12-01 15:00:55 +08:00
    差别都不大,Go 的 web 框架能玩的花样不多,net/http 基础太完善了。
    avalon0624
        6
    avalon0624  
       2020-12-01 15:08:13 +08:00
    gin 应该有因为 Bilibili 去年意外开源带来的热度。
    iris 没用过不清楚。
    cryingsky
        7
    cryingsky  
       2020-12-01 15:14:09 +08:00
    为啥没人推荐这个 github.com/gofiber/fiber
    luob
        8
    luob  
       2020-12-01 15:31:03 +08:00
    go 的 web 框架选哪个都差不多。
    http 标准库干的事太多了,导致这些框架名字叫框架其实就是薄薄地糊了一层,也没有泛型和复杂的类型推导,基本都是一个人就能维护的工作量,就算凉了自己 fork 一份也不是什么问题。
    ziyeziye
        9
    ziyeziye  
       2020-12-01 15:32:13 +08:00
    Go Frame 不行吗, 功能齐全
    abersheeran
        10
    abersheeran  
       2020-12-01 15:46:49 +08:00   ❤️ 1
    建议直接标准库…… Golang http 标准库强的很,自己稍微包一层,又快又爽。
    zkqiang
        11
    zkqiang  
       2020-12-01 16:39:25 +08:00
    应该还是 gin 比较多...
    dilu
        12
    dilu  
       2020-12-01 18:28:06 +08:00
    我们就是 net/http 封装一下,然后接一些别的组件就 OK 了,例如日志,队列,redis 、mysql

    go 的目标就是简单,就别搞啥框架了 直接梭吧
    reus
        13
    reus  
       2020-12-01 18:49:58 +08:00
    没有什么是非框架不可的
    好好把 net/http 的文档从头看一遍,看看能做什么吧
    尤其是那些毫无必要地再封一下的垃圾框架,完全没有存在的必要
    faceair
        14
    faceair  
       2020-12-01 19:02:28 +08:00   ❤️ 1
    ZSeptember
        15
    ZSeptember  
       2020-12-01 19:06:05 +08:00
    gin 的 API 确实好用,可用 chi 封装一下成 gin 的 API
    zhyt1985
        16
    zhyt1985  
       2020-12-01 19:47:11 +08:00
    这个时候问,肯定选 zero 啊
    park4ce666
        17
    park4ce666  
       2020-12-01 20:59:22 +08:00 via iPhone
    Go 和 nodejs 同做 api 服务器的话,哪个更适合?
    kaka6
        18
    kaka6  
       2020-12-01 21:08:53 +08:00
    @park4ce666 Go 和 Node.js 速度性能应该是在同一个量级,就看资源库和自己的品味了
    park4ce666
        19
    park4ce666  
       2020-12-01 21:12:03 +08:00 via iPhone
    @kaka6 在对主机的要求上如何? 2GB 够跑吗?同一台机子上还得再跑个数据库
    kaka6
        20
    kaka6  
       2020-12-01 21:23:54 +08:00
    @park4ce666 看你怎么用,测试或自己玩没问题的
    1 核 2G 内存的话,1000 个并发访问,QPS 也能达到 2000+
    当然搞人工智能,图像识别的另说了
    mason961125
        21
    mason961125  
       2020-12-01 21:56:49 +08:00
    问就是 echo
    ly020044
        22
    ly020044  
       2020-12-01 22:04:21 +08:00
    @cryingsky 我也推荐这个,github.com/gofiber/fiber 。它有很多中间件、文档清晰、作者好像是全职维护
    FreeEx
        23
    FreeEx  
       2020-12-01 22:11:32 +08:00   ❤️ 1
    刚从 gin 换 echo,gin 的路由冲突就像吃了苍蝇一样难受
    FreeEx
        24
    FreeEx  
       2020-12-01 22:13:37 +08:00
    另外 gin 没全局异常处理,路由函数不能直接 return err,实在想不通为啥那么多人推荐。
    Cyanhall
        25
    Cyanhall  
       2020-12-01 22:14:41 +08:00
    看热度基本是在 Gin 和 Echo 两个间选了

    参考 - 最流行的 Go Web 框架: https://www.cyanhall.com/cn/top/go-web-framework/
    yrj
        26
    yrj  
       2020-12-01 22:26:13 +08:00 via iPad
    iris 是基于 fasthttp 的,性能更高,安利一下 fiber,也是,路由比 iris 更好。
    Hanggi
        27
    Hanggi  
       2020-12-01 22:52:56 +08:00
    @FreeEx
    这种时候其实应该从自身找找原因,为什么那么多人用 gin ?
    搞清楚了可能就进一步了解 go 语言了。
    FreeEx
        28
    FreeEx  
       2020-12-01 22:55:08 +08:00
    @Hanggi 找到了啊,gin 就是不好用
    qloog
        29
    qloog  
       2020-12-01 23:03:10 +08:00
    gin 吧,简单性能也好,大厂也用的多
    shanechiu
        30
    shanechiu  
       2020-12-01 23:36:05 +08:00
    @yrj 2021 年了,性能真的不是首选目标,用 echo 吧,方便。
    FightPig
        31
    FightPig  
       2020-12-01 23:53:27 +08:00
    自己写,直接用各种自己拼
    kylidboy
        32
    kylidboy  
       2020-12-02 00:15:55 +08:00 via Android
    aah
    Akashic
        33
    Akashic  
       2020-12-02 00:21:38 +08:00 via Android
    之前用 Iris,遇到过没有跨大版本,接口变了的情况🙃
    fewok
        34
    fewok  
       2020-12-02 00:35:42 +08:00
    @cryingsky 比较新,不过貌似最近很多大牛都点赞
    kevinwan
        35
    kevinwan  
       2020-12-02 00:44:31 +08:00 via iPhone   ❤️ 1
    服务治理,工具完备,go-zero 可以看看🤩
    https://github.com/tal-tech/go-zero
    sunmoon1983
        36
    sunmoon1983  
       2020-12-02 08:37:59 +08:00
    goFrame
    danbai
        37
    danbai  
       2020-12-02 09:04:05 +08:00 via Android
    @sunmoon1983 #36 +1
    eudore
        38
    eudore  
       2020-12-02 09:04:09 +08:00   ❤️ 12
    给大家转发下我在 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 太繁琐与其他库使用方法差距较大同时不具有明显独特优势。
    meshell
        39
    meshell  
       2020-12-02 09:15:13 +08:00
    @cryingsky 我用得这个 +1
    ohoh
        40
    ohoh  
       2020-12-02 09:31:04 +08:00
    @eudore 有推荐的吗
    eudore
        41
    eudore  
       2020-12-02 09:40:28 +08:00
    @ohoh 我写了顺序级别 就按顺序推荐吧。
    jmyz0455
        42
    jmyz0455  
       2020-12-02 09:49:02 +08:00
    @eudore 看上去 echo gin 二选一?
    yuchenyang1994
        43
    yuchenyang1994  
       2020-12-02 09:53:27 +08:00
    buffalo
    Yoock
        44
    Yoock  
       2020-12-02 10:46:15 +08:00
    @jmyz0455 echo 和 gin 用起来没有太大的差别
    eudore
        45
    eudore  
       2020-12-02 11:10:48 +08:00
    @jmyz0455 echo gin 是差不多,但是我根喜欢 echo,1 、内存 Logger 不需要调用一个方法后收到输出 err,如果有错误内置 err 会自动输出。2 、echo.Context 是一个接口,可以自己去 Warp 定义其他行为 3 、echo 的路由器比 gin 使用的 httprouter 更强,性能差不多在一个级别内,但是 echo 实现了路由优先级。
    eudore
        46
    eudore  
       2020-12-02 11:13:48 +08:00
    内置 Logger 不需要在调用一个方法后手动输出 err,如果有错误内置 Logger 会自动输出,debug 时也不会忽略掉错误。例如 session.Store 方法就返回了一个 err,如果有内置 Logger 就会自动打印,debug 时一眼就看出来了。
    kevinwan
        47
    kevinwan  
       2020-12-02 11:54:40 +08:00 via iPhone
    @eudore 可以评测下 go-zero🤝
    qianxiaoxiao
        48
    qianxiaoxiao  
       2020-12-02 11:58:07 +08:00
    喜欢简单的用 gin 喜欢大而全的用 beego
    Hanggi
        49
    Hanggi  
       2020-12-02 12:59:32 +08:00
    @eudore

    感觉就是对编程思想理解的差别。
    你的几个需求点明显是把其他语言里的惯用思想带了进来。

    Go 语言提倡遇到错误就立刻处理它,而不是攒到一起再统一处理。
    context 不知道是不是你传进 goroutine 里去了,但也不应该把 ctx 传进业务逻辑代码里。
    gin.context 是带扩展功能的,估计你想在 context 添加函数,明显也是从其他语言带进来的习惯。
    httprouter 的问题也有很多不错的解决方法。

    框架这种东西还是用的人多才是硬道理,当年 Node.js 的 koa 框架都说好,到头来标配还是 express 。
    当然真要用的话看个人喜好,但新手还是推荐 gin 。
    bsg1992
        50
    bsg1992  
       2020-12-02 13:12:55 +08:00
    用 go 搞 web 为什么不用 java .net php
    cmdOptionKana
        51
    cmdOptionKana  
       2020-12-02 13:14:06 +08:00
    初次玩 Go 可以随便选择一个入门,echo, gin, net/http 都很好,也都差别不大。我玩过这些,现在看大家推荐发现了 fiber, 有点意思,下次就玩 fiber 了。
    jmyz0455
        52
    jmyz0455  
       2020-12-02 13:43:33 +08:00
    @eudore 我好像被降权了,我给你回复你能看见有提醒吗?
    eudore
        53
    eudore  
       2020-12-02 13:58:43 +08:00
    @Hanggi
    1 、context 和 gin.context 不能 go,context 会错误释放,gin.context 这样的都会出并发问题,的这点我清楚,fiber 里面就有这样错误(没单元测试测),context 我会作为业务的 ctx 使用,例如 sql.DB 操作使用 http 创建的 ctx 作为参数使用。
    2 、扩展我们可能说的不是一个维度,扩展一是闭包所有框架都可以使用,但是要手动去闭包,扩展二是对象装饰(我好像没有场景);无入侵添加额外函数我自己低性能损耗(框架部分 1%不到)也实现了,另外我没有其他语言的习惯,在使用 go 之前就轻度使用过 django 实现不到 10 个 api 。
    3 、httprouter 缺陷没有方法无入侵解决,结构体定义死了,只能重新实现。
    eudore
        54
    eudore  
       2020-12-02 14:02:10 +08:00
    @kevinwan 微服务玩了不深,没法能力评测 gozero,jaeger 、consul 、prometheus 我也才基本使用,http 我是都看过了也都写过了。
    ewBuyVmLZMZE
        55
    ewBuyVmLZMZE  
       2020-12-02 14:04:18 +08:00
    gin 的包装不错,另外就是 echo 强烈安利,至于其他的,我个人就不推荐了。
    eudore
        56
    eudore  
       2020-12-02 14:04:24 +08:00
    @jmyz0455 我看见了,觉得二选一这样简单问题没必要回复你,你自己随意拉都差不多,goweb 这坑又不深,学好 nethttp 就啥都不怕。
    jmyz0455
        57
    jmyz0455  
       2020-12-02 14:42:49 +08:00
    @eudore 非常感谢🙏
    zhdsuperm
        58
    zhdsuperm  
       2020-12-02 17:03:21 +08:00
    @bsg1992 你看他机器,内存应该不行,我觉得 go 最好,万一业务成功了,还能拓展
    windfarer
        59
    windfarer  
       2020-12-02 17:19:03 +08:00
    几年前我们写的时候都是用 mux 做路由,后面直接挂官方 http 库的 handler 的,不知道为啥现在都搞得这么复杂
    kevinwan
        60
    kevinwan  
       2020-12-02 19:11:29 +08:00 via iPhone
    @windfarer 服务治理能力和工程化工具
    kssss
        61
    kssss  
       2020-12-12 22:14:02 +08:00
    推荐 gin,通用省事
    happyxhw
        62
    happyxhw  
       2021-04-10 18:42:26 +08:00
    @FreeEx
    ```
    _ = c.AbortWithError( http.StatusBadRequest, err)
    return
    ```
    vincentxue
        63
    vincentxue  
       2021-05-29 16:45:11 +08:00
    @eudore 半年过去了,观点有变化吗?
    eudore
        64
    eudore  
       2021-05-31 08:55:28 +08:00   ❤️ 2
    @vincentxue 关注不多
    "gin Context 不合理的实现 context.Context 接口(尝试性传递 ctx 会出未知问题" 这个我理解不对,go1.13context 源码优化了实现,我按 10 版本去理解的不对了;在 1.13 之前 context 实现使用的私有类型断言,自己实现 context.Context 接口好像会性能有点影响,异步 go done,记不清了。
    goframe 的 sync.Map 的单线程单元测试在 2019.5-2020-5 之间某时间之前就修复了,性能测试和 sync.Map 相同,好像是一个删除 3 倍性能,一个插入 3 倍性能,查询性能完全一样,goframe 的 ghttp 在 web 领域不算顶尖。
    fiber 的单元测试还是没有补,单元测试跑完就有的 bug 还是没排。
    JoeBreeze
        65
    JoeBreeze  
       2021-09-01 16:30:47 +08:00
    @FreeEx #23 虽然我写了个方法来处理, 但是还是很蛋疼
    vincentxue
        66
    vincentxue  
       2022-01-10 20:08:01 +08:00
    @eudore 又看到这篇帖子,突然发现你分享了那么多,但是没有给出答案,你的推荐是什么呢?
    Seanfuck
        67
    Seanfuck  
       2022-03-11 16:58:47 +08:00
    22 年了,有新推荐没?
    helloword001
        68
    helloword001  
       2022-08-18 11:44:03 +08:00
    22 年了,有新推荐没?
    thomascatlee
        69
    thomascatlee  
       2023-03-13 17:55:26 +08:00
    23 年了,有新推荐没?
    IIInsomnia
        70
    IIInsomnia  
       2023-03-20 18:24:41 +08:00
    chi
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5477 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 07:00 · PVG 15:00 · LAX 23:00 · JFK 02:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.