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

laravel 转 golang 最佳实践是?

  •  
  •   skyworker 2020-04-14 10:40:37 +08:00 7382 次点击
    这是一个创建于 2005 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位大神, 目前我司的后台系统是 php 的 laravel 框架, 目前体验非常好, 本来没必要换 golang, 不过有如下痛点, golang 能解决:

    1. 我司的产品是私有化部署给客户的, PHP 由于是动态语言, 天生加密性不好

    2. PHP 作为 web 语言目前在企业端口碑没有 JAVA 之类的"企业级"名声好听(很多客户反馈,PHP 不是做网站的, 还能做系统?), 这个其实无所谓的,希望不要拿这一点批判我...

    2. golang 所谓的"高并发"对我们目前的项目而言, 意义不大. 16GB 内存的服务器, 一天的 PV 可能不超过 100. 主要是数据结构复杂和业务逻辑复杂.

    大致看了 golang 的一些 web 框架(主要是 ORM),发现一些问题:

    1. 毕竟是强类型语言, 在定义 model 的时候, 还要定义类型, 略微麻烦. 在 laravel 的项目中, 因为是弱类型, 所以客户在系统中可以自定义新字段, 直接 post 到后台, laravel 就能直接保存了, 例如:

    POST 内容:

    {
    "name": "tom",
    "age": 12,
    "content": "1111"
    }

    在 laravel 中, 只需:

    $data = $request->all();
    $user = new User($data);
    $user->save();

    在 golang 的 ORM 中, 好像没有这么简单(实际案例中, POST 字段可能有 30 多个), 一个一个字段设置, 麻烦.

    2. 在 laravel 中,为了便于扩展, model 有很多 json 类型的数据(mysql 支持 json 类型字段), 例如 user.extra 是 json 类型. 只需要在 larave 的 model 中设定:

    protected $casts = [
    'extra' => 'array',
    ];

    在 CRUD 的时候, 都可以自动将 输入 /输出 信息,保存为 json 字符串 /或者 php arrray 类型. golang 现有的 orm 好像都不支持.


    3. 其他的小功能. 例如我们的系统中, 需要将每个 model 被修改的内容记录下(例如, update 的时候, 知道哪些字段被修改了), 例如 user 的 name 被从'tom', 修改成了 'joe', 在 laravel 中, 只需要:

    $newData = ['name' => 'joe'];
    $user->update($newData );

    //修改内容

    $change = $user->getDirty();

    ['name']

    $orign = $user->getOriginal('name') // tom

    在 golang 的 ORM 中, 类似功能也是没有的.


    举了几个小例子, 感觉 golang 的相关 tools 中,至少 orm 这块内容, 相对于 laravel 来说, 还是不完善的. 基础的 CRUD 肯定没问题, 不过相对于 laravel 的 orm 来说, 就有点 奔驰 换 桑塔纳 的感觉了.
    60 条回复    2020-05-06 15:24:23 +08:00
    LoNeFong
        1
    LoNeFong  
       2020-04-14 10:45:23 +08:00
    如非必要,就不要换
    lhx2008
        2
    lhx2008  
       2020-04-14 10:46:19 +08:00
    ORM 和 JSON 这块这块很麻烦,laravel 太随便了,怎么写都行。

    转的意义不大,看管事的人怎么背锅了
    b821025551b
        3
    b821025551b  
       2020-04-14 10:49:18 +08:00   1
    pv 不超过 100 ?还没测试环境压力大,你折腾它干嘛?
    zjsxwc
        4
    zjsxwc  
       2020-04-14 10:51:56 +08:00
    如果只是因为 “我司的产品是私有化部署给客户的, PHP 由于是动态语言, 天生加密性不好”
    可以用 zephir 把 php 代码变成 二进制 so 拓展,提供给别人
    ArJun
        5
    ArJun  
       2020-04-14 10:54:48 +08:00   1
    https://xueyuanjun.com/ 这位大佬也是 laravel 转 go
    lniwn
        6
    lniwn  
       2020-04-14 11:01:55 +08:00
    你这种需求,如果非要转 go,可能还得再看下 mongo 。
    Rwing
        7
    Rwing  
       2020-04-14 11:04:07 +08:00
    考虑利用 db 支持的 json 类型,直接存到 json 类型里
    Mohanson
        8
    Mohanson  
       2020-04-14 11:10:38 +08:00
    "net/http"
    yc8332
        9
    yc8332  
       2020-04-14 11:24:08 +08:00   1
    如果只是代码加密问题,都给他搞成二进制不就好了。缓存 opcache,不需要给代码的。只要有代码文件名就行了。
    airplayxcom
        10
    airplayxcom  
       2020-04-14 11:26:25 +08:00
    这么说吧 开发成本与维护成本 你选哪一个
    hantsy
        11
    hantsy  
       2020-04-14 11:36:14 +08:00   3
    转 GO,编程体验就像回到了 PHP 4 。
    hantsy
        12
    hantsy  
       2020-04-14 11:37:27 +08:00
    laravel 你为什么要用弱类型,PHP 完全可以按强类型 OOP 那一套来写程序。
        13
    dilu  
       2020-04-14 11:46:10 +08:00
    讲道理,如果不是性能 如果不是安全和方便部署,go 在 web 开发这里没有一毛钱的优势

    不要为了转而转
    skyworker
        14
    skyworker  
    OP
       2020-04-14 12:04:46 +08:00
    @lniwn mongo 就算了, 当年赶时髦尝试过 egg js + mongo 的搭配, 简直是巨坑, 老老实实换成了 laravel + mysql 5.7
    skyworker
        15
    skyworker  
    OP
       2020-04-14 12:05:31 +08:00
    @zjsxwc zephir 研究过, 不过目前的 php 逻辑是在 laravel 的 app, 目前还没 google 到类似案例
    skyworker
        16
    skyworker  
    OP
       2020-04-14 12:06:22 +08:00
    @yc8332 目前还没有完美的 PHP 加密方案, 不信你去 taobao 搜索 "PHP 解密", 任何当前的 PHP 加密都能 1 块钱解密
    Rwing
        17
    Rwing  
       2020-04-14 12:06:30 +08:00
    题外话,考虑一下 c#
    skyworker
        18
    skyworker  
    OP
       2020-04-14 12:07:01 +08:00
    @hantsy 深有同感, 是不是有这个感觉的人都不敢说出来...
    skyworker
        19
    skyworker  
    OP
       2020-04-14 12:08:07 +08:00
    @Rwing .net core 起一段时间看过, 不过毕竟 MS 整天虎头蛇尾, 绑定到 MS 的战略上, 很有可能当炮灰
    skyworker
        20
    skyworker  
    OP
       2020-04-14 12:08:55 +08:00
    @dilu 没有, 纯粹就是探讨下, 看大神们有啥意见
    zjsxwc
        21
    zjsxwc  
       2020-04-14 12:17:20 +08:00
    @skyworker
    找几个核心代码转 zephir 就行,没必要全部变 zephir
    nonfu
        22
    nonfu  
       2020-04-14 12:17:44 +08:00
    @ArJun 我不是转 go,是觉得微服务场景 go 更合适,在不想引入 Java 技术栈的情况下。每个语言都有其适用场景
    JohnSmith
        23
    JohnSmith  
       2020-04-14 12:35:03 +08:00 via Android
    找有经验的 golang 大牛带队
    noobsheldon
        24
    noobsheldon  
       2020-04-14 13:04:22 +08:00
    霸天虎变形就行了 /doge
    loading
        25
    loading  
       2020-04-14 13:30:22 +08:00 via Android
    goframe,了解一下。
    buffzty
        26
    buffzty  
       2020-04-14 13:46:41 +08:00
    我也是尝试用 go 写 api. 总体来说,没有泛型很难受. 其他的还好.
    安全性变高,灵活度变低,复杂度变高
    1:
    ```go
    d := &AddUserData{}
    if err := c.ShouldBindJSON(d); err != nil {
    app.ValidError(err)
    return
    }
    user := &models.User{
    Account: d.Account,
    Gender: d.Gender,
    Name: d.Name,
    Age: d.Age,
    Level: d.Level,
    }
    if err := models.Add(user); err != nil {
    app.ErrorMsg(err.Error())
    return
    }
    app.Success()
    ```
    2:
    json 注解中加入 sql:"TYPE:json"
    类型是先 Value 和 Scan 接口
    3:
    db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18,})

    db.Model(&user).Updates(User{Name: "hello", Age: 18})
    skyworker
        27
    skyworker  
    OP
       2020-04-14 13:50:15 +08:00
    @buffzty 原来用 laravel 10 行代码搞定的, 用 go 的话, 估计要 100 行也不止
    tairan2006
        28
    tairan2006  
       2020-04-14 13:50:34 +08:00
    你这不如转 Java,go 写 curd 没啥优势的
    lvsemi1
        29
    lvsemi1  
       2020-04-14 13:57:05 +08:00
    你的这些需求 go 并没有解决啊
    那既然大家都是高仿,不妨试试 goby on grails
    ben1024
        30
    ben1024  
       2020-04-14 14:02:35 +08:00
    一些 socket 服务用 go,其他业务用 PHP 一起使用不影响
    gochat
        31
    gochat  
       2020-04-14 14:05:54 +08:00
    只想说一句:动态一时爽,重构火葬场,你说的那些优势某种意义上来说就是劣势,系统最终只会变的更糟,最终不可维护。
    charlie21
        32
    charlie21  
       2020-04-14 14:10:12 +08:00
    laravel 转 golang ...
    Rekkles
        33
    Rekkles  
       2020-04-14 14:19:00 +08:00
    等于是好好的现代化工厂不要,非要自己组装个小厂开始造车。
    skyworker
        34
    skyworker  
    OP
       2020-04-14 14:25:14 +08:00
    @tairan2006 java 的嗦实在恶心, 不打算用 java
    buffzty
        35
    buffzty  
       2020-04-14 14:28:21 +08:00
    @skyworker 不至于.我觉得 go 多了百分之二十代码左右 这百分之 20 都是为了 orm 获取列表 写接口写的.等泛型有了 我觉得基本没什么差距了,或者 go 的代码更少些
    tairan2006
        36
    tairan2006  
       2020-04-14 15:00:33 +08:00
    @skyworker 代码量差不多…go 没有 oop/泛型,有时候抽象业务代码有点麻烦,等 go2 出来倒是可以考虑。

    直接上 Java11 的话,代码量应该比 go 还少一点。go 的优势在无痛并发上,你们用不上的话,没必要上。
    yanzixuan
        37
    yanzixuan  
       2020-04-14 15:10:09 +08:00
    @skyworker 我去,程序员这么不值钱么。按下按钮也不止一块吧。。。
    skyworker
        38
    skyworker  
    OP
       2020-04-14 15:27:33 +08:00
    @yanzixuan 一块钱是夸张的说法, 他们是按文件数量收费的. 你传一个 200 个 php 的压缩包, 人家收 200 块钱这样子. PHP 解密有专门的工具, 文件夹丢进去,就全部解密了
    skyworker
        39
    skyworker  
    OP
       2020-04-14 15:28:59 +08:00
    讨论到这里, 看来转 go 没啥意义了, go 的唯一的优势 和 带来的缺点比, 不算什么
    buffzty
        40
    buffzty  
       2020-04-14 16:17:47 +08:00
    为什么要转 go 啊, 哪个程序员不会几个语言啊 一起写不就行了吗
    yc8332
        41
    yc8332  
       2020-04-14 17:07:39 +08:00
    @skyworker 不是加密代码。是只提供 opcache 就能运行了,和 java 的 class 文件一下。。编译过的。
    lepig
        42
    lepig  
       2020-04-14 17:16:19 +08:00
    先说一下。现阶段用 golang 就别用什么 orm 了,go-sql-driver/mysql 库已经足够用。 如果你用 laravel orm 的使用体验来体验 golang 呵呵
    xcstream
        43
    xcstream  
       2020-04-14 18:10:49 +08:00
    实时通信和常驻数据的可以考虑其他语言。其他 php 足够了
    lygmqkl
        44
    lygmqkl  
       2020-04-14 20:08:56 +08:00
    说句不太好听的, 选 laravel 就是选择了快餐化倾向,go 基本属于回到 php3/4 的时代,你们绝 B 接受不了。 在 go 上就别想那么轻松了,两个并不一样,laravel 是为了“快”,放弃了很多,go 更严谨。

    注重点并不一样,可能开发成本你们最终也无法接受。。。
    chinvo
        45
    chinvo  
       2020-04-14 20:12:55 +08:00 via iPhone
    request->all 直接传递给 ORM 可能导致未授权写入

    比如你有个字段只有管理员能写

    或者你后期增加了类似的字段但是早期代码没改全导致有的接口没能对新增字段做过滤
    liuhan907
        46
    liuhan907  
       2020-04-14 21:09:41 +08:00 via Android
    @skyworker 我也觉得如果你想转,考虑.NET Core 配 EF Core 。只考虑写的爽的话我没觉得有比这个更强的。
    bobomaster
        47
    bobomaster  
       2020-04-14 21:22:39 +08:00
    Swoole Compiler 加服务器授权,商派就是这么干的
    lybcyd
        48
    lybcyd  
       2020-04-15 09:09:02 +08:00
    @chinvo laravel 的 model 有专门的属性来规避这个问题,可以只允许指定 field 来进行批量赋值,也可以反向设置指定 field 不能批量赋值
    skyworker
        49
    skyworker  
    OP
       2020-04-15 09:33:25 +08:00
    @lygmqkl 我个人认为, go 的"快"其实没什么意义, 带来的代码量膨胀才是成本.

    并且在这个 CPU 和内存低廉的时代, 即使 PHP 的代码比 go 多了 50ms, api 用 token, 增加服务器,然后用 load balance 就 OK 了.

    并且真的的大项目, 系统的瓶颈也在数据库这里, 而不在编程语言中.
    skyworker
        50
    skyworker  
    OP
       2020-04-15 09:37:24 +08:00
    就像前几年被前端封为神器, 希望插入后端工作的各种 js web 框架, 原本 js 中引以为傲的 async 功能, 当做后端语言的话, 简直就是坑, 反正我是恨不得禁用了 async
    skyworker
        51
    skyworker  
    OP
       2020-04-15 09:39:45 +08:00
    @chinvo 企业 ERP 系统, 各种 form 中字段多如牛毛(几十个 /上百个), 并且客户会随时提出变化,增加或减少 form 中字段(少 10 个字段 /多 20 个字段), 因为内部系统, 所以暂不考虑 hacker 攻击的问题, 先应付客户的需求变化再说.
    chinvo
        52
    chinvo  
       2020-04-15 10:34:16 +08:00 via iPhone
    @lybcyd #48 这个倒是知道
    HanSonJ
        53
    HanSonJ  
       2020-04-15 10:41:34 +08:00
    skyworker
        54
    skyworker  
    OP
       2020-04-15 10:45:51 +08:00
    @HanSonJ PHP 动态语言, 破解只是时间问题, 取决于想要破解你代码人准备花多少时间和成本而已

    https://segmentfault.com/a/1190000007035295
    skyworker
        55
    skyworker  
    OP
       2020-04-15 10:47:45 +08:00
    skyworker
        56
    skyworker  
    OP
       2020-04-15 10:51:48 +08:00
    @HanSonJ 这篇资料更详尽一些: https://www.anquanke.com/post/id/176767
    liuhan907
        57
    liuhan907  
       2020-04-15 11:24:49 +08:00 via Android
    @skyworker 你是说 js 的 async 是坑还是 async 语义是坑?
    nicoljiang
        58
    nicoljiang  
    PRO
       2020-04-15 12:23:43 +08:00
    心理上真的好排斥 laravel 党过早地来 go
    毕竟威力大到能把整个 PHP 生态带偏~
    nicoljiang
        59
    nicoljiang  
    PRO
       2020-04-15 12:24:32 +08:00
    为啥不去 Java 或者 .Net 啊??
    Go 还小,不要伤害他。
    sunshinev
        60
    sunshinev  
       2020-05-06 15:24:23 +08:00
    我也是从 php 转向 的 golang,第一次先学习了 gin 、beego 之类的,觉得 go 本身不需要使用框架,本身已经足够强大了。所以开始学习 grpc 和 protobuf,搞了一个 http://chat.osinger.com 的项目, 然后一个月内开发了一个 go-sword 后台管理界面系统生成工具,https://sunshinev.github.io/go-sword-home 。目前觉得 go 满足了之前对 java 、php 、c#的优点集合~~哈哈
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5801 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 06:17 PVG 14:17 LAX 23:17 JFK 02:17
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86