我们都知道现在Node.js越来越引人注目。每个人都对学习Node.js感兴趣并希望把它用起来。在开始使用一项技术之前,最好是先了解下它背后的概念。但对于初学者,不同的人使用不同的定义会可能令他们感到困惑。Node.js到底是什么?它是一门新语言,一个新框架,一个新工具,还仅仅是一个JavaScript文件?即使是对于那些有经验的Java开发者来说,他们也很难迅速地了解Node.js。因此,在这篇文章中,我试着向Java开发者解释Node.js是什么。
运行时环境
我们知道运行Java程序时需要名为JRE的运行时环境.JRE包含一个名叫JVM的虚拟机.为了在不同的时间执行不同的任务,JVM包含很多组件,例如垃圾收集器(GC), 即时编译器(JIT), 解释器, 类加载器, 线程管理器,异常处理器.
除了JVM,JRE还有一系列在运行时辅助Java程序的库(例如,rt.jar).对于不同的平台,比如Windows, Macintosh和Linux,我们有单独的JRE.当然,因此JVM也是平台各异的.
好的,现在请试着回想下Java程序是怎样编译和执行的.我们的源代码(.java)被Java编译器编译为称为字节码的中间代码(.class).这个字节码用于给指定目标平台的JVM运行.在运行前,JVM会把字节码转化为指定目标平台的机器码.
下面的图解释了Java程序的执行过程.
Web应用程序架构
典型的Java web应用程序架构拥有四层:客户端,表现层,服务/业务层和数据层.
客户端层会使用像jQuery这样的库来支持AJAX功能,做客户端验证和DOM操作。
表现层通常与客户端层交互。这一层一般为请求和响应处理实施MVC模式。像Spring MVC这样的框架在这一层被使用。同时,这一层里会有像Velocity这样的模板引擎来基于预定义的布局动态渲染视图层。
服务/业务层负责业务逻辑以及和其它层的沟通。在一个Ajax请求事件中,这一层为客户端层处理数据。这一层执行业务逻辑和响应,返回给表现层,以更新数据模型。服务层是和数据层进行数据沟通以获得或更新所需数据的。服务层可以使用像Spring这样的框架,实现SOAP或者REST服务。
数据层通常使用ORM框架,例如Hiberate,或者任何基于JDBC的库/模板(Spring JDBC模板)来和像Oracle这样任意的RDBMS沟通。
部署架构
Java web应用程序的部署体系结构包括Apache HTTP服务器,它充当一个代理服务器以及处理静态内容。动态内容是由一个Web容器处理的,它实际上是一个处理Java文件的引擎。
下图解释了Java web应用程序的部署架构:
我是如何理解node.js的?
运行时环境
我们在上一部分讨论JRE的原因,就是为了把它和Node.js做一个直接的对比。是的,你懂了!Node.js不是一个语言;也不是一个框架;更不是一个工具。它是一个执行基于JavaScript的应用程序的运行时环境。
和JRE类似,Node.js有一个被称为JavaScript虚拟机(JsVM?)的虚拟机。它为基于JavaScript的应用程序生成机器码,以使程序能够在不同平台上运行。
Node.js同时也是一个库的集合, 也可以被认为是一个帮助在运行时运行JavaScript应用程序的Node API或者Node模块,类似于JRE里面的Java库。因为JsVM的存在,对不同的平台,例如Windows、Macintosh、和Linux,针对Node.js有各自的要求。
JavaScript虚拟机只是一个V8,谷歌的开源JavaScript引擎。类似于Java虚拟机,JsVM (V8引擎)也有像JIT和GC这样的组件来分别执行任务、运行时编译和内存管理。
现在,让我们试着理解一下JavaScript程序是如何被编译和执行的。源码是用JavaScript (.js)编写的。在把源码交给JsVM/V8 引擎之前,没有中间代码被生成。JsVM直接使用源码,并基于给定的平台把源码编译成可执行的机器码。
上面的说明可以借助下面这幅图片来理解。
Web应用程序的体系结构
一个基于Node.js的web应用程序主要遵从Java web应用程序架构。主要的区别在于客户端请求处理。客户端的请求会被一个单独的线程所处理,但在Node.js应用程序中,这个处理是异步的。在Java应用程序中,每个客户端的请求会被一个单独的线程同步处理,因此,Java应用程序是多线程的。
基于Node.js的web应用程序开发有很多框架/库可以使用。这里要注意的有趣的一点是,框架/库都是基于JavaScript的。
你可以通过下面的图片迅速地理解Node.js应用在这些层次中所使用的不同框架/库.
客户端使用了Angular.js----一个前端MVC框架.表示层以及服务层则使用Express.js(一个基于JavaScript的web应用框架)开发. 这儿还有一个独立的服务器用于运行Node.js应用.数据层使用了一个对象数据模型模块(即Mongoose.js)来与像MongDB这样的NoSQL数据库通信.
这个特定的技术栈叫作MEAN,它由MongoDB, Express.js, Angular.js, 客户端MVC框架,Node.js和运行时环境组成.
部署架构
基于Node.js的web应用部署架构遵从Java web应用部署架构。这个架构有一个NGINX服务器,它扮演HTTP代理服务器的角色,同样也处理静态内容。动态内容由一个Node.js服务器处理,它同样包含一个处理JavaScript文件的引擎。
下面的图能够解释基于Node.js的应用程序的部署架构。
就这样而已?
请注意,这篇文章的目的是帮助Java开发者从他们的角度理解Node.js,而不是为了显示出对Java或者Node.js的青睐。同时,除了我们上面的讨论中使用到的技术,还有很多不同的可用的架构解决方案、框架和工具。只是为了便于比较和理解,我只提供了尽可能简单的架构解决方案和最简单的框架和库集。 因此,请尝试进一步探索以获得更好的理解。希望你有一个美好的学习体验!