热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从PHP迁移至Golang基础篇

从PHP迁移至Golang-基础篇,Go语言社区,Golang程序员人脉社



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...





推荐阅读
  • 构建LNMP架构平台
    LNMP架构的组成:Linux、Nginx、MySQL、PHP关于NginxNginx与apache的作用一样,都是为了搭建网站服务器,由俄罗斯人lgorsysoev开发,其特点是 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • nginx+多个tomcat
    学习nginx的时候遇到的问题:nginx怎么部署两台tomcat?upstream在网上找的资源,我在nginx配置文件(nginx.conf)中添加了两个server。结果只显 ... [详细]
  • ZABBIX 3.0 配置监控NGINX性能【OK】
    1.在agent端查看配置:nginx-V查看编辑时是否加入状态监控模块:--with-http_stub_status_module--with-http_gzip_stat ... [详细]
  • nginx 反向代理proxy参数讲解
    ![](http:i2.51cto.comimagesblog20180805c32a728954d93ee2a4e4fb59c150a15b.png?x-oss-processi ... [详细]
  • GO语言 包 if..else.. for循环 switch 数组
    包1.什么是包1.新建一个文件夹,内部写很多go文件,但是包名必须一致,改文件夹就是一个包2.作用和优点包用于组织Go源代码,提供了更好的可重用性与可读性。由于包提供了代码的封装, ... [详细]
  • 语法必须遵守的语法推荐遵守语法不做要求文件格式文件应该使用Unicode(UTF-8)编码保存。同时不要使用字节序标记(BOM)。与UTF-16和 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • centos6.8 下nginx1.10 安装 ... [详细]
  • Linux一键安装web环境全攻略
    摘自阿里云服务器官网,此处一键安装包下载:点此下载安装须知1、此安装包可在阿里云所有Linux系统上部署安装,此安装包包含的软件及版本为& ... [详细]
author-avatar
豪哥帅366
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有