竹笋

首页 » 问答 » 问答 » 为什么要选择Go语言作为PHP的黄金组合
TUhjnbcbe - 2023/8/26 19:01:00

Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适用于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改。它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还可用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。对于高性能分布式系统领域而言,Go语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。GO语言是种什么样的语言GO语言是种什么样的语言?它与微服务的结合会给PHP开发带来怎么样的性能提高?PHP知识体系涉及普遍,若是想成为一名合格的PHP工程师,通往进阶之路,则须要对这些知识点都要有所了解。GO语言是一种静态强类型、编译型、并发型,并具备垃圾回收功能的编程语言。它存在的意义纯粹是为了弥补其余编程语言的痛点。如PHP结合GO后,将会对性能大大提高。它加入了并发编程,其中涉及到大数据、微服务等概念,契合了大厂在招聘中的技术要求。Go语言的特点在于使人简易使用的并行设计,可以让程序以异步的方式运行,而不须要担忧一个函数致使程序中断,所以Go语言也很是地适合网络服务。多数状况下,PHP开发者们会使用nginxWeb-server和php-fpm服务器组合运行应用程序。在执行PHP脚本期间,状态没法更改,获取一组新输入数据的惟一方法是销毁该进程并从新开始。这样使得PHP开发者们根本不用担忧内存使用状况,就算有些进程死亡也能自动建立而不影响其余进程。可是在扩展应用程序时,这会给程序开发带来极度困难,因此这也是PHP被吐槽的点之一。GO语言的扩展性巧妙的解决了PHP在扩展应用程序时的问题,在软件不断的增加过程当中,让PHP开发者更容易地进行维护和修改。GO语言建立的应用服务器,让PHP适应于复杂的任务需求,既能够接受HTTP请求,而又转发给PHP工做者,最大化的保障每一个应用程序的扩展性和多样性。PHP开发者也可使用GO语言所用拥有的数千个开源库和集成环境。

当在PHP开发中用到GO语言,不只彻底消除了错误的发生,并且将服务器总数减小了近三分之二,节省了大量工做成本和服务器成本。所以经过与Go语言等其余语言配对,建立出的PHP语言成为众多开发者选择,PHP再也不被认为缓慢的语言,将来也将继续在其中寻找更高效率的方法。

为什么选择GO语言

选择GO语言,主要是基于两方面的考虑

执行性能缩短API的响应时长,解决批量请求访问超时的问题。在Uwork的业务场景下,一次API批量请求,往往会涉及对另外接口服务的多次调用,而在之前的PHP实现模式下,要做到并行调用是非常困难的,串行处理却不能从根本上提高处理性能。而GO语言不一样,通过协程可以方便的实现API的并行处理,达到处理效率的最大化。依赖Golang的高性能HTTPServer,提升系统吞吐能力,由PHP的数百级别提升到数千里甚至过万级别。

开发效率GO语言使用起来简单、代码描述效率高、编码规范统一、上手快。通过少量的代码,即可实现框架的标准化,并以统一的规范快速构建API业务逻辑。能快速的构建各种通用组件和公共类库,进一步提升开发效率,实现特定场景下的功能量产。

很多人在学习一门新语言或开启一个新项目时,都会习惯性的是网上找一个认为合适的开源框架来开始自己的项目开发之旅。这样并没有什么不好,但是个人觉得,了解它内部的实现对我们会更有帮助。

或许大家已经注意到了,所说的MVC框架,其本质上就是对请求路径进行解析,然后根据请求路径段,路由到相应的控制器(C)上,再由控制器进一步调用数据逻辑(M),拿到数据后,渲染视图(V),返回用户。在整个过程中,核心点在于逻辑的动态调用。

不过,对API框架的实现相对于WEB页面框架的实现,会更简单,因为它并不涉及视图的渲染,只需要将数据结果以协议的方式返回给用户即可。

使用GO语言实现一套完整的MVC开发框架,是非常容易的,集成HTTPServer的同时,整个框架的核心代码不会超过行,从这里可以实际感受到GO的语言描述效率之高(如果有兴趣,可以参考Uwork开源项目seine)。

也有人说,在GO语言中,就没有框架可言,言外之意是说,引入一个重型的开源框架,必要性并不大,相反还可能把简单的东西复杂化。

在实际项目开发过程中,只有高效的开发语言还不够,要想进一步将开发效率扩大化,不断的沉淀公共基础库是必不可少的,以便将通用的基础逻辑进一步抽象和复用。

除此之外,通用组件能力是实现功能量产的根本,对开发效率会是质的提升。组件化的开发模式会帮忙我们将问题的解决能力从一个点上提升到一个面上。

以下会重点介绍几个通用组件的实现,有了它们的存在,才能真正的解放程序员的生产力。而这些强有力的公共组件在Golang中实现起来并不复杂。

同时,结合Golang的并发处理能力,相比于PHP的版本实现,执行效率也会有质的提升。这是组件能力和语言效率的完美结合。

通用列表组件用于所有可能的二维数据源(如MySQL/MongoDB/ES等等)的数据查询场景,从一个面上解决了数据查询问题。

在Uwork项目开发中,被大量使用,实现数据查询接口和页面查询列表的量产开发。它以一个JSON配置文件为中心,来实现对通用数据源的查询,并将查询结果以API或页面的形式自动返回给用户。

整个过程中几乎没有代码开发,而唯一要做的只是以一种统一的规范编写配置文件(而不是代码),真正实现了对数据查询需求的功能量产。

以上是通用列表组件的构建过程,要实现这样一个功能强大的通用组件,是不是会给人一种可望而不可及的感觉?其实并非如此,只要理清了它的整个过程,将构建思路融入Golang中,并不是一件复杂的事情。

通过Golang的并发特性,实现字段处理器的并行执行,进一步的提高了组件的执行效率。可以说,通用列表和Golang的融合,是性能和效率的完美结合。

通用表单组件主要用于对数据库的增、删、改场景。该组件在Uwork的项目开发中,也有广泛的应用,与通用列表类似,以一个JSON配置文件为中心,来完成对数据表数据的增、删、改操作。

特别是近期完成的部件级SDB管理平台,通过通用表单实现了对整个系统的数据维护,通过高度抽象化,做到了业务的无代码化生产。

以上是通用表单的完整构建过程,而对于这个一个组件的实现,我们用了不到行的GO代码,就解决了对数据表数据维护整个面上的问题。

GO语言本身支持协程并发,协程非常轻量,可以快速启动成千上万个协程工作单元。如果对协程任务的数量控制不当,最后的结果很可能适得其反,从而对外部或本身的服务造成不必要的压力。

协程池可以在一定程度上控制执行单元的数量,保证执行的安全性。而在Golang中要实现这样一个协程池,是非常简单的,只需要对channel和goroutine稍加封装,就可以完成,整个构建过程不到80行代码。

在API开发过程中,数据校验永远是必不可或缺的一个环节。如果只是简单的数据校验,几行代码也许就完成了,可是当遇上复杂的数据校验时,很可能几百行的代码量也未必能完成,特别是遇到递归类型的数据校验,那简直就是一个噩梦。

数据校验组件,可以通过一种数据模板的配置方式,使用特定的逻辑来完成通用校验,开发者只需要配置好相应的数据模板,进行简单的调用,即可完成整个校验过程。而对于这样一个通用性的数据校验组件,在GO语言中只用了不到行的代码量就完成了整个构建。

1
查看完整版本: 为什么要选择Go语言作为PHP的黄金组合