从一个PHP工程师的角度来看golang语言

 go教练   2019-06-25 14:29   115 人阅读  0 条评论

有一段时间Golang大火,出去吃个饭都能听见相关的话题,“你们公司业务里有应用Golang吗?你们招 Go语言开发吗?”等等等等。感觉时间回到了几年前,云计算正处于高潮的那段时期,逢人就有人问我“你们业务上云了吗?啊!还没有啊,太落后了吧”。

至于开发语言,好像很久没有引起这么大范围的讨论了,上一个引发全面热议的开发语言,好像还是好几年前的 Python吧。在Go之前,Python 一直是最受开发者喜爱的开发语言之一,它的直观、简单、易学、可读性强等特点让无数小白开发者投入到这里来,但这一切在Go出世之后完全得到了改变。2019年,朋友圈被各种Go语言的文章刷屏,其中更是被“再见Python,你好Go”席卷了大半个朋友圈。

 微信截图_20190625094305.png

PHP曾是一个由许多企业构建大型全栈项目的的首选语言。此外, 在过去的五年中下列框架 (Symfony,Laravel,Zend),工具 (Composer,Monolog) 和迅速成长的社区 (PHP-FIG) 帮助过诸多工程师去构建企业型应用。像Facebook,Yahoo!,Wikipedia,Wordpress,Tumblr 之类的公司在创业之初都使用过原生PHP进行开发,这些随后都促使他们走向成功。

然而,一家成功公司的发展,需要更多的工程师来支持。因此公司庞大的组织架构最好把它拆分开来。在某些时刻,这种策略会让组织架构稳定,并且每个组都能专注于自己的独立业务。

下面我们就一起来看看PHP能走多远,以及Go能解决哪些问题。

 微信截图_20190624093958.png

PHP和微服务

作为一名 PHP 工程师,你应该知道如果在一个庞大的项目中一个网络请求的初始化时间只需要30毫秒内,这样就很棒了。再加上50-100毫秒的时间交给业务去处理,这样应用的响应时间就会很可观。

直到我们打算打破我们原有的复杂项目,我们坚持为我们的服务提供相同的设置,那将会发生什么? 让我们简单的计算一下,如果服务在相同的请求期间互相交互10次,我们就需要300ms的请求时间。这将会是多么糟糕的用户体验!

虽然PHP在WEB开发方面表现出色,但它在微服务体系结构中的功能还不成熟。PHP工程师通常不熟悉诸如超时处理,健康检查,度量收集,隔壁,断路器等基本术语。他们中的大多数可以在许多其他语言框架中找到。即使存在的话,在PHP生态系统中支持它们也是非常糟糕的。

遇见Go

来自Wikipedia百科:

 微信截图_20190625094250.png

Go是由谷歌公司开发的一种编程语言,她(Go语言)不是一个有趣的20% 的项目,也不是为了实现他人无法完成的事情,她是为了解决庞大团队编码的复杂性问题应运而生的,解决了他们使用大型的功能集的语言来编写大型软件的困惑。

尽管她具有诸如容易并发和编译快速等优秀特性,但是她最主要的特性是特别的简单,便于开发。有相关的资料中显示,Go的关键字仅仅有25个,而在在php中关键字有67个。

Go语言的推出大致是在PHP语言支持命名空间的时间,也就是大约在2009年。在短短的6年时间里,已经有包括 Docker,Kubernetes,etcd,InfluxDB等数十个伟大的项目,不但如此,像Google,Dropbox, SoundCloud,Twitter,PayPal等公司都用Go语言构建了他们的后端系统。

返回微服务

让我们回过头来看一下之前讨论过的问题,我们可以从使用Go语言获得哪些有益的收获。

Go语言构建的应用可以很快的编译为机器码,许多编程人员感叹道,Go语言编译的时间非常的快,当他们切换到浏览器变点击「刷新」是,应用程序就已经重新编译了和重新启动了,并且发出了请求。即使是在构建非常大的代码库时,就像是使用一种像 PHP 这种解释型的语言的感觉。

在编写传统的API「Hello World」的时候,用十行代码,响应的时间不到1毫秒。Go语言的多核功能可以让编程人员能够运行沉重的软件。生态系统允许选择任何的传输协议,例如JSON over HTTP,gRPC,Protocol Buffers或者Thrift。请求很容易在Zipkin找到。指标从statsd导出到Prometheus。使用限速器强制进入或外出的请求吞吐量,并保护与断路器的客户服务通信。

工具

Go的设计,再一次考虑到了简单性。作者采用了相当激进的方法去解决了工程师整天的普通工作。对无穷无尽的「space-vs-tab」争论说「再见」,社群的代码标准正以某种方式简化工程师共享代码。Go自带开箱即用关注代码风格的go fmt工具。 不再需要分享IDE的配置文件, 不用尝试记住大括号应该是在同一行还是再起一行。

可以使用go doc去阅读源码包文档, 而go vet将会协助我们查找代码中的问题。 安装第三方包只需要执行go get [github.com/[vendor]/[package](http://github.com/[vendor]/[package)] 指令, 测试只需要执行go test [package] 指令。正如你所看到的,工程师在每一个程序每一个语言都用到的大多数工具都在这里开箱即用。

项目部署

无论你选择哪种语言或者你正在构建什么语言,部署项目都是强制性的操作。作为一个PHP工程师,在你的职业生涯中,你写过多少个Capistrano或者Envoy的配置文件?那一天你将多少手动更改的文件通过 FTP传输到服务器上?

这是最常见和最简单的 PHP 程序部署过程,像下面这样:

从目标服务器上面检出最新的代码放到最新版本的文件夹中

复制缓存的依赖项并安装更新

复制环境特定的配置文件

运行所有的脚本让程序准备运行起来

将当前版本符号链接指向新版本文件夹

重启PHP-FPM

有些团队会把这个部署的过程变的更高级一些,像下面这样:

从构建服务器上检出最新的代码

「构建」项目(安装依赖,运行缓存,等等)

创建一个可分发的「工件」(一个压缩的tar.gz文件)

将「工件」转移到目标服务器

解压缩到最新的发布的文件夹中

将当前版本符号链接指向新版本文件夹

重启PHP-FPM

当然,除此之外,你需要确保你的目标和构建服务器至少安装了PHP-FPM和PHP,它们之间的版本要相互匹配包括工程师用于本地开发的版本。

现在让我介绍常规的Go应用程序的部署过程:

从构建的服务器上检出最新的代码

构建项目(注意没有引号)

将工件(再次没有引号)传输到目标服务器

重启正在运行的应用

就是这样简单。简单版本和高级版本之间的唯一区别是,是否有一个独立的构建服务器。

美妙之处在于你甚至不需要在目标服务器上安装Go ,即使它们运行不同的操作系统或基于不同的CPU架构,你仍然可以从单个构建服务器或任何其他计算机为所有这些工具(甚至是Windows)准备工件。

对于初创企业来说,微服务并不是构建其项目首选。使用PHP来进行快速开发,跟上市场节奏依旧是一个明智的选择。毕竟生存是宇宙第一要义。

当一家企业已经稳定发展,并且在可预见的未来没有大的威胁,此时使用PHP构建微服务将会是一件非常痛苦的事情。这个时候你完全可以使用其他合适的语言来构建微服务。

另一方面,易于编写和理解的Go语言是用来构建微服务的不错选择,它的学习曲线并没有Java/Scala那么陡峭,同时其性能与C相接近。高效的编译系统,高并发的支持使得使用Go来编写强大的应用程序成为可能。

以上就是今天给大家介绍的从一个PHP工程师的角度来看golang语言,如果你还想了解更多关于golang语言的知识技巧,可以持续关注我们http://www.fastgolang.com

本文地址:http://fastgolang.com/84.html
版权声明:本文为原创文章,版权归 go教练 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?