资讯专栏INFORMATION COLUMN

从PHP迁移至Golang - 基础篇

Kerr1Gan / 2060人阅读

摘要:但是,随着微服务架构的兴起以及容器时代的到来,这种情况又再次加剧。最重要的是,在微服务与容器领域有很好的基础,后期系统可完美实现微服务化与容器化。

1、Why Not PHP

使用PHP构建的WEB程序,随着业务发展到一定体量之后,都不得不面临以下一些问题:

业务功能不断扩张,如何避免某单一业务功能故障影响整体,维持系统健壮性

业务逻辑复杂度不断上升,如何解耦与模块化,降低系统复杂性

网站访问量不断攀升,如何实现高并发,实现系统高可用性

计算密集型业务的出现,如何快速适应需求,提升网站性能

...

对于PHP而言,在业务发展初期,可以快速实现业务原型,满足需求,但是在发展的中后期就显得略有点后劲不足。
因为PHP在高并发、多进程/线程以及密集计算领域并不擅长。这种情况在swoole出现之后得到了很大的缓和。
但是,随着微服务架构的兴起以及容器时代的到来,这种情况又再次加剧。因为PHP大都需要借助Nginx和PHP-FPM或类似软件来进行进程管理,这对于部署的微服务意味着部署PHP项目代码的同时必须同时包括PHP-FPM和Nginx,这除了增加资源成本也降低了效率。

2、Why Golang

那么,为什么是Golang呢?

首先,Golang与PHP很像,都是类C语言,可以很好的进行『知识迁移』

其次,Golang在性能和开发效率上有很好的平衡,语法简单,语言层面上支持并发编程,且基础库健全,部署容易。

最重要的是,Golang在微服务与容器领域有很好的基础,后期系统可完美实现微服务化与容器化。

当然了,即便如此,PHP还是世界上最好的语言。

3、How To

做好了思想上的准备之后,就可以开始确立技术方案了。
任何大型系统的重构都不可能是一蹴而就,顷刻之间发生的,需要一个循序渐进的过程。并且,在此重构过程中,大前提必须保持现有系统的所有业务照常运行,所以需要确立的是一个对系统基本无损的分模块逐步替换的方案。
回归到我们当前的系统架构:每台服务器上均部署相同的PHP项目代码,统一由PHP-FPM解释执行,并通过Nginx进行反向代理。
在梳理了系统各功能模块业务职责之后,我们决定先将数据模块试水:使用Golang进行改造,理由是数据模块功能较为简单,Golang只需计算逻辑然后向前端页面提供数据接口即可。同时借助Nginx的反向代理功能,将数据接口前缀的转发至Golang程序,其他所有请求还是依旧转发至原来的PHP-FPM程序。其抽象模型大致如下:

4、About Hot-Update

所谓热更新,是指在系统升级或修复bug过程中对用户来说是无感知的。
使用PHP开发时,开发者无需关心热更新,因为PHP是解释型的编程语言,PHP-FPM会根据最新的请求实时去调用执行具体某个PHP文件;而Golang则不同,它是编译型语言,在运行时会把Golang文件加载到内存,这时,所有对代码的改动想要更新必须要重启服务才能生效。那么如何在重启服务过程中,不影响当前用户请求,便是热更新需要解决的问题。
目前Golang热更新大致有两个思路:Plugin包(Golang1.8+,原理类似C++动态链接库方式)和第三方热更新库(如)Facebook开源的grace库以及endless库等。
关于第三方热更新库逻辑大致为:

发布变更的项目代码文件

发送变更通知给服务进程(信号方式,通常是USR2信号)

服务进程收到通知后,调用 fork/exec 启动最新项目代码(新进程)

子进程调用会从父进程继承 socket 文件描述符来重新监听 socket(此时父子进程同时Accept连接)

原有父进程不再接收新请求,待正在处理中的请求处理完后,进程自动退出(gracefully shutdown)

子进程托管给init进程

总结

以上大致接介绍了从PHP项目迁移到Golang所需的一些思想与技术上的准备,后续篇章将介绍具体技术方案与实现细节。

References

http://mikespook.com/2012/08/...
https://github.com/facebookgo...
https://github.com/fvbock/end...
https://fitstar.github.io/fal...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29651.html

相关文章

  • PHP迁移Golang - 热更新

    摘要:上篇大致提到的的热更新,本篇将详细论述。软件的热更新就是指在保持系统正常运行的情况下对系统进行更新升级。同样地,热更新也可以采取类似的处理。注包方式的热更新本文暂不讨论。 上篇大致提到的Golang的热更新,本篇将详细论述。 1、什么是热更新 网络上有这么一个例子来形容热更新,我觉得很形象很贴切: 一架行驶在高速上的大卡车,行驶过程中突然遭遇爆胎,热更新则是要求在不停车的情况下将车胎修...

    i_garfileo 评论0 收藏0
  • Python 开发者在迁移到 Go(lang) 时需要知道哪些事?

    摘要:如果你只对开发者需要了解的事感兴趣,请下拉到早该知道的事板块。在不泄露机密的情况下,利用支持向量机来获取一个句子最可能的意思,并且以此来推断句子的情感。也就是说,如果一个文档包含个词,就会与支持向量机进行多次对比。 【编者按】本文最早由 Repustate 发布,主要介绍将代码迁移至 Go(lang) 时的注意事项。文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文。 ...

    hqman 评论0 收藏0
  • 途牛原创|途牛周刊

    摘要:的本质是团队博客,关注互联网创业技术,每周推荐篇优质文章。坚持争取做到每周更新,与读者一起进步。第十一期第十期第九期第八期第七期第六期第五期第四期第三期切换至,第二期发布。创刊,用发布了第一次。 Tuniu Weekly Inspired By 《湾区日报》 我们团队也想基于这种模式,让大家感受到技术的人文。 《Tuniu Weekly》就这样产生了。 《Tuniu Weekly》...

    ThreeWords 评论0 收藏0
  • laravel中使用WangEditor及多图上传

    摘要:多图上传修改里面的方法将封面修改为封面创建图片修改器修改器使用说明,请阅读相关说明文档在里增加和两个方法显示效果原文地址地址 laravel中使用WangEditor及多图上传 1. 创建项目及安装所需安装包 1.1 创建项目 composer create-project laravel/laravel=5.3 blog_wangeditor --prefer-dist 1.2 创建...

    FingerLiu 评论0 收藏0
  • laravel中使用WangEditor及多图上传

    摘要:多图上传修改里面的方法将封面修改为封面创建图片修改器修改器使用说明,请阅读相关说明文档在里增加和两个方法显示效果原文地址地址 laravel中使用WangEditor及多图上传 1. 创建项目及安装所需安装包 1.1 创建项目 composer create-project laravel/laravel=5.3 blog_wangeditor --prefer-dist 1.2 创建...

    qianfeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<