Laravel 如何将部分 api 一步步使用 golang 进行重构

2019-04-28 13:44:19 +08:00
 zjtsunshine

目前状况: 1 )有 2 台 8 核 16G 服务器,tps1000 多。

2 )使用 nginx+php-fpm+laravel。

3 ) php-fpm 进程占有的 cpu 较高,经常飙到 80%以上。

目前想一步步地将 laravel 上的 api 接口,逐步使用 golang 重构,并部署到生产环境,但又不影响生产环境功能的正常使用。比如今天先把某个使用频率较高的 api,重构成 golang,部署上去;明天再部署新的 api,一步步操作。

1 )如果使用 Laravel-Swoole 测试了下并发性能确实提到了几十倍,但是有很多坑,怕部署到生产环境出问题。。。

2 )若使用 golang 重构,是要在 nginx 中配置,当请求某个 api 的时候,给他转发到 go 服务器吗?有没有具体的教程,在网上没有找到了的解决方法,有没有大神求助下

7635 次点击
所在节点    程序员
76 条回复
liqihang
2019-04-28 13:47:39 +08:00
或者 golang 做服务通过 RPC 串起来呢
alpha2016
2019-04-28 14:00:55 +08:00
尝试用 swoole 来替换 nginx 的分发呢,可以在某台机器上小规模测试一下,效果不错的话全站引入。
zjtsunshine
2019-04-28 14:02:15 +08:00
@liqihang 使用 laravel,php-fpm,就只返回个“ hello world ”,单机最多也就几百并发,cpu 就 80%多,所以通过 RPC 恐怕不行,资源消耗,主要集中在 laravel 的环境初始化中了
zjtsunshine
2019-04-28 14:04:30 +08:00
@alpha2016 使用 laravel-swoole 有一些坑,session 混乱,上传,下载 excel 等都会有点问题,可能还有很多其他没有发现的问题,不敢部署到生产环境
freefcw
2019-04-28 14:08:03 +08:00
并不一定需要重构,或者全部重构,先找到热点在哪里吧,这么高 cpu,肯定某些接口造成的


@zjtsunshine 对于某些 swoole 不影响的可以直接切换 swoole,对于 swoole 可能会影响到的,就继续用 fpm,这都是解决方案
oneonesv
2019-04-28 14:08:50 +08:00
用 golang 也会遇到新的问题并且还要重写,何不把现有代码兼容 swoole 呢
zjtsunshine
2019-04-28 14:10:35 +08:00
@freefcw 多谢知道~~
alpha2016
2019-04-28 14:10:44 +08:00
@zjtsunshine session 是个问题,不过一般来说引入个新语言不是优先的方案
zjtsunshine
2019-04-28 14:11:25 +08:00
@oneonesv 嗯嗯,我们试一试 swoole 兼容
zjtsunshine
2019-04-28 14:13:23 +08:00
@oneonesv 你有将 laravel-swoole 部署到生产环境中吗?总感觉有点虚
Kilerd
2019-04-28 14:16:03 +08:00
拆成小服务,然后用灰度发布的方式来逐步迁移过去就行了。
sunmonster
2019-04-28 14:19:04 +08:00
@zjtsunshine 用 Go 重构吧,重构之后回过头来看你会发现其实有其他更好的方案
webluoye
2019-04-28 14:19:35 +08:00
可以 nginx 指定路由,反向代理到后端的 go 服务
oneonesv
2019-04-28 14:21:23 +08:00
@zjtsunshine 我们前公司再用 量也不小 没啥问题
zjsxwc
2019-04-28 14:22:05 +08:00
把要 替换部分匹配的 api 通过 nginx 转发到你 golang 服务器里
blless
2019-04-28 14:22:05 +08:00
用 go 做转发效率也还可以,先写一个转发层,然后重写后的业务不转发 自己处理,随着版本更新可以慢慢把旧业务全部覆盖掉
xioxu
2019-04-28 14:23:27 +08:00
nginx 中配置特定 location 进行反向代理, 例如^~ /api/users 意思是以 /api/users 开头的所有 http 请求, 直接 proxy_pass 到 golang 的 http 地址即可。
当然这也要看你们 api 的认证方式了, 如果是较规范的认证方式的话这样没有问题, 否则如果是使用 session 认证的话就需要做些额外工作了。
m939594960
2019-04-28 14:24:10 +08:00
用 openresty 做转发的逻辑,逐渐用 golang 编写的部分接口替换 laravel 的接口,等到 lravel 彻底没流量后直接干掉 laravel
zjtsunshine
2019-04-28 14:39:12 +08:00
回复好快,各位多谢多谢指导~~
robot1
2019-04-28 15:45:50 +08:00
可以参考知乎的 golang 重构方案,漫长稳妥的方案

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

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

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

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

© 2021 V2EX