The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
skyworker

laravel 转 golang 最佳实践是?

  •  
  •   skyworker · Apr 14, 2020 · 8101 views
    This topic created in 2398 days ago, the information mentioned may be changed or developed.
    各位大神, 目前我司的后台系统是 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 replies  •  2020-05-06 15:24:23 +08:00
    LoNeFong
    LoNeFong
    Apr 14, 2020
    1
    如非必要,就不要换
    lhx2008
    lhx2008
    Apr 14, 2020
    2
    ORM 和 JSON 这块这块很麻烦,laravel 太随便了,怎么写都行。

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

    不要为了转而转
    skyworker
    skyworker
    OP
    Apr 14, 2020
    14
    @lniwn mongo 就算了, 当年赶时髦尝试过 egg js + mongo 的搭配, 简直是巨坑, 老老实实换成了 laravel + mysql 5.7
    skyworker
    skyworker
    OP
    Apr 14, 2020
    15
    @zjsxwc zephir 研究过, 不过目前的 php 逻辑是在 laravel 的 app, 目前还没 google 到类似案例
    skyworker
    skyworker
    OP
    Apr 14, 2020
    16
    @yc8332 目前还没有完美的 PHP 加密方案, 不信你去 taobao 搜索 "PHP 解密", 任何当前的 PHP 加密都能 1 块钱解密
    Rwing
    Rwing
    Apr 14, 2020
    17
    题外话,考虑一下 c#
    skyworker
    skyworker
    OP
    Apr 14, 2020
    18
    @hantsy 深有同感, 是不是有这个感觉的人都不敢说出来...
    skyworker
    skyworker
    OP
    Apr 14, 2020
    19
    @Rwing .net core 起一段时间看过, 不过毕竟 MS 整天虎头蛇尾, 绑定到 MS 的战略上, 很有可能当炮灰
    skyworker
    skyworker
    OP
    Apr 14, 2020
    20
    @dilu 没有, 纯粹就是探讨下, 看大神们有啥意见
    zjsxwc
    zjsxwc
    Apr 14, 2020
    21
    @skyworker
    找几个核心代码转 zephir 就行,没必要全部变 zephir
    nonfu
    nonfu
    Apr 14, 2020
    22
    @ArJun 我不是转 go,是觉得微服务场景 go 更合适,在不想引入 Java 技术栈的情况下。每个语言都有其适用场景
    JohnSmith
    JohnSmith
    Apr 14, 2020 via Android
    23
    找有经验的 golang 大牛带队
    noobsheldon
    noobsheldon
    Apr 14, 2020
    24
    霸天虎变形就行了 /doge
    loading
    loading
    Apr 14, 2020 via Android
    25
    goframe,了解一下。
    buffzty
    buffzty
    Apr 14, 2020
    26
    我也是尝试用 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
    skyworker
    OP
    Apr 14, 2020
    27
    @buffzty 原来用 laravel 10 行代码搞定的, 用 go 的话, 估计要 100 行也不止
    keenkiller
    keenkiller
    Apr 14, 2020
    28
    你这不如转 Java,go 写 curd 没啥优势的
    lvsemi1
    lvsemi1
    Apr 14, 2020
    29
    你的这些需求 go 并没有解决啊
    那既然大家都是高仿,不妨试试 goby on grails
    ben1024
    ben1024
    Apr 14, 2020
    30
    一些 socket 服务用 go,其他业务用 PHP 一起使用不影响
    gochat
    gochat
    Apr 14, 2020
    31
    只想说一句:动态一时爽,重构火葬场,你说的那些优势某种意义上来说就是劣势,系统最终只会变的更糟,最终不可维护。
    charlie21
    charlie21
    Apr 14, 2020
    32
    laravel 转 golang ...
    Rekkles
    Rekkles
    Apr 14, 2020
    33
    等于是好好的现代化工厂不要,非要自己组装个小厂开始造车。
    skyworker
    skyworker
    OP
    Apr 14, 2020
    34
    @tairan2006 java 的啰嗦实在恶心, 不打算用 java
    buffzty
    buffzty
    Apr 14, 2020
    35
    @skyworker 不至于.我觉得 go 多了百分之二十代码左右 这百分之 20 都是为了 orm 获取列表 写接口写的.等泛型有了 我觉得基本没什么差距了,或者 go 的代码更少些
    keenkiller
    keenkiller
    Apr 14, 2020
    36
    @skyworker 代码量差不多…go 没有 oop/泛型,有时候抽象业务代码有点麻烦,等 go2 出来倒是可以考虑。

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

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

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

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

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

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

    https://segmentfault.com/a/1190000007035295
    skyworker
    skyworker
    OP
    Apr 15, 2020
    55
    skyworker
    skyworker
    OP
    Apr 15, 2020
    56
    @HanSonJ 这篇资料更详尽一些: https://www.anquanke.com/post/id/176767
    liuhan907
    liuhan907
    Apr 15, 2020 via Android
    57
    @skyworker 你是说 js 的 async 是坑还是 async 语义是坑?
    nicoljiang
    nicoljiang
    Apr 15, 2020
    58
    心理上真的好排斥 laravel 党过早地来 go
    毕竟威力大到能把整个 PHP 生态带偏~
    nicoljiang
    nicoljiang
    Apr 15, 2020
    59
    为啥不去 Java 或者 .Net 啊??
    Go 还小,不要伤害他。
    sunshinev
    sunshinev
    May 6, 2020
    60
    我也是从 php 转向 的 golang,第一次先学习了 gin 、beego 之类的,觉得 go 本身不需要使用框架,本身已经足够强大了。所以开始学习 grpc 和 protobuf,搞了一个 http://chat.osinger.com 的项目, 然后一个月内开发了一个 go-sword 后台管理界面系统生成工具,https://sunshinev.github.io/go-sword-home 。目前觉得 go 满足了之前对 java 、php 、c#的优点集合~~哈哈
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1777 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 78ms · UTC 05:59 · PVG 13:59 · LAX 21:59 · JFK 00:59
    ♥ Do have faith in what you're doing.