Node.js之Node与java作为后台服务器的对比
Node.js
之Node
与java
作为后台服务器的对比
- 最近一直在学习
Node.js
,随着逐渐深入的了解,发现真的node
能越来越变得热门是有其存在的道理的。可能有人会说,java
作为后端语言一直隐隐有龙头老大的姿势,为何我们还要去学node
呢?Node.js
究竟是什么?它是新的语言还是新的框架,是新的工具抑或只是一个简单的JavaScript
文件?
两种工具的介绍:
Node.js
Node.js
是一个基于Chrome
的JavaScript
运行时构建的平台,可以轻松构建快速且可扩展的网络应用程序。Node.js
使用事件驱动的无阻塞 I/O 模型
,使其轻量级且高效,非常适合跨分布式设备运行的数据密集型实时应用程序。NodeJS
是用于服务器端
和网络开发
的开源和免费使用的运行时环境
,可用于跨平台。用JavaScript
编写的NodeJS应用程序
可以在任何操作系统
(包括OS X
,Windows
或Linux
)的运行时环境中运行
。NodeJS
提供了一个巨大的库
,其中包括各种JavaScript
资源。因此,NodeJS
提供了一个运行时环境
和JavaScript库
,并具有强大的V8
引擎。
java
Java
是面向对象
的编程语言
之一,严格来说是典型的。它是由两位工程师James Gosling
和Patrick Naughton
于1991年开发的。Java致力于”一次编写,随处运行
“的概念,它允许用户访问所有平台上的代码,这些平台无需一次重新编译即可运行Java
。Java
是开源的,安全的,高度稳定的,灵活的;非常适合银行、电子商务、金融科技等安全网络使用。
运行时环境
- 我们众所周知
Java
具有一个称作JRE
的运行时环境来使得java
程序能够顺利运行。JRE
有一个称为JVM
的虚拟机
。JVM
有许多组件
,如垃圾回收器(GC)
,即时(JIT)编译器
,解释器
,类装载器
,线程管理器
,异常处理器
,用于在不同时间执行不同的任务。JRE
还有一系列的库来帮助运行时的Java
程序。 - 我们为什么要突然牵扯到
JRE运行时环境
呢,其实正是为了与node
作比较,Node
不是一种语言,也不是框架,更不是工具,它是运行JavaScript
应用程序的运行时环境
。Node.js
有一个称为JavaScript Virtual Machine
的虚拟机。它为基于JavaScript
的应用程序生成机器代码,以便在不同的平台上启用它。这个虚拟机
就是Google
的V8
引擎,也有主要组件,如JIT
和GC
,分别用于执行任务,运行时编译,和内存管理。
发展潜力
判断
Java
和node
的发展潜力可能要从其背后的生态社区和支持库
上切入,然而以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
的最大好处,不过异步回调
自然也出现一个急需解决的问题:回调地狱
。在
Node.js
中,我们不断嵌套回调函数
的同时,很容易就陷入回调函数的地狱
中,每层嵌套都会让代码更复杂,使得错误处理和结果处理更困难。一个相关的问题就是js
语言不会帮助程序员恰当地表达异步执行
。其实有些库会使用Promise
来简化异步操作,但是看起来我们把问题简单化了,但是事实上代码层面更复杂化了,Promise
用了许多样板代码,掩盖了程序员的真实意图。后来Node.js
支持ES5
与ES6
,可以采用async/await
函数重写回调函数。还是同样的异步结构,但使用了正常的循环结构来书写。错误和结果处理的位置也很自然,代码更易于理解,更容易编写,而且也可以很容易地理解程序员的意图。回调陷阱并不是用掩盖复杂性的方式解决的。相反,语言和范式的改变解决了回调陷阱的问题,同时还解决了过多样板代码的问题。有了async
函数,代码就更漂亮了。简单化的解决方法,将Node.js
的缺点转化为了优点。但是
JavaScript
的类型很松散
。而且在你书写代码的时候不会进行报错,许多类型不需要定义
,通常也不需要用类型转换。因此代码更清晰易读,但存在漏掉编码错误的风险,只有在编译的时候才会去检查你语法以及逻辑是否存在问题,所以在Node.js
中,为了更好的调试BUG
,node
支持将程序分成不同的模块,因为有模块的存在,将错误发生的范围缩小到某个范围内,使得Node.js
模块更容易测试。
包管理
java
最重要的问题之一就是没有统一的包管理系统
,可能有人会和我说Maven
。但是无论是用途、易用性还是功能上,Maven
与Node.js
的包管理系统相比简直是天壤之别。npm
是Node.js
官方提供的包管理工具
,他已经成了Node.js
包的标准发布平台,用于Node.js
包的发布、传播、依赖控制。npm
提供了命令行工具,使你可以方便地下载、安装、升级、删除包,也可以让你作为开发者发布并维护包。最好的地方是npm
代码库不仅供Node.js
使用,也可以让前端工程师使用。所有的前端JavaScript
库都以npm
包的形式存在。许多前端工具如Webpack
都是用Node.js
编写的。
性能对比
java
使用HotSpot
这个超级虚拟机
,它采用了多字节编译策略
。它会检测经常执行的代码,一段代码执行次数越多,就会应用越多的优化。因此HotSpot
性能相对来说更快。Node
底层选择用c++
和chrome的v8引擎
来实现的,node.js
的事件驱动机制
,这意味着要面对大规模的http请求
,node.js
是凭借事件驱动
来完成的,性能部分是不用担心的,并且很出色。而且,由于V8引擎
的改进,Node.js
的每次发布都会带来巨大的性能提升
node
的优势:
- 异步和事件驱动
Node.js
库上的API
是异步
的,这意味着非阻塞
。基本上,NodeJS
允许服务器永远不会在API
上等待或停止以获取返回数据,服务器在调用后立即移动到下一个API
。
- 单线程但高度可扩展
NodeJS
作为具有事件循环
的单线程模型
工作。事件机制帮助服务器不可阻挡地运行,这使得服务器具有高度可扩展性,这与常规服务器不同。
- 无中间件缓冲
NodeJS
应用程序以块
的形式提供输出数据,使它们无需任何缓冲区或用户等待即可正常工作。
- 非常快
NodeJS
建立在V
引擎上,这使得它更快,并且使用其库也快速且可访问。它可以在客户端和服务器端使用相同的语言。
虽然Node
对高并发应用有着极高的性能,但是Node.js
也有着自己的缺点:
Node
不适合CPU密集型应用
,因为CPU密集型应用
如果有长时间的运算
,不如大循环,将会导致CPU时间片不能释放
,使得后续的IO操作全部暂停
。- 而且
Node
只支持单核CPU
,不能充分利用CPU资源
- 可靠性低,一旦代码某个环节崩溃,将会导致整个系统都崩溃,原因就在于
Node
是使用单进程
。 Node
的开源组件库质量参差不齐,更新快,而且不向下兼容。
- 其实
Node.js
作为后端能实现几乎所有应用,只是我们选择的时候考虑更多的是项目场景是不是适合用NodeJS
。
java
的优势
Java
是另一种选择,也是一种高端编程语言
,可以帮助任何类型的开发。有许多新技术堆栈正在编程中出现,Java
仍然在竞争中屹立不倒。
Java
是一种面向对象
的语言,允许用户在其他程序中重用对象。Java
被认为是一种高级编程语言
,但它具有简单的语法和更快的学习曲线,这使得每种类型的用户都更容易。- 它拥有大量的库和托管服务提供商,可在任何计算机上提供支持。
Java
允许用户在任何支持Java
的平台上工作,如果不支持,那么您可以使用虚拟Java环境
,在任何设备上开始工作并在任何设备上完成它。Java
允许独立的多线程
,这意味着一个线程不会影响其他线程。- 自动存储管理称为垃圾回收器。