作者:Peter Wayner是IT杂志《InfoWorld》的特约编辑。
LAMP拥趸们可要留意了:MEAN(MongoDB、Express、Angular和Node.js)的灵活性和简易性不可等闲视之。
许多技术无法从最前沿的新颖事物变成讲究实效的中流砥柱。昨日早熟的后起之秀常常无法兑现它们的版本0.1许下的承诺。对于组成MEAN这个热门架构的几项技术来说,却不是这样。
仅仅几年前,MongoDB、Express.js、AngularJS和Node.js各自还备受怀疑。现在它们已发展壮大,并抱团取暖,一起处理正儿八经的工作,从庞大LAMP阵营挖走了为数不少的开发人员。但是这套最近流行的MEAN架构与LAMP相比到底如何?何时选择久经考验的、成熟的LAMP,而不是选择这一批以JavaScript为中心的新锐技术来得更明智?
答案就是,MEAN的简洁性和通用结构让你的日子过得更轻松。MongoDB提供了一个更灵活、更适应的层来存储数据。Node.js为运行服务器提供了更好的环境,而Express有助于使构建网站的方式实现标准化。在客户端,Angular为添加交互式功能和AJAX驱动的丰富组件提供了一种整洁的方法。这四项技术组合起来,就形成了一种整洁的、协调的机制,以便数据在用户与磁盘集群之间来回传送。
然而,真正的解释来得更深入。我们在这里列出了你的下一个项目试用MEAN的九个理由。不是每个人都有时间或预算摈弃旧的架构,使用最新框架重新编写代码,你也不应该丢弃像Apache、MySQL或PHP这些运行起来非常可靠的、久经考验的工具。不过如果是有望得益于灵活性、简单性和高性能的全新项目,选用MEAN可能会带来意料不到的良好效果。
MongoDB是为云而生的
如果你的Web应用程序计划包括兑现云计算CPU资源费用低廉的承诺,MEAN架构在MongoDB中提供了引人入胜的数据库层。这个现代数据库配备自动分片和全面集群支持功能,即开即用。添加MongoDB,它就可以分布到服务器集群上,提供故障切换支持和自动复制。考虑到在云端易于开发、测试和托管应用程序,没有什么理由不考虑MongoDB用于下一个项目。
MySQL的结构有限制性
凡是曾经开发过或维护过基于LAMP的应用程序的人都知道,MySQL作为一种关系数据库的强项有时候让人觉得受到一点束缚。与所有关系数据库一样,MySQL强迫你将数据推送到表中。如果每一个数据项符合一模一样的格式,那倒不是问题,但实际情况哪有这么理想?如果两个人共享同一个地址,但不共享同一个帐户,怎么办?如果你想让地址是三行而不是两行,怎么办?谁没有试图通过将太多的数据硬塞入到单单一个列来修复关系数据库?否则你最后添加另一列,表变得不受控制。
另一方面,MongoDB提供了一种灵活得多的文档结构。想要为你的用户简介添加一点新的个人信息?只要将字段添加到你的表单,将它与JSON文档中的其余数据结合起来,然后塞入到你的MongoDB集合。这适合不断变化之中的项目,适合处理结果证明最终用表的形式来限制很棘手的数据。
磁盘空间很便宜
关系数据库的强大功能之一是JOIN命令。借助JOIN,我们可以通过删除城市、州和邮政编码之类的重复字段来节省磁盘空间。如果将这些频繁访问的重复数据存储在可借助JOIN包含在未来结果中的单独表中,我们可以保持数据库整洁、保持磁盘精简。
但是JOIN对一些人来说可能很棘手,在内存上很难实现;虽然通过JOIN隔离和访问不同表中的数据仍是个好主意,但由于磁盘驱动器的容量达到TB级,现在不太需要节省磁盘空间了。空间如此便宜,以至于一些数据库设计师最终对数据实现非规范化(denormalizing),因为JOIN速度太慢了。一旦你这么做,就不大需要关系数据库了。何不改而使用MongoDB?
Node.js简化服务器层
浏览LAMP架构的各个层可能让人眼花缭乱,你不停地穿梭于语法不一的各种配置文件。MEAN通过使用Node.js简化了这一步。
想要改变应用程序为请求安排路线的方式?加入一点JavaScript,余下的交给Node.js去做。想要改变用于回答查询的逻辑?同样可以使用JavaScript。如果你想重写URL或构造一个奇怪的映射,同样可以使用JavaScript。MEAN架构依赖Node.js将这种管道(pipework)全部放在一个地方,全部采用一种语言,全部采用一套逻辑。你不需要重新阅读PHP、Apache以及添加到架构的其他任何技术的参考手册页。虽然LAMP这一代为一切内容使用不同的配置文件,但Node.js完全避免了这个问题。把一切都放在一层意味着减少了混乱,减小了多个层之间的奇特交互引起奇怪错误的机会。
MEAN使代码具有同构性
简易性并不仅限于服务器端使用JavaScript。如果选择MEAN,你还可以在客户端上享受这同样的JavaScript,摆脱LAMP架构的客户端/服务器分裂现象。如果你为Node编写代码,觉得代码放在Angular中来得更好,可以轻松将代码移过去,几乎肯定会一样运行。这种灵活性使得编写基于MEAN的应用程序容易得多。另外,如果你在为一个项目配备人手,不需要寻找PHP专家和JavaScript专家,也不需要寻找前端专家和后端专家。相反,整个架构都是JavaScript。
JSON无处不在
Angular和MongoDB都说JSON这门语言,Node.js和Express也是如此。数据在所有层之间顺畅地流动,无需重新编写或重新格式化。MySQL有自己的一套回答查询的原生格式。是的,PHP已经有代码来导入MySQL数据,并易于用PHP来处理,但这并不有助于客户层。这对于经验丰富的LAMP资深用户来说可能不是大问题,因为有好多充分测试的库可以轻松转换数据,但这显得有点低效和混淆。MEAN为各个地方的数据使用同样的JSON格式,因而数据流经每一层传输时,显得更简单,并节省重新格式化的时间。此外,JSON在整个MEAN架构中很普遍;这样一来,处理外部API容易多了:GET、操纵、呈现、POST以及用一种格式存储所有数据。
Node.js速度超快
Apache很棒,但这些年,Node.js常常绝对更快。许多基准测试表明,Node.js提供更好的性能(http://www.hostingadvice.com/blog/comparing-node-js-vs-php-performance/),同时完成的任务多得多。也许代码较新颖,也许Node.js事件驱动架构来得更快,那没关系。如今,尤其在缺乏耐心的移动设备用户当中,你那个应用程序的性能哪怕缩短几毫秒也很重要,Node.js就能做到这一点,同时提供一种图灵完整(Turing-complete)的机制为它重新编程。
深度很重要
PHP爱好者喜欢坚持使用为像WordPress或Drupal这些主要平台构建的优秀代码库。这些代码库有充足的理由引以为豪,不过随着Node.js后来居上,它们的优势在消失殆尽。
Node.js软件包管理器NPM使得用户共享代码来得更容易,面向Node.js的公共存储库正在迅速发展壮大。虽然PHP阵营眼下可能领先,但未来对Node.js有利。此外,在不断变化的趋势面前,事实常常证明传统技术很脆弱。每个人试图用新版本来更新改造像Drupal这样的传统平台,这意味着更多的开发人员可能会将目光投向围绕Node.js而构建的更新颖、更灵活的平台。
Angular很新颖
将“MEAN”中的“A”与LAMP架构中的任何技术进行比较其实有失公允,因为LAMP不包括对应的技术。如果你想在客户端上做事情,你全靠自己。当然,有很多优秀的基于PHP的框架可与MySQL协同运行,但每个框架略有不同,往各自的方向前进。比如说,WordPress、Joomla和Drupal提供了不同的策略,很难在它们之间切换,更不用说将代码从一种框架移植到另一种。选择单一客户框架增强了一致性和稳定性。
Angular是由构建Web应用程序方面有着20年经验的一群人开发的,这也大有助益。他们明白得很,将设计工作留给HTML和CSS。他们还想出了如何添加一点JavaScript来扫描HTML。Angular的设计人员分析了人类擅长处理什么任务,然后定制JavaScript以支持人类。模板系统和逻辑层比我们以前见过的要整洁得多,一方面是由于该团队想出了更简单的方法,充分利用JavaScript的本地功能来猜测你在做什么。
走混搭道路
当然了,就算你确实很挑剔,也没有理由不能将这两种架构混搭一点。许多开发人员结合使用MongoDB与Apache和PHP,另一些开发人员偏爱结合使用MySQL与Node.js。Angular可与任何服务器相当顺畅地协同运行,甚至是运行PHP、通过MySQL提供数据的服务器。你没必要死守某一个术语不放!
相关阅读:
Kubernetes取代Linux、Apache;Go取代Python;Etcd或取代MySQL
2017年软件行业现状及展望:软件在取代硬件;所有公司在变成软件公司