初识Node.js之Node与java作为后台服务器的对比
> 文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。

想想好久没有更新文章了,最近去了新公司,又拾起了被我抛下许久的后端了,不过因为公司的需求,后端采用node.js,最近一直在学习Node.js,随着逐渐深入的了解,发现真的node能越来越变得热门是有其存在的道理的。可能有人会说,java作为后端语言一直隐隐有龙头老大的姿势,为何我们还要去学node呢?Node.js究竟是什么?它是新的语言还是新的框架,是新的工具抑或只是一个简单的JavaScript文件?
**运行时环境**
我们众所周知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++和v8引擎来实现的,node.js的事件驱动机制,这意味着要面对大规模的http请求,node.js是凭借事件驱动来完成的,性能部分是不用担心的,并且很出色。而且,由于V8引擎的改进,Node.js的每次发布都会带来巨大的性能提升。
虽然Node对高并发应用有着极高的性能,但是Node.js也有着自己的缺点:
* Node不适合CPU密集型应用,因为CPU密集型应用如果有长时间的运算,不如大循环,将会导致CPU时间片不能释放,使得后续的IO操作全部暂停。
* 而且Node只支持单核CPU,不能充分利用CPU资源
* 可靠性低,一旦代码某个环节崩溃,将会导致整个系统都崩溃,原因就在于Node是使用单进程。
* Node的开源组件库质量参差不齐,更新快,而且不向下兼容。
其实Node.js作为后端能实现几乎所有应用,只是我们选择的时候考虑更多的是项目场景是不是适合用NodeJS。
**欢迎关注我个人公众号:程序猿周先森**

初识Node.js之Node与java作为后台服务器的对比的更多相关文章
- [翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能
[翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能 原文: Comparing AWS Lambda performance of Node.js, ...
- node.js 初学(一)—— http fs 服务器/文件/post get
node.js 初学 —— http fs 服务器/文件/post get 这个世界,从来不会给失败者颁奖! 了解 node.js (开源) node.js 是用来做后台开发的,但是现在大部分前端人员 ...
- 一起来学node.js吧 node school简介
node.js这几年火爆的简直丧心病狂,去lagou.com查查node.js的职位,那叫一个多. 要说火爆到什么程度,竟然有一个网站专门去教大家学习node.js, Node School. 进去逛 ...
- 用 Node.js 实现的最简单的 HTTP 服务器
用 Node.js 实现的最简单的 HTTP 服务器 //app.js var http = require('http'); http.createServer(function(req, res) ...
- atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97
atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97 1. 实现html5化界面的要解决的策略1 1.1. Js交互1 1.2. 动态参 ...
- 【Node.js】Node.js的调试
目录结构: contents structure [-] 使用console.log() 使用Chrome DevTools 使用Visual Studio Code 与JavaScript运行在浏览 ...
- 极简 Node.js 入门 - Node.js 是什么、性能有优势?
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- 关于安装完Node.js 出现node is not dedined 问题
今天想来接触下Node.js 神奇 怀着揣揣的心 从官网下载了windows 的64位mis版本 几个下一步就顺利安装完毕了 接着跟着新手教程走 不懂教程里的 苹果shell 是什么 反正就是检 ...
- Node.js入门-Node.js 介绍
Node.js 是什么 Node.js 不是一种独立的语言,与 PHP,Python 等"既是语言优势平台"不同,它也不是一个 JavaScrip 框架,不同于 CakePHP,D ...
随机推荐
- 帝国CMS(EmpireCMS) v7.5后台任意代码执行
帝国CMS(EmpireCMS) v7.5后台任意代码执行 一.漏洞描述 EmpireCMS 7.5版本及之前版本在后台备份数据库时,未对数据库表名做验证,通过修改数据库表名可以实现任意代码执行. 二 ...
- OSI七层网络模型与TCP/IP四层模型
1.OSI七层结构图: 2.TCP/IP四层结构图: 3.各层对应的协议 4.OSI七层和TCP/IP四层的区别 OSI网络模型和TCP/IP网络模型对应关系: 5.交换机工作在OSI的哪一层 如果有 ...
- Python模块之snmp-cmds,easysnmp
一.简介 snmp-cmds模块通过SNMP与目标设备进行通信,此模块适用于windows,此模块是基于系统已安装了net-snmp环境easysnmp模块通过SNMP与谬表设备进行通信,此模块用于l ...
- 谷歌移动UI框架Flutter教程之Widget
引言 在之间我已经介绍了关于Flutter的下载安装以及配置,还有开发工具Android Studio的配置,还不知道的同学可以看看我这篇博客--谷歌移动UI框架Flutter入门.这里为什么非要用A ...
- java JVM原理讲解和调优和gc
- python 20 规范化目录
目录 规范化目录 1. 划归固定的路径: 2. 划分文件 2.1 seetings 配置文件 2.2 common 公共组件文件 2.3 src 主文件 2.4 starts 项目启动文件 2.5 类 ...
- Leetcode之深度优先搜索&回溯专题-491. 递增子序列(Increasing Subsequences)
Leetcode之深度优先搜索&回溯专题-491. 递增子序列(Increasing Subsequences) 深度优先搜索的解题详细介绍,点击 给定一个整型数组, 你的任务是找到所有该数组 ...
- [系列] - go-gin-api 路由中间件 - 日志记录(三)
目录 概述 gin.Logger() 自定义 Logger() 源码地址 go-gin-api 系列文章 概述 首先同步下项目概况: 上篇文章分享了,规划项目目录和参数验证,其中参数验证使用的是 va ...
- QFramework 使用指南 2020(七):Res Kit (1)概述与基本使用
在上一篇,我们刚刚结束了 脚本生成专题,我们知道 QF 提供了两种脚本生成模式,一种是 ViewController + Bind ,另一种是 UI Kit 模式. 本来打算,介绍完 ViewCont ...
- codeforce375div2-D. Lakes in Berland 搜索
Lakes in Berland 题意与解释:这道题就是求图中被围起来的点群,问最少去掉几个点,可以使得孤立的点群数目为K; 因为自己写的代码又长又had bugs. 我自己写的bfs,想着是先染色, ...