跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • laravel 转 golang 最佳实践是?
未分類
4 2 月 2020

laravel 转 golang 最佳实践是?

laravel 转 golang 最佳实践是?

資深大佬 : skyworker 18

各位大神, 目前我司的后台系统是 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 来说, 就有点 奔驰 换 桑塔纳 的感觉了.

大佬有話說 (59)

  • 資深大佬 : LoNeFong

    如非必要,就不要换

  • 資深大佬 : lhx2008

    ORM 和 JSON 这块这块很麻烦,laravel 太随便了,怎么写都行。

    转的意义不大,看管事的人怎么背锅了

  • 資深大佬 : b821025551b

    pv 不超过 100 ?还没测试环境压力大,你折腾它干嘛?

  • 資深大佬 : zjsxwc

    如果只是因为 “我司的产品是私有化部署给客户的, PHP 由于是动态语言, 天生加密性不好”
    可以用 zephir 把 php 代码变成 二进制 so 拓展,提供给别人

  • 資深大佬 : ArJun

    https://xueyuanjun.com/ 这位大佬也是 laravel 转 go

  • 資深大佬 : lniwn

    你这种需求,如果非要转 go,可能还得再看下 mongo 。

  • 資深大佬 : Rwing

    考虑利用 db 支持的 json 类型,直接存到 json 类型里

  • 資深大佬 : Mohanson

    “net/http”

  • 資深大佬 : yc8332

    如果只是代码加密问题,都给他搞成二进制不就好了。缓存 opcache,不需要给代码的。只要有代码文件名就行了。

  • 資深大佬 : airplayxcom

    这么说吧 开发成本与维护成本 你选哪一个

  • 資深大佬 : hantsy

    转 GO,编程体验就像回到了 PHP 4 。

  • 資深大佬 : hantsy

    laravel 你为什么要用弱类型,PHP 完全可以按强类型 OOP 那一套来写程序。

  • 資深大佬 : dilu

    讲道理,如果不是性能 如果不是安全和方便部署,go 在 web 开发这里没有一毛钱的优势

    不要为了转而转

  • 主 資深大佬 : skyworker

    @lniwn mongo 就算了, 当年赶时髦尝试过 egg js + mongo 的搭配, 简直是巨坑, 老老实实换成了 laravel + mysql 5.7

  • 主 資深大佬 : skyworker

    @zjsxwc zephir 研究过, 不过目前的 php 逻辑是在 laravel 的 app, 目前还没 google 到类似案例

  • 主 資深大佬 : skyworker

    @yc8332 目前还没有完美的 PHP 加密方案, 不信你去 taobao 搜索 “PHP 解密”, 任何当前的 PHP 加密都能 1 块钱解密

  • 資深大佬 : Rwing

    题外话,考虑一下 c#

  • 主 資深大佬 : skyworker

    @hantsy 深有同感, 是不是有这个感觉的人都不敢说出来…

  • 主 資深大佬 : skyworker

    @Rwing .net core 起一段时间看过, 不过毕竟 MS 整天虎头蛇尾, 绑定到 MS 的战略上, 很有可能当炮灰

  • 主 資深大佬 : skyworker

    @dilu 没有, 纯粹就是探讨下, 看大神们有啥意见

  • 資深大佬 : zjsxwc

    @skyworker
    找几个核心代码转 zephir 就行,没必要全部变 zephir

  • 資深大佬 : nonfu

    @ArJun 我不是转 go,是觉得微服务场景 go 更合适,在不想引入 Java 技术栈的情况下。每个语言都有其适用场景

  • 資深大佬 : JohnSmith

    找有经验的 golang 大牛带队

  • 資深大佬 : noobsheldon

    霸天虎变形就行了 /doge

  • 資深大佬 : loading

    goframe,了解一下。

  • 資深大佬 : buffzty

    我也是尝试用 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

    @buffzty 原来用 laravel 10 行代码搞定的, 用 go 的话, 估计要 100 行也不止

  • 資深大佬 : tairan2006

    你这不如转 Java,go 写 curd 没啥优势的

  • 資深大佬 : lvsemi1

    你的这些需求 go 并没有解决啊
    那既然大家都是高仿,不妨试试 goby on grails

  • 資深大佬 : ben1024

    一些 socket 服务用 go,其他业务用 PHP 一起使用不影响

  • 資深大佬 : gochat

    只想说一句:动态一时爽,重构火葬场,你说的那些优势某种意义上来说就是劣势,系统最终只会变的更糟,最终不可维护。

  • 資深大佬 : charlie21

    laravel 转 golang …

  • 資深大佬 : Rekkles

    等于是好好的现代化工厂不要,非要自己组装个小厂开始造车。

  • 主 資深大佬 : skyworker

    @tairan2006 java 的啰嗦实在恶心, 不打算用 java

  • 資深大佬 : buffzty

    @skyworker 不至于.我觉得 go 多了百分之二十代码左右 这百分之 20 都是为了 orm 获取列表 写接口写的.等泛型有了 我觉得基本没什么差距了,或者 go 的代码更少些

  • 資深大佬 : tairan2006

    @skyworker 代码量差不多…go 没有 oop/泛型,有时候抽象业务代码有点麻烦,等 go2 出来倒是可以考虑。

    直接上 Java11 的话,代码量应该比 go 还少一点。go 的优势在无痛并发上,你们用不上的话,没必要上。

  • 資深大佬 : yanzixuan

    @skyworker 我去,程序员这么不值钱么。按下按钮也不止一块吧。。。

  • 主 資深大佬 : skyworker

    @yanzixuan 一块钱是夸张的说法, 他们是按文件数量收费的. 你传一个 200 个 php 的压缩包, 人家收 200 块钱这样子. PHP 解密有专门的工具, 文件夹丢进去,就全部解密了

  • 主 資深大佬 : skyworker

    讨论到这里, 看来转 go 没啥意义了, go 的唯一的优势 和 带来的缺点比, 不算什么

  • 資深大佬 : buffzty

    为什么要转 go 啊, 哪个程序员不会几个语言啊 一起写不就行了吗

  • 資深大佬 : yc8332

    @skyworker 不是加密代码。是只提供 opcache 就能运行了,和 java 的 class 文件一下。。编译过的。

  • 資深大佬 : lepig

    先说一下。现阶段用 golang 就别用什么 orm 了,go-sql-driver/mysql 库已经足够用。 如果你用 laravel orm 的使用体验来体验 golang 呵呵

  • 資深大佬 : xcstream

    实时通信和常驻数据的可以考虑其他语言。其他 php 足够了

  • 資深大佬 : lygmqkl

    说句不太好听的, 选 laravel 就是选择了快餐化倾向,go 基本属于回到 php3/4 的时代,你们绝 B 接受不了。 在 go 上就别想那么轻松了,两个并不一样,laravel 是为了“快”,放弃了很多,go 更严谨。

    注重点并不一样,可能开发成本你们最终也无法接受。。。

  • 資深大佬 : chinvo

    request->all 直接传递给 ORM 可能导致未授权写入

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

    或者你后期增加了类似的字段但是早期代码没改全导致有的接口没能对新增字段做过滤

  • 資深大佬 : liuhan907

    @skyworker 我也觉得如果你想转,考虑.NET Core 配 EF Core 。只考虑写的爽的话我没觉得有比这个更强的。

  • 資深大佬 : bobomaster

    Swoole Compiler 加服务器授权,商派就是这么干的

  • 資深大佬 : lybcyd

    @chinvo laravel 的 model 有专门的属性来规避这个问题,可以只允许指定 field 来进行批量赋值,也可以反向设置指定 field 不能批量赋值

  • 主 資深大佬 : skyworker

    @lygmqkl 我个人认为, go 的”快”其实没什么意义, 带来的代码量膨胀才是成本.

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

    并且真的的大项目, 系统的瓶颈也在数据库这里, 而不在编程语言中.

  • 主 資深大佬 : skyworker

    就像前几年被前端封为神器, 希望插入后端工作的各种 js web 框架, 原本 js 中引以为傲的 async 功能, 当做后端语言的话, 简直就是坑, 反正我是恨不得禁用了 async

  • 主 資深大佬 : skyworker

    @chinvo 企业 ERP 系统, 各种 form 中字段多如牛毛(几十个 /上百个), 并且客户会随时提出变化,增加或减少 form 中字段(少 10 个字段 /多 20 个字段), 因为内部系统, 所以暂不考虑 hacker 攻击的问题, 先应付客户的需求变化再说.

  • 資深大佬 : chinvo

    @lybcyd #48 这个倒是知道

  • 資深大佬 : HanSonJ

    https://github.com/liexusong/php-beast 加密了解一下

  • 主 資深大佬 : skyworker

    @HanSonJ PHP 动态语言, 破解只是时间问题, 取决于想要破解你代码人准备花多少时间和成本而已

    https://segmentfault.com/a/1190000007035295

  • 主 資深大佬 : skyworker

    @bobomaster 同理, swoole 也一样 https://www.zhaoyuanma.com/article/48.html

  • 主 資深大佬 : skyworker

    @HanSonJ 这篇资料更详尽一些: https://www.anquanke.com/post/id/176767

  • 資深大佬 : liuhan907

    @skyworker 你是说 js 的 async 是坑还是 async 语义是坑?

  • 資深大佬 : nicoljiang

    心理上真的好排斥 laravel 党过早地来 go
    毕竟威力大到能把整个 PHP 生态带偏~

  • 資深大佬 : nicoljiang

    为啥不去 Java 或者 .Net 啊??
    Go 还小,不要伤害他。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具