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

那些用 go 做业务系统的公司或者个人,真的感受都资源节省,开发效率提升了吗?

  •  4
     
  •   xiaocaiji111 · 6 天前 · 13773 次点击

    接触 go 至少 5 年了。一直关注 go 的发展,期间也用 go 做过不少工具,最近一年引入了生产用来开发业务系统。简单的 api 项目非常简单轻量,但是需要手动处理的东西也很多。

    生产中使用的是 gin 框架,依赖注入使用 wire ,也编写了很多工具类,该有的都有了。处理复杂场景时依然显得力不从心,也有很多令人疑惑的地方。在 java 中通过一个注解来切面,就可以实现关键接口日志的记录。比如 @Log("删除管理员")。而在 go 中就麻烦很多,需要为每个接口添加中间件,想获取后面执行方法的参数和返回值也相当困难。我们记录日志,也不可能只能记一句话,还需要操作人信息和操作参数及结果。

    编译速度没有想象的快,很多时候改动文件多了后,要半天,当然没有改动,第二次启动就快的多了(我们用的 goland )。

    二进制启动快,这是优点,但是好像并没有带来什么收益,只是从一个开发人员角度来看,启动很快,很爽,对业务并没有带来什么收益。因为发布的流程是很复杂的,并不是扔上去就直接给用户用,相比较验收等流程来说,1 秒和 10 秒 50 秒几乎忽略不计。

    二进制包下,这也是优点,2 阶段构建,我们使用 docker 镜像可以达到整体就 20m 左右,而同样的 springboot 达到 130m 左右(进一步模块化可以达到 80 左右)。但是服务器和制品库之间都是内网,几乎没有感受到明显差别,只对第一次拉取镜像有点用,后续镜像层拉过的都不会重复拉取。

    内存占用 go 真的很低,20m 左右,springboot 启动就要给 512 避免内存溢出,当前 128 甚至 64 也可以启动,但是就不能用了。我们的业务服务器都是 2 核 4G ,感觉 go 有点浪费的感觉。

    大内存,这点 go 做的不好,固定频率的 GC 在大内存占用时停顿明显。毛刺明显,而不像 java 可以根据业务选择合适的垃圾收集器,调优下很平滑。go 甚至没有提供可以选择的参数。

    编程体验,都说 go 好,但是我不这么认为,对于工具类,简单 api 项目,go 确实很好。简单。不需要任何复杂的依赖。但是对于有一定复杂度的项目,感觉 go 的内置库相当匮乏。比如在 java 中可以使用 stream 等一套下来就是最终的数据。而在 go 中即使借助外部库,也需要多步才能完成(别跟我说自己写一个,你去写)。

    另外就是 error 问题,写的时候一步一处理。很稳健。但是也很烦。过几天回来看代码,只能看到满屏的 if err != nil 。正常的业务逻辑已经湮没在 error 的海洋里。又臭又长(等等,这个不是说的 java ?)

    类型推断,声明变量时不用写类型。有好处也有坏处,好处是少巧几个字母,坏处也显而易见。比如,某个 controller 层调用 service 层代码。user := us.GetUser(ctx, uid),此时如果我想看下返回的数据结构必须到 service 层看,这层是看不到的,也点不进去,像 java UserResp user = us.GetUser(uid),直接点击 UserResp 就能快速到定义。而 go 层次一多就很烦,需要一层层,一层层到最后返回值的地方才能看到。

    依然有空指针,nil pointer 。特别是解引用时遇到最多。比如*user.name

    半吊子泛型,虽然 java 的泛型实现的也不怎样,但是作为程序员是不关心字节码层面和机器码层面如何实现的,只关心有无,好不好用。

    生态,go 的生态云原生基础设施比较多(不是说云原生就是 go ,云原生概念反而是 spring 后面的公司提出来的),业务相关的比较少。而 java 就很多了,很多基金会的组件也很优秀,多如牛毛,java 不仅仅是一门语言,现在说 java 基本是说其对应的生态,包括 kotlin ,java 等等,选择太多甚至出现选择困难症。

    说这些不是踩 go ,也不是吹捧 java 。各有各有优势的地方。在工作中依然会大量使用这两种语言。这里只是表达下自己工作中的感受,为后来者选择做个参考。

    129 条回复    2024-06-26 10:56:18 +08:00
    1  2  
    sophos
        101
    sophos  
       5 天前   ❤️ 1
    我这边 go 和 java 都有大量服务在线上跑着,以下数据比较粗略,只是做个大概的对比

    开发 go 服务的机器 cpu 平均利用率不到 30%,开发 java 服务的机器 cpu 平均利用率超过 60%,构建时能到 90%+
    打包构建时间,go 一般是 20s 左右,java 大概要个好几分钟吧
    同样的 k8s 滚动发布 10 个 pod 的服务,同样的 RollingUpdate 策略,go 服务大概需要 20s ,java 服务大概需要 10 分钟
    线上运行的容器内存占用,go 一般是 100M 左右,java 一般超过 2G
    cruii
        102
    cruii  
       5 天前
    不要用 java 的视角来看 go
    err 是看着难看,但 java 的异常并没有好到哪里去,大多数不都也是直接 throw ,然后异常处理器。针对不同的异常,不也是需要分别处理。这都是理想情况,能有多少是把不同类型异常分开处理呢。见过很多都是抽象一个 AbstractException ,业务异常继承,然后直接所有业务异常都是走这个 handler 。
    这也不美啊。
    coderzhangsan
        103
    coderzhangsan  
       5 天前
    @beneo 研发成本有 2 大开支,首先是研发人员人力成本,其次才是服务器成本,无论 go 还是 java 都是有钱才能玩的,没钱只能 php 一把梭了。
    tt67wq
        104
    tt67wq  
       5 天前
    web crud 的场景用 go 不是找不自在吗?
    SurfaceView
        105
    SurfaceView  
       5 天前
    你在这个地方问 java ,肯定是要被喷的, 这是 zzzq
    thoo61871
        106
    thoo61871  
       5 天前
    当年买过本 java 的书,他妈的比新华字典还厚,果断放弃了写 python 和 go 去了,go 写久了,python 都不想碰了。
    wupher
        107
    wupher  
       5 天前
    以下仅为个人选择:

    - 纯 web service 还是更喜欢用 Java / Kotlin / Spring ,甚至架构足够简单,node 也行。

    - Go Service 一般还是用于实现诸如 Sockets 类通信。
    0xsui
        108
    0xsui  
       5 天前
    @coderzhangsan 用 laravel 做各种事情~
    zhwq
        109
    zhwq  
       5 天前   ❤️ 1
    @hshe 可别吹 kratos 了,小版本都能相互不兼容。根本没法升级。
    xiangbohua
        110
    xiangbohua  
       5 天前
    我觉得“满屏的 if != ni”的判断有点奇怪,难道不能用异常捕获机制嘛?不了解 go
    xiangbohua
        111
    xiangbohua  
       5 天前
    @NewYear 我们公司配的 jinkins 发布,弄个注册中心,就两台机器,先注册中心下线、等一会缓存清空,在重启第一台,第一台启动经过漫长的启动之后轮训检查一下服务起来没有,再重复上面的过程搞第二台。
    就为了两台机器的平滑启动,发布一次 jinkins 至少等 10 分钟。
    sulinehk
        112
    sulinehk  
       5 天前
    感觉说的还是挺中肯的。
    lysShub
        113
    lysShub  
       5 天前
    `user := us.GetUser(ctx, uid),此时如果我想看下返回的数据结构必须到 service 层看`

    goland 不清楚,gopls 支持直接转到类型定义
    privil
        114
    privil  
       5 天前
    @xiangbohua #111 生命苦短,需用 golang 哈哈哈
    privil
        115
    privil  
       5 天前
    @NewYear #18 你确定你们服务器是主流配置。不是十年前的 e5 吧,5 分钟,哈哈哈
    number201724
        116
    number201724  
       5 天前
    差不多 4 年前准备把 MFC 写的服务换成 go 然后用 go 写了一些逻辑,上了一个压力测试发现查询成功但是返回 ErrBadConn
    调了一周发现是 go 语言自带的 sql 库有问题……
    具体表现是:数据库连接池超过 50 个连接,然后并发压力测试打满 50 个以上就会 ErrBadConn……问题是查询成功了,然后返回的是 ErrBadConn....从此没用过 go 了
    https://github.com/golang/go/blob/46cb016190389b7e37b21f04e5343a628ca1f662/src/database/sql/sql.go#L664
    coderzhangsan
        117
    coderzhangsan  
       5 天前
    @SurfaceView php 表示这算什么,在下已经被喷了很多年,直到我没落,还有人不忘踩 2 脚🤣🤣🤣
    DesnLee
        118
    DesnLee  
       5 天前
    @grittiness 试试 sqlc
    NewYear
        119
    NewYear  
       5 天前
    @privil

    哥们没必要吧,还 E5……
    hancai2
        120
    hancai2  
       5 天前
    客户让搞个 demo 环境,跑起来看看。 我们这项目跑 demo 要 128G 内存,客户说那还是算了吧。
    lvlongxiang199
        121
    lvlongxiang199  
       5 天前
    写业务感觉还是 java, ts 最方便. go 擅长写重网络 IO 的应用, 用同步的方式写异步比较舒服
    grittiness
        122
    grittiness  
       5 天前
    @lolizeppelin ent 在多表复杂关联的情况下是不是不太好用?以前有了解过,印象中简单 crud 好用,复杂关联好像写起来很麻烦

    @DesnLee sqlc 是不是更简陋?分页之类的有写好的轮子了吗?
    @dododada 手搓写起来太麻烦了,基础的分页、权限控制之类的,写起来也很费时间还觉得麻烦
    lambdaq
        123
    lambdaq  
       5 天前
    @number201724 感觉超过 50 个也挺危险的。。
    GeekGao
        124
    GeekGao  
       5 天前
    如果不考虑后期性能优化相关的成本投入,我觉得还是 python 提升得开发效率更多一些。
    privil
        125
    privil  
       5 天前
    @NewYear #119 我接触的客户比较杂,同样的 java 程序,不同服务器配置,十几秒和一百多秒启动都遇到过
    cmsyh29
        126
    cmsyh29  
       5 天前
    @itskingname 然而生产都要求 go 单测覆盖率 写到吐
    lesismal
        127
    lesismal  
       4 天前   ❤️ 1
    > 大内存,这点 go 做的不好,固定频率的 GC 在大内存占用时停顿明显。毛刺明显

    go 的 gc 已经很丝滑了, 多数人的业务量也不会有瓶颈. 我这里的百万连接的对象 map 优化下确实省不少:
    https://github.com/lesismal/nbio/pull/304#issuecomment-1583880587

    其他很多场景也可以定制数据结构针对性优化 gc

    至于调 gc 参数, 对于一些常驻对象数量大的, 仍然不太好解决根本问题
    wyds591101
        128
    wyds591101  
       4 天前
    我觉得还是看做什么吧,Go 有很多优点,但是我写业务逻辑的时候,我还是觉得 java 快一些。GO 我做项目参考的 gin-vue admin 。
    wxl2578
        129
    wxl2578  
       4 天前
    我不信你有 5 年的 go 经验
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   911 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 19:55 · PVG 03:55 · LAX 12:55 · JFK 15:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.