GMTC全球大前端技术大会限时9折特惠中,点击立减¥480 了解详情
写点什么

Bowery 为什么从 Node.js 转向 Go

2015 年 2 月 05 日

随着业务的发展、性能的挑战、需求的变更以及技术的更新,一个应用从某一个技术栈转向另一个技术栈是很正常和合理的,如淘宝从 PHP 转向 Java、 Twitter 从 Ruby 转向 Java/Scala Linkin 从 Ruby 转向 Node.js Groupon 从 Ruby 转向 Node.js Dropbox 从 Python 转向 Go 等。Go 语言从一面世就受到了很多开发者的关注,它能够提高开发人员的编程效率,它的并行机制使得开发者能够非常容易地编写多核和网络应用,开发人员利用它的类型系统能够很容易地构建出富有灵活性和扩展性的模块化程序。现在,越来越多的项目基于 Go 语言实现,如著名的开源容器 Docker 、PaaS 平台 Deis 、Google 的云计算平台 Kubernetes 以及国内的七牛云存储产品等。 Bowery 是一个基于云技术的开发平台,其在 2014 年进行了一次从 Node.js 到 Go 的转换,且这次技术栈的变更加快了开发和部署的速度。近日,Bowery 对这次技术栈转换进行了总结,并归纳出了他们认为 Go 优于 Node.js 的一些原因。现对这些原因进行一个全面整理以供读者参考和学习,具体内容如下:

  1. 强大的跨平台编程能力
    Go 具有很强的跨平台性,基于 Go 的程序能够在不同系统 (Linux、Windows、OSX 等) 中编译,所以在开发过程中,借助 Go 能够轻松实现跨平台编译,而开发者只需设置不同的环境变量,这样就大大提高了开发效率。
  2. 快速部署
    Go 属于编译语言且具有跨平台性,从而使得 Go 开发的分布式应用能够运行在不同的平台上。在 Go 平台中,从测试环境到正式环境的切换无需额外的系统依赖,从而能够实现快速的部署。
  3. 并发原语的支持
    Node.js 没有提供较多的并发原语,仅有 I/O 程序或计时器运行在并发模式,所以 Node.js 在并发处理方面处于劣势,且很难构建出快速响应的跨程序通讯系统。而 Go 提供了语言级别的并发特性 goroutine、基于通道(channel)的通信机制和更底层的并发处理基元,如 mutexes wait groups 等,Go 显得更加适合于构建高并发的应用。
  4. 标准化的集成测试框架
    用于 Node.js 的测试框架有很多,有些适用于前端测试,有些适用于后端测试,但多是第三方的测试框架,如 Jasmine Mocha JSUnit PhantomJS 等。而 Go 提供了内建的完整测试包,如果开发者想编写一个新的测试套件,只需把 _test.go 文件添加到相同的包里即可。有关 Go 测试的更多相关信息,请读者点击这里查看,此外,Go 还提供了使用 httptest 包进行测试的文档
  5. 标准库
    如果使用 Node.js 开发一个应用,开发者不得不引入额外的依赖扩展库, 从而增加了应用的部署时间和不稳定性。然而 Go 提供了标准库,标准库的好处是无需包含其他扩展库即可实现一个应用的开发,从而节省应用的开发、部署的时间,并且还能够增强应用的健壮性。
  6. 强大的开发者工作流工具
    除了使用 NPM 和脚本控制外,Node.js 没有提供真正、标准的工作流工具。而 Go 所提供的工作区布局能够帮助开发者建立标准化的工作流、规范应用的开发。尽管使用标准的工作区布局会损失开发的灵活性,却获得了一个结构化、有条理的工作区,该工作区包括三个根目录:src 用于放置源码包,pkg 用于放置编译包,bin 用于放置的是执行文件。把源码和依赖文件集中放到一个单一的工作空间是一个最佳的实践,这样使的团队成员都有一个标准的文档结构。此外,gofmt 也是一个非常使用的工具,它能以相同格式对代码进行格式化。

以上这些原因是 Bowery 根据自己的实际经历而得出,另外,还有其他公司 / 团队觉得 Go 值得喜欢的一些原因,如 MongoDB 的项目管理团队喜欢 Go 的智能、统一的开发体验,音乐分享服务 Soundcloud 团队喜欢 Go 严格的代码格式规则以及单一方式实现功能的理念。总之这些特征能够节省针对代码规范和格式审查所花费的时间,从而使得开发者能够集中精力来解决关键的问题以提高工作效率。

最后作者为 Go 语言开发者提出了几点建议,如经常访问官方博客官方学习文档、访问Bill Kennedy 的 Go 编程博客等。

此外,关于 Go 和 Node.js 的选择,Node.js 社区最活跃和高产的成员之一 TJ Fontaine 在个人博客中公布了自己放弃 Node.js 而转向 Go 的原因,主要是因为Go 更适合高并发和分布式应用开发;最高产的Node.js 开发者之一 Duncan Smith 在个人博客中列举出了自己为什么不从Node.js 转向Go 的原因,有兴趣的读者可以前去阅读。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2015 年 2 月 05 日 10:429551
用户头像

发布了 46 篇内容, 共 47.4 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

Java程序员必会的三个技能:Spring+MySQL+并发编程

Java架构师迁哥

架构师训练营第 1 期第 6 周作业

好吃不贵

极客大学架构师训练营

三分钟带你分清Mysql 和Oracle之间的误区

华为云开发者社区

MySQL 数据库 oracle 安全 关系型数据库

阿里内部首发Spring Cloud全套微服务架构笔记,速拿去怼面试官!

Java架构追梦

Java 编程 面试 微服务 SpringCloud

使用抓包工具fiddler和apipost进行接口测试

测试人生路

测试工具 fiddler

软考资料学习库

玄兴梦影

jdk 源码系列之HashMap

sinsy

源码 jdk HashMap底层原理

CAP 原理

黄立

CAP

牛皮了!字节面试官爆肝七天七夜总结了一份算法面试笔记

互联网架构师小马

Java 程序员 字节跳动 面试 算法

玩转华为云开发|老板万万没想到:刚入职的我一人就搞定人脸识别开发

华为云开发者社区

软件开发 模块化流程 人脸识别 API 华为云

架构师训练营第 2 周课后练习

菜青虫

极客大学架构师训练营

写时复制集合 —— CopyOnWriteArrayList

程序员小航

Java 源码 并发 源码阅读 JUC

最实用的无线PORTAL测试案例

测试 无线网络 网络

架构师训练营第六周作业

我是谁

极客大学架构师训练营

成为架构师 - 架构师训练营第 02 周

陈永龙Vincent

Mysql中,这21个写SQL的好习惯,你值得拥有呀

捡田螺的小男孩

MySQL sql SQL优化 sql习惯

牛皮!GitHub上标星90.6K的Java面试指南+笔记

互联网架构师小马

Java GitHub 学习 程序员 面试

一整套Java线上故障排查技巧,爱了!爱了!

互联网架构师小马

二、ood原则

Geek_28b526

深入浅出System.gc() 源码解读

AI乔治

Java 架构

架构师训练营第 1 期第 6 周作业

du tiezheng

极客大学架构师训练营

架构训练营-week6-作业

于成龙

CAP 架构训练营

作业一:

丁乐洪

架构师训练营第 1 期第 6 周学习总结

好吃不贵

极客大学架构师训练营

十八般武艺玩转GaussDB(DWS)性能调优(二):坏味道SQL识别

华为云开发者社区

数据库 sql 性能调优 GaussDB 算子

钻石与小度:智能语音助手背后的“马斯洛需求模型”

脑极体

从一个HTTP请求来读懂HTTP、TCP协议

互联网架构师小马

架构训练营第二周学习小结

李日盛

架构训练营-week6-学习总结-技术选型(二)

于成龙

架构训练营

架构师训练营第 2 周学习总结

菜青虫

极客大学架构师训练营

架构师训练营第 1 期 week6 总结

张建亮

极客大学架构师训练营

Bowery为什么从Node.js转向 Go-InfoQ