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

从PHP迁移至Golang-基础篇

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

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程序。其抽象模型大致如下:

从PHP迁移至Golang - 基础篇

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 我们


推荐阅读
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • centos6.8 下nginx1.10 安装 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
author-avatar
手机用户2502858127
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有