Golang Go语言中 Laravel 转 Golang 的最佳实践是?

发布于 1周前 作者 itying888 来自 Go语言

Golang Go语言中 Laravel 转 Golang 的最佳实践是?
各位大神, 目前我司的后台系统是 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 来说, 就有点 奔驰 换 桑塔纳 的感觉了.


更多关于Golang Go语言中 Laravel 转 Golang 的最佳实践是?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

61 回复

如非必要,就不要换

更多关于Golang Go语言中 Laravel 转 Golang 的最佳实践是?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


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

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

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

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

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

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

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

“net/http”

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

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

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

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

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

不要为了转而转

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

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

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

题外话,考虑一下 c#

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

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

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


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

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

找有经验的 golang 大牛带队

霸天虎变形就行了 /doge

goframe,了解一下。

我也是尝试用 go 写 api. 总体来说,没有泛型很难受. 其他的还好.
安全性变高,灵活度变低,复杂度变高
1:
go<br>d := &amp;AddUserData{}<br> if err := c.ShouldBindJSON(d); err != nil {<br> app.ValidError(err)<br> return<br>}<br>user := &amp;models.User{<br> Account: d.Account,<br> Gender: d.Gender,<br> Name: <a target="_blank" href="http://d.Name" rel="nofollow noopener">d.Name</a>,<br> Age: d.Age,<br> Level: d.Level,<br>}<br>if err := models.Add(user); err != nil {<br> app.ErrorMsg(err.Error())<br> return<br>}<br>app.Success()<br>
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})

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

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

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

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

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

laravel 转 golang …

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#48 这个倒是知道

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

https://segmentfault.com/a/1190000007035295

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

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

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

我也是从 php 转向 的 golang,第一次先学习了 gin 、beego 之类的,觉得 go 本身不需要使用框架,本身已经足够强大了。所以开始学习 grpc 和 protobuf,搞了一个 http://chat.osinger.com 的项目, 然后一个月内开发了一个 go-sword 后台管理界面系统生成工具,https://sunshinev.github.io/go-sword-home 。目前觉得 go 满足了之前对 java 、php 、c#的优点集合~~哈哈

关于Laravel转Golang的最佳实践,以下是一些专业建议:

  1. 项目评估与规划

    • 评估现有Laravel项目的复杂度,确定迁移的优先级。
    • 规划迁移路径,分阶段实施,确保平滑过渡。
  2. 技术选型与准备

    • 选择合适的Golang框架和库,如Gin、Echo等,以简化开发。
    • 准备开发环境,安装Go语言和必要的工具链。
  3. 数据库交互与ORM

    • 使用Go的标准库或第三方ORM库(如GORM)与数据库进行交互。
    • 确保数据库迁移脚本兼容Go语言。
  4. 模板引擎与视图层

    • 将Laravel中的Blade模板转换为Go支持的模板引擎(如html/template)。
    • 考虑使用开源工具或自行编写转换脚本。
  5. API接口与微服务

    • 利用Golang的高效并发性能,构建微服务架构。
    • 使用net/http或第三方库(如Gin)处理HTTP请求和响应。
  6. 测试与部署

    • 编写单元测试和集成测试,确保代码质量。
    • 利用Docker等容器化技术简化部署过程。
  7. 性能优化与监控

    • 对Golang应用进行性能调优,提高运行效率。
    • 实施监控策略,及时发现并解决问题。

综上所述,Laravel转Golang的最佳实践需要综合考虑项目需求、技术选型、数据库交互、模板引擎、API接口、测试部署以及性能优化等多个方面。

回到顶部