laravel 转 golang 最佳实践是?

2020-04-14 10:40:37 +08:00
 skyworker
各位大神, 目前我司的后台系统是 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 来说, 就有点 奔驰 换 桑塔纳 的感觉了.
6965 次点击
所在节点    Go 编程语言
60 条回复
yc8332
2020-04-14 17:07:39 +08:00
@skyworker 不是加密代码。是只提供 opcache 就能运行了,和 java 的 class 文件一下。。编译过的。
lepig
2020-04-14 17:16:19 +08:00
先说一下。现阶段用 golang 就别用什么 orm 了,go-sql-driver/mysql 库已经足够用。 如果你用 laravel orm 的使用体验来体验 golang 呵呵
xcstream
2020-04-14 18:10:49 +08:00
实时通信和常驻数据的可以考虑其他语言。其他 php 足够了
lygmqkl
2020-04-14 20:08:56 +08:00
说句不太好听的, 选 laravel 就是选择了快餐化倾向,go 基本属于回到 php3/4 的时代,你们绝 B 接受不了。 在 go 上就别想那么轻松了,两个并不一样,laravel 是为了“快”,放弃了很多,go 更严谨。

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

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

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

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

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

https://segmentfault.com/a/1190000007035295
skyworker
2020-04-15 10:47:45 +08:00
skyworker
2020-04-15 10:51:48 +08:00
@HanSonJ 这篇资料更详尽一些: https://www.anquanke.com/post/id/176767
liuhan907
2020-04-15 11:24:49 +08:00
@skyworker 你是说 js 的 async 是坑还是 async 语义是坑?
nicoljiang
2020-04-15 12:23:43 +08:00
心理上真的好排斥 laravel 党过早地来 go
毕竟威力大到能把整个 PHP 生态带偏~
nicoljiang
2020-04-15 12:24:32 +08:00
为啥不去 Java 或者 .Net 啊??
Go 还小,不要伤害他。
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#的优点集合~~哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662203

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX