写点什么

Bowery 为什么从 Node.js 转向 Go

  • 2015 年 2 月 05 日
  • 本文字数:1810 字

    阅读完需:约 6 分钟

随着业务的发展、性能的挑战、需求的变更以及技术的更新,一个应用从某一个技术栈转向另一个技术栈是很正常和合理的,如淘宝从 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:429608
用户头像

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

关注

评论

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

拍乐云解析融合语音通话技术实践

拍乐云Pano

音视频 RTC 拍乐云 技术干货 融合语音通话

如何使用Kubernetes里的NetworkPolicy

Jerry Wang

Kubernetes k8s 28天写作 docker build 12月日更

大型软件交付项目注意事项53条

IT民工大叔

项目管理 SaaS

实战大数据,HBase 性能调优指南

编程江湖

HBase

探索 Design Token

凹凸实验室

前端 设计

在线JSON转MySQL建表语句工具

入门小站

工具

观点 | NoSQL 产品的 SaaS 化之路

RadonDB开源社区

数据库 nosql NoSQL 数据库

智汇华云 | ArSDN给VMware带来了什么

华云数据

智汇华云 | 使用Kubeadm进行Kubernetes集群版本升级

华云数据

计划被打乱怎么办?

Tiger

28天写作

【转】前端开发之React Native SDK 升级问题

飞不起来的童年

前端 React Native

SphereEx 亮相 openGauss Summit 2021,同云和恩墨签订战略合作协议

SphereEx

开源 ShardingSphere SphereEx 云和恩墨 战略合作

netty系列之:好马配好鞍,为channel选择配套的selector

程序那些事

Java Netty 程序那些事 12月日更

中国联通、欧莱雅和钉钉都在争相打造的秘密武器?虚拟IP未来还有怎样的可能

行者AI

人工智能 虚拟

Linux之find常用命令汇总

入门小站

Java序列化与反序列化

编程江湖

给弟弟的信第27封|学会说不,别让面子害了你

大菠萝

28天写作

行业分析| 实时音视频的未来

anyRTC开发者

音视频 WebRTC 实时通信 语音通话 视频通话

带你详细了解 Node.js 中的事件循环

编程江湖

前端开发 node,js

用户文章转载:P4 Rmdir 会自动删除空目录?不,没那么简单

龙智—DevOps解决方案

perforce P4 P4 Rmdir

直播预告|智能运维管理平台OMP核心特性及落地场景介绍

云智慧AIOps社区

DevOps 运维 AIOPS 智能运维 运维管理

科技令生活“焕然一新”|年末清洁黑科技:美菱洗地机!

联营汇聚

美菱洗地机

带你了解家居智能的心脏:物联网关

华为云开发者社区

物联网 智能家居 物联网关 智能网关 家庭网络

走访数年,编撰3年:你能看到的互联网企业案例最多的一本书

博文视点Broadview

盘点 2021|从零开始,向前出发

Middleware

生涯规划 个人成长 盘点2021 2021年终总结

参加过 4 届 TiDB Hackathon 是一种什么体验? | TiDB Hackathon 选手访谈

PingCAP

【转】java开发之批处理框架 Spring Batch

飞不起来的童年

JAVA开发 spring batch

低代码行业浅析

凹凸实验室

前端 低代码

AI实战分享 | 基于CANN的辅助驾驶应用案例

华为云开发者社区

目标检测算法 CANN 昇腾 辅助驾驶 AscendCL

智汇华云 | 桌面云卓越体验下的协议技术解析

华云数据

seata入门介绍与seata-service部署与验证(一)

恒生LIGHT云社区

架构 分布式 seata

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