前言:javascript
身边愈来愈多的同事谈论Nodejs,谈其异步IO、事件回调、先后台统一一门语言,创业的朋友的第一个创业项目也选择了Nodejs,指望可以使用一种语言节省成本快速完成需求开发。与其余项目组的同事聊项目选型Java时被他们嘲笑了一把,怎么这么不与时俱进怎么还在用Java。并且发现,愈来愈多的前端同事经过Nodejs轻松上手后端功能开发,做为后端开发工程师倍感压力。前端
借新项目的机会系统了解了下Nodejs的知识体系,本文对了解到的Nodejs技术做了总结,同时将其与Java的相关技术进行了总结对比,为其余考虑两种语言选型的架构师提供选型的决策依据。为了不争议,本文避免对选型语言的推荐,也不对将来的发展趋势作出预测。java
语言背景分析:node
简单对两门语言进行“拼爹”对比,发现有技术深度的事情仍是博士比较擅长,计算机专业的技术又未必是计算机专业的人贡献:mysql
Nodejslinux
|
Javaandroid
|
Ryan Dahl,非科班出身,数学系读博士
2009年的2月开始开发Node,年末发表关于Node.js的演讲
2010年由创业公司Joyent赞助开发
2013年更新缓慢、活跃度下降,纠结于稳定内核及新特性开发
2014年8月几个重要core contributor发起组织(io.js前身),此后高速发展,新功能激进、高速版本迭代、问题反馈快速回复解决,2015年5月Node.js项目和io.js项目都将加入Node.js基金会,io.js继续发展的同时进行合并,Nodejs的下一个版本将跨1.0直接到2.0
|
詹姆斯·高斯林,卡内基·梅隆大学计算机博士,编写了多处理器版本的Unix操做系统,是JAVA的创始人。
1996年1月,第一个JDK-JDK1.0诞生
1997年9月,JavaDeveloperConnection社区成员超过十万
1998年2月,JDK1.1被下载超过2,000,000次
2009-04-20甲骨文74亿美圆收购Sun。取得Java的版权;
|
语言及SDK分析:
Nodejs选择javascript语法致使了其灵活、面向过程、单进程单线程执行的基本特性。然而得意其语言的灵活性,一些面向对象的特征也能够经过逻辑代码实现,但受阻于ECMAScript的发展速度,总体上Nodejs向企业级应用语法转型还暂时较慢。Nodejs主打的异步IO事件回调使其更适合服务器的编程,其单进程单线程的特质使得开发变得简单。得意与社区的活跃语言处于高速发展、SDK不断地发展稳定丰富。
相比之下,Java是面向对象的具有了面向对象的所有特征,经历了20年的发展沉淀愈加的强大、稳健。与Nodejs相比Java是个在各个领域做精做深的技术巨人,然而也正因如此,学习Java的成本要比Nodejs高很大一个台阶,每个小的技术方面都能找到很厚的一本书来。面对异步IO事件回调的新技术Java也在其新的SDK中提供支持与时俱进,相关Java的开源项目也及时跟进。
对比项
|
Nodejs
|
Java
|
函数式编程
|
很是自由,能够调用、做为参数、做为返回值
支持高阶函数、偏函数用法
|
Java8中支持了Lambda表达式实现函数编程与时俱进
|
类、接口、抽象类
|
原生不支持,自己是面向过程的,可利用函数实现类的定义能力。
|
原生支持,面向对象语言基本能力,依赖接口编程下降耦合
|
封装、继承、多态
|
原生不支持
|
原生支持,面向对象语言基本能力
|
动态
|
须要重启或者从新加载
|
依靠jvm的字节码和内存管理技术,能够实现动态编译、动态连接、动态加载、动态变动替换、热部署
|
异常
|
支持,因为异步IO事件回调致使异常捕获较为复杂。V8不会优化含有try/catch的函数又致使过多捕获异常产生性能问题。
全局捕获uncaughtException会丢失堆栈一般为时已晚。
Domain机制当前还不稳定。
|
支持,相对更成熟完善些,单线程异常不影响其余线程。
|
算法与数据结构
|
Node自己提供的较为简单,但开源社区相关代码高速发展中
|
比较稳定完善
|
集合Set\Map\List
|
api能力较弱,ECMAScript 6引入Set和Map,2015年6月计划发布,还需脚本引擎开发支持
|
完善丰富的集合容器,支持各类并发场景、业务特殊算法场景
|
事件回调与异步IO
|
语言级别支持,Nodejs杀手锏能力。
监听器模式实现事件回调,利用事件队列解决雪崩问题
|
1.4版本开始提供NIO工具包实现同步非阻塞IO
|
进程、线程
|
单线程单进程模式,开发成本低。
|
支持多线程编程,支持并发控制,较为复杂,须要有并发开发经验
|
网络编程、WEB开发
|
能够十分方便地搭建网络服务器
|
提供的仍是底层API能力,由各个开源项目实现强大而专业的网络编程框架及WEB开发框架
|
组件模块、分包分层
|
package.json集合文件夹定义包,包内部可定义多个模块
|
经过package、类、ClassLoader、压缩包实现多维度多层次的划分和复用的能力
|
注解、反射、泛型
|
无
|
原生支持
|
扩展性
|
支持C/C++编写的逻辑扩展
|
支持C/C++/及其余可被JVM执行语言编写的逻辑扩展
|
三方开源框架选型:
语言选型后面即框架选型,好的框架能够去除不少没必要要的重复工做使项目轻松获取强大的功能。固然三方开源框架的引入也带来的相应的学习成本,一样的,Nodejs框架因为发展时间相对较短学习成本相对较低,开发人员更容易了解到更多底层的实现源码,但相对的部分框架容易出现稳定性兼容性问题,加之NPM开发人员水平不一而又没有很好的审核机制,选择一些模块(尤为是C/C++模块)时须要慎重。Java三方开源框架大都已被大量企业大量使用、成熟稳定,提供强大能力的同时做了很好的封装分层,开发人员付出较高的学习成本后更多的是“傻瓜“式的使用。就WEB开发体系而言,二者均可以找到不少可服用引入的开源框架。
对比项
|
Nodejs
|
Java
|
数据库
|
针对不一样数据库类型引入不一样的驱动模块,Mongoose/reids/mysql
|
能够针对不一样的数据库引入不一样的驱动模块,也可使用多个开源框架,下降数据库使用成本、不一样数据源的迁移成本:
|
MVC框架开发WEB
|
Express/Koa:轻量灵活快速地搭建网站,支持多种模板,利用generatora解决了繁琐的回调嵌套
|
相关框架均较为成熟可靠,典型的有:
|
前端模板
|
EJS:强大易用,语法更接近前端语言。Jade语法更接近后端语言,功能更强大
|
Velocity:基于java的模板引擎,阿里主流选择,内部进行了性能优化,支撑住了淘宝天猫的大流量
|
Rest开发
|
Restify:Rest应用框架,支持服务器端和客户端,专一Rest服务
|
JAX-RS:提供了一些标注将一个资源类、一个POJO Java类封装为Web资源。
|
Web Socket
|
Socket.IO:跨平台,多种链接方式自动切换,作即时通信方面的开发很方便
|
Netty:异步的、事件驱动的网络应用程序框架和工具包
|
日志管理
|
Log4js:简单易用,winston:功能更强大,稍复杂
|
Log4j:输出定制、日志级别格式控制。Slf4j:简单统一的日志接口
|
HTTP调用
|
Request:创建各类HTTP请求,支持受权验证,其实功能仍是很是多的,基本知足绝大部分需求。
|
HttpClient:Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包
|
异步流程控制
|
Async:使异步流程同步化。Q是另一种很是不错的选择,它是实现了promises接口。
|
asyn4j:异步方法调用框架,基于消费者与生产者模式。包括了异步方法执行,异步回调执行,异步工做缓存模块.支持Spring。
|
定时任务
|
Cron:小巧的定时任务管理模块。Later功能强大但稍微复杂
|
Quartz:能够用来建立简单或为运行上万个jobs这样复杂的程序,让做业变得易用管理
|
其余框架
|
社区活跃,更新很是快,但也容易存在不稳定、不兼容的风险。
Npm模块的开发人员水平不一,暂时只能依靠口碑、测试文档等条件选型
|
各类场景均有不少成熟稳定开源框架可供选择,公司内部一般也有本身的成熟项目
|
产品化分析:
就产品化而言,Nodejs虽然在各个方面都有建设,但相对Java还有不少须要继续完善发展的地方,如系统监控和性能分析领域还不如Java体系那么完善,受限于单进程单线程模式稳定性部署方面还不如Java那么灵活,灵活的脚本语言加上Nodejs发展时间相对较短使得系统的安全性还须要经受更多的考验。同时,先后端代码均可以使用到js并同时保存在一个开发分支时,单纯的依赖目录去区分先后端代码,容易形成先后端代码的混淆,相对不够清晰。但相信争议和问题都是暂时的,高速发展的Nodejs会逐步完善完美。
对比项
|
Nodejs
|
Java
|
编码规范
|
JSLint/JSHint:定义代码格式规范的规则,统一编码
|
CheckStyle/FindBug/Code formatter:比较完善,支持持续集成
|
包管理、构建
|
NPM:Nodejs的包管理器,模块库发展是十分神速和活跃
|
MAVEN:一个项目管理和构建自动化工具,包含了一个项目对象模型、一组标准集合、一个项目生命周期、一个依赖管理系统、插件,方便、扩展性好、功能强大
|
部署
|
脚本方式启停进程进行部署
|
WEB项目利用Maven能够打包成一个war包,直接部署到容器的指定目录便可。
|
系统监控
|
但针对Nodejs的监控技术仍是比较缺少的,资料也比较缺少
|
JVM提供虚拟机各项指标的监控接口,包括C++和Java的,基于此类接口实现了不少成熟的监控工具,互联网公司内将不少监控能力WEB化
|
性能分析
|
内存快照分析:node-heapdump/node-memwatch
|
基于JVM的工具API实现有多种性能分析工具,能够分析CPU耗时分布、CPU调用链、CPU热点、内存分布、内存热点、线程阻塞等等。
|
稳定性
|
受限于单进程单线程的设计,稳定性须要引入多进程来解决,限制较大,相对比较耗费资源
|
传统的多线程、多进程、多机多机房机制,灵活选择部署,稳定性已经历过线上的长期考验
|
安全性
|
脚本语言的安全性较弱加上Nodejs的语法灵活性致使编码时较容易出现安全问题,已成立Node安全项目有针对性的分析解决Nodejs的安全问题。
|
相对脚本语言安全性较强,漏洞通过多年分析与解决
|
执行引擎分析:
在浏览器方面V8引擎大名鼎鼎赞不绝口,这也是Nodejs选型V8这个最快的Javascript执行引擎的缘由。然而另外一方面,V8引擎专门针对浏览器的设计也严重限制了Nodejs在服务器领域的大有做为,仿佛带着手链脚链在高速奔跑。因V8引擎的创始人和技术都是来自Java虚拟机,使用了部分Java虚拟机技术适配浏览器业务实现,全部相比之下Java虚拟机更加的成熟完善,也必然相对的复杂沉重。
对比项
|
Nodejs
|
Java
|
引擎概述
|
V8:最快的JavaScript虚拟机,参考JVM部分核心技术实现,针对浏览器需求场景而专门设计优化
|
JVM:成熟稳定完善的虚拟机技术及体系,各个内部模块算法等都通过深刻研究造成专业领域,V8的创始人是原SUN的技术人员
|
内存限制
|
V8专为浏览器设计,最大内存占用:64位1.4GB,32位0.7GB,新生代分布对应为最大32M和16M(限制可打开,容易形成延迟,不推荐)
|
能够结合系统的内存状况能够按须要设置,而且能够根据业务对内存的需求灵活设置调优。
|
垃圾回收
|
模仿JVM的分代回收。新生代晋升条件相对固定,复制回收。老生代标记清除回收(压缩解决碎片问题)
|
广泛分代回收,有多种垃圾回收算法可供选择,每一个回收算法有多种参数能够配置调优,持续发展更新。
|
内存监控分析
|
process.memoryUsage查看内存概况,os模块的totalmem()和freemem()查询系统内存使用
|
JVM提供C++和Java的接口能够查询详细的JVM内存及系统内存信息
|
跨平台、可移植
|
暂时只能支撑到Chrome浏览器支撑得了的平台
|
任何虚拟机支撑的平台,更为普遍稳定
|
扩展性
|
为浏览器设计,扩展性相对较差,体系还不够完善
|
技术体系比较深,提供多种接口方便三方扩展开发
|
其余一些对比:
其余一些简单对好比下:
领域
|
对比项
|
Nodejs
|
Java
|
开发工具
|
IDE
|
WebStorm
|
Eclipse
|
测试技术
|
单元测试
|
Mocha/Karma/Jasmine
|
Junit/TestNG/jMock
|
应用场景
|
场景
|
服务器编程,擅长高并发IO密集型程序项目
|
服务器编程、大数据、企业开发、android
|
开发者
|
来源
|
部分是向后台开发试水的前台人员,部分是被异步I/O吸引的后台人员
|
大部分仍是后台开发人员
|
结束:
Nodejs的异步IO、事件回调虽是杀手锏能力,但其余程序开发语言也都有相应的跟进支持,但Node成功将先后端统一一门语言开发,这绝对是无人能及,吸引了大批的开发者加入。得益但又受限于V8引擎,其发展还带着包袱,但Nodejs还年轻还处在高速发展中,相信随着IO.js与Node.js合并、愈来愈多的开发者进行共建,Node会愈来愈稳定成熟。
相比之下Java是编程领域的巨人,20年的发展,愈加的成熟稳定,造成完善的体系完善的生态,Android的流程再次将这门语言推到了巅峰,架构选型永远是个重点选项。
https://as.h5con.cn/articles/54118?spm=5176.100239.blogcont118673.32.8NFfUv