初识Node.js之Node.js与java做为后台服务器的对比

最近去了新公司,又拾起了被我抛下许久的后端了,不过由于公司的需求,后端采用Node.js,最近一直在学习Node.js,随着逐渐深刻的了解,发现真的Node.js能愈来愈变得热门是有其存在的道理的。可能有人会说,Java做为后端语言一直隐隐有龙头老大的姿式,为什么咱们还要去学Node.js呢Node.js到底是什么?它是新的语言仍是新的框架,是新的工具抑或只是一个简单的JavaScript文件?前端

运行时环境
咱们众所周知Java具备一个称做JRE的运行时环境来使得java程序可以顺利运行。JRE有一个称为JVM的虚拟机。JVM有许多组件,如垃圾回收器(GC),即时(JIT)编译器,解释器,类装载器,线程管理器,异常处理器,用于在不一样时间执行不一样的任务。JRE还有一系列的库来帮助运行时的Java程序。java

咱们为何要忽然牵扯到JRE运行时环境呢,其实正是为了与Node做比较,Node不是一种语言,也不是框架,更不是工具,它是运行JavaScript应用程序的运行时环境。Node.js有一个称为JavaScript Virtual Machine的虚拟机。它为基于JavaScript的应用程序生成机器代码,以便在不一样的平台上启用它。这个虚拟机就是Google的V8引擎,也有主要组件,如JIT和GC,分别用于执行任务,运行时编译,和内存管理。c++

发展潜力
判断JavaNode的发展潜力可能要从其背后的生态社区和支持库上切入,然而以Java为核心的传统体系天然比不上Node这样的新势力,简而言之,Java成熟而庞大,Node迅捷而活跃。Java其功能性和实用性天然没必要多说,可是Java包含了大量的样品代码,扰乱了程序猿所想表达的意图,就不如Java三大框架之一的spring,程序猿在使用spring的时候servlet,数据持久,以及构成系统的底层的东西,spring框架已经封装好会帮助你处理这一切,咱们只须要专一于写业务层代码就足以。可是在Spring中,子系统一个接一个,哪怕你犯最微小的错误,它都会用让你崩溃的异常来惩罚你。可能紧接着你就会看到巨大的异常信息。里面包含着一个一个你根本不知道的封装好的方法,Spring作了许多工做来实现代码的功能。这种级别的抽象显然须要大量的逻辑,长长的异常信息不必定是坏事,它指出了一个症状:这须要多少内存和性能上的额外开销?spring是怎么执行的?框架须要解析方法名、猜想程序员的意图、构建相似于抽象语法树的东西、生成SQL等等。这些事情的额外开销有多大?因此说使用Java掩盖复杂性并不会所以简单化,只会让系统更复杂。Java严格的类型检查使得Java帮你避免许多类型的bug,由于很差的代码没法经过编译。Java的强类型的缺点就是太多样板代码。程序员要不断进行类型转换,程序员要花掉更多时间写精确的代码,使用更多的样板代码,以图早期发现错误并改正。程序员

而Node.js偏偏相反。线程会致使更复杂化的系统。因此Node.js采用轻量级,单线程的系统,利用了js的匿名函数进行异步回调,你只须要简单的使用匿名函数,也就是闭包。不须要搜索正确的抽象接口,只须要写下业务代码,没有任何冗余。这就是使用Node.js的最大好处,不过异步回调天然也出现一个急需解决的问题:回调陷阱web

Node.js中,咱们不断嵌套回调函数的同时,很容易就陷入回调函数的陷阱中,每层嵌套都会让代码更复杂,使得错误处理和结果处理更困难。一个相关的问题就是js语言不会帮助程序员恰当地表达异步执行。其实有些库会使用Promise来简化异步操做,可是看起来咱们把问题简单化了,可是事实上代码层面更复杂化了,Promise用了许多样板代码,掩盖了程序员的真实意图。后来Node.js支持ES5ES6,能够采用async/await函数重写回调函数。仍是一样的异步结构,但使用了正常的循环结构来书写。错误和结果处理的位置也很天然,代码更易于理解,更容易编写,并且也能够很容易地理解程序员的意图。回调陷阱并非用掩盖复杂性的方式解决的。相反,语言和范式的改变解决了回调陷阱的问题,同时还解决了过多样板代码的问题。有了async函数,代码就更漂亮了。简单化的解决方法,将Node.js的缺点转化为了优势。可是JavaScript的类型很松散。并且在你书写代码的时候不会进行报错,许多类型不须要定义,一般也不须要用类型转换。所以代码更清晰易读,但存在漏掉编码错误的风险,只有在编译的时候才会去检查你语法以及逻辑是否存在问题,因此在Node.js中,为了更好的调试BUGNode支持将程序分红不一样的模块,由于有模块的存在,将错误发生的范围缩小到某个范围内,使得Node.js模块更容易测试。spring

包管理
Java最重要的问题之一就是没有统一的包管理系统,可能有人会和我说Maven.可是不管是用途、易用性仍是功能上,MavenNode.js的包管理系统相比简直是天壤之别。npmNode.js 官方提供的包管理工具,他已经成了 Node.js 包的标准发布平台,用于 Node.js 包的发布、传播、依赖控制。npm 提供了命令行工具,使你能够方便地下载、安装、升级、删除包,也可让你做为开发者发布并维护包。最好的地方是npm代码库不只供Node.js使用,也可让前端工程师使用。全部的前端JavaScript库都以npm包的形式存在。许多前端工具如Webpack都是用Node.js编写的。npm

性能
Java使用HotSpot这个超级虚拟机,它采用了多字节编译策略。它会检测常常执行的代码,一段代码执行次数越多,就会应用越多的优化。所以HotSpot性能相对来讲更快。Node底层选择用c++v8引擎来实现的,Node.js的事件驱动机制,这意味着要面对大规模的http请求,Node.js是凭借事件驱动来完成的,性能部分是不用担忧的,而且很出色。并且,因为V8引擎的改进,Node.js的每次发布都会带来巨大的性能提高。后端

虽然Node对高并发应用有着极高的性能,可是Node.js也有着本身的缺点:微信

  • Node不适合CPU密集型应用,由于CPU密集型应用若是有长时间的运算,不如大循环,将会致使CPU时间片不能释放,使得后续的IO操做所有暂停。前端工程师

  • 并且Node只支持单核CPU,不能充分利用CPU资源。

  • 可靠性低,一旦代码某个环节崩溃,将会致使整个系统都崩溃,缘由就在于Node是使用单进

程。

  • Node的开源组件库质量良莠不齐,更新快,并且不向下兼容。

其实Node.js做为后端能实现几乎全部应用,只是咱们选择的时候考虑更多的是这个应用选择Node.js是否是最适合的。
欢迎关注个人我的公众号,全部文章原创于微信公众号,CSDN不定时更新。
在这里插入图片描述