使用Node.js开发一个基于JavaScript的RESTful应用

REST 风格几乎是为 HTTP 协议量身定做的,在 HTTP 协议中用 URI 来标识唯一的资源,用 GET、PUT、POST、DELETE 等动词来操作资源,HTTP 协议是无状态协议,可以通过 Cache 来提高性能。本文将使用 ">Node.js 开发一个基于 JavaScript 的 RESTful 应用。

在 Web2.0 盛行的今天,作为一种可以运行在浏览器客户端的轻量级脚本语言,JavaScript 被越来越多的开发人员所熟悉和掌握。大家印象中的 JavaScript 是简单高效的,

运行在客户端的程序,甚至有人认为 JavaScript 只是一个“小玩意”。Node.js 的出现彻底颠覆了以往对 JavaScript 的看法。Node.js 是服务器端的 JavaScript 运行环境,它的设计初衷是以一种简单的方式创建可伸缩性的网络程序。Node.js 具有异步 I/O 和事件驱动等特性,充分利用了 JavaScript 的闭包特性和事件处理机制,实现了类似 Apache 的 HTTP Server,使之具备了构建基于 JavaScript 的高并发的 Web Application 的能力。在 Node.js 的官方网站中使用 Node 来表示 Node.js,本文也将沿用这种用法,后文中出现的 Node 等同于 Node.js。

Node.js 的异步 I/O 和事件驱动机制

首先解释一下所谓的同步 I/O 和异步 I/O 的概念。它们都是针对于应用程序而言。

同步 I/O 指的是应用程序在遇到 I/O 操作时进入等待,不能利用 CPU,直到 I/O 操作结束后应用程序才继续执行后续任务。 异步 I/O 指的是应用程序在遇到 I/O 操作时不等待,继续执行后续任务,等 I/O 操作结束后操作系统发出事件提醒应用程序。

可以看出异步 I/O 能够更好地利用 CPU,提高应用程序的执行效率,同时提高 I/O 的并发性。举例来说,应用程序要先后执行两个 I/O 任务,网络 I/O 和文件 I/O,在同步 I/O 模型中应用程序必须等网络 I/O 执行完成后,才能执行文件 I/O。在异步 I/O 模型中,应用程序执行了网络 I/O 任务之后,不需要等待网络 I/O 的结束,可以立即执行后续的文件 I/O,从而使得 I/O 并发。

下例展示了用 Node 来打开一个文件的异步 I/O 的执行过程。主线程在执行了文件 I/O 后不等待,直接执行后续程序,I/O 执行结束后自动执行回调函数。

清单 1. 异步文件 I/O

// 加载 fs module fs = require('fs'); // 打开 example.log 文件 fs.open('c:/example.log', 'r',
function(){ // 在回调函数中对文件进行操作 console.log('Open file completed!'); }); console.log('Execute main thread!');

图 1. 异步文件 I/O 执行结果

Node 的异步 I/O 特性很好地提高了对请求的并发处理能力,这点在 Web 服务器领域非常重要。传统的 Web 服务器比如 Apache HTTP Server,采用的是同步 I/O 的模型,通过多线程的方式来实现对请求的并发处理。基于线程的模型相对来说没有那么高效,并且要处理公共资源同步问题,对连接数也有一定的限制,服务器要给每个连接分配线程栈空间存储局部变量,对服务器的内存开销很大。Node 采用的是单线程 + 异步 I/O+ 事件轮询的机制来处理请求并发的。Node 用一个主线程来监听服务器的请求,有请求到达就用异步 I/O 处理请求,同时主线程能够快速的执行完毕来处理下一个请求。Node 后台通过事件轮询去监听 I/O 的处理情况,当 I/O 完成后,Node 会根据事件驱动机制去调用相应的回调函数。值得注意的是 JavaScript 的闭包特性保证了回调函数执行时依然处在之前的执行上下文中,可以取到正确的变量的值。

Node 的一个最佳实践是内存操作始终快于 I/O 操作。Node 的异步 I/O 机制使它在内存中并发处理多个 I/O 请求,而不是等待 I/O 请求的串行操作。有实验证明在相同的服务器硬件条件下,Node 的并发处理能力高于 PHP/Apache 的并发处理能力。

当 PHP/Apache 3187 请求 / 秒 Node.js 5569 请求 / 秒

RESTful 应用的特点

REST 并不是一种具体的实现技术,而是一种软件架构风格,主要有以下特点:

从资源的角度来考察整个网络,每个资源有唯一标识 使用通用的连接器接口操作资源 对资源的操作不会改变资源标识 连接协议具有无状态性 能够使用 Cache 机制来增进性能

REST 风格几乎是为 HTTP 协议量身定做的,在 HTTP 协议中用 URI 来标识唯一的资源,用 GET、PUT、POST、DELETE 等动词来操作资源,HTTP 协议是无状态协议,可以通过 Cache 来提高性能。

基于 REST 的架构风格,人们把它使用到了 Web 服务中。在目前主流的三种 Web 服务实现方案中,RESTful 的 Web 服务比基于 SOAP 和 XML-RPC 方式的 Web 服务更加简洁高效。它直接使用 HTTP 协议就可以实现 Web 服务,不需要额外的封装协议和远程进程的调用。资源的表现形式可以是 HTML,也可以是 XML,JSON 等其他数据形式,这取决于 Web 服务的消费者是人还是机器。

表 1. HTTP 请求在 RESTful Web 服务中的典型应用

资源 GET PUT POST DELETE 一组资源的 URI,比如 http://www.example.com/resources/ 列出 URI 及该资源组中每个资源的详细信息 使用一组给定的资源替换当前整组资源 在本组资源中创建 / 追加一个新资源 删除整组资源 单个资源的 URI,比如 http://www.example.com/resources/1
获取给定资源的详细信息 替换 / 创建指定的资源,并将其追加到相应的资源组 把指定的资源作为资源组,并在其下创建 / 追加一个新元素,使其隶属于当前资源 删除指定元素

时间: 2024-10-29 21:12:04

使用Node.js开发一个基于JavaScript的RESTful应用的相关文章

Node.js开发Web后台服务

一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.js 的包管理器 npm,是全球最大的开源库生态系统. 能方便地搭建响应速度快.易于扩展的网络应用,Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集型的实时应用. 官网:https://nodejs.org/en/中文:https://cnode

Node.js开发教程之基于OnceIO框架实现文件上传和验证功能_node.js

OnceIO 是 OnceDoc 企业内容(网盘)的底层Web框架,它可以实现模板文件.静态文件的全缓存,运行起来完全不需要I/O操作,并且支持客户端缓存优化,GZIP压缩等(只在第一次压缩),拥有非常好的性能,为您节约服务器成本.它的模块化功能,可以让你的Web进行分布式存储,即一个扩展包里即包含前端.后端和数据库定义,只需通过添加/删除目录的方式就可实现功能删减,实现真正的模块化扩展.这里是介绍如何使用OnceIO的一系列文章. 在这一章节中,我们将为大家演示如何使用 OnceIO 实现文件

《node.js开发指南》观后感

最近在当当网上买了一本<node.js开发指南>,从学习node.js到现在看的第一本中文教程,也算献出了自己处子之身啊,哈哈.前后大约花了4,5个小时通读了node.js部分,附录部分只是略过了,谈一下感想把. 1.本书的定位: 就像书中的前言部分所述,确实是针对node.js还未入门的初学者准备的,但是有一个前提,如果之前没写过像php等后端的语言读本书可能有点迷茫.所以本书的定位人群应该是对后端脚本语言有过一定开发经验,并且熟悉javascript语法的人. 2.本书的组成部分: 个人感

使用Node.js实现一个简单的FastCGI服务器实例_node.js

本文是我最近对Node.js学习过程中产生的一个想法,提出来和大家一起探讨. Node.js的HTTP服务器 使用Node.js可以非常容易的实现一个http服务,最简的例子如官方网站的示例: 复制代码 代码如下: var http = require('http');http.createServer(function (req, res) {    res.writeHead(200, {'Content-Type': 'text/plain'});    res.end('Hello Wo

在Windows Azure以node.js开发部落格平台

Ghost 是一个以 node.js 开发的部落格平台,它的特色是可以使用 Markdown 语法来撰写文章,同时也提供了很多设计优良的版型.而除了直接付费在 ghost.org 上面建立部落格之外,也可以http://www.aliyun.com/zixun/aggregation/18785.html">直接下载它的程序代码, 然后架设 node.js 执行环境,也可以自己拥有一个 ghost 的部落格系统. 而由于 Windows Azure Websites(网站服务)也支持 no

node.js 开发指南 – Node.js 连接 MySQL 并进行数据库操作_node.js

Node.js是一套用来编写高性能网络服务器的JavaScript工具包   通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来介绍下如何通过NodeJS来操作 MySQL 数据库. 安装MySQL模块到NodeJS中 我们需要让NodeJS支持MySQL,则需要将MySQL模块添加到系统支持库   想要快速了解Node.js ,赞生推荐亲看看 node.js_guide.pdf  - node.js 开发指南 :想要电

javascript-怎么用js开发一个这样不规则图形的统计系统?

问题描述 怎么用js开发一个这样不规则图形的统计系统? 解决方案 完全按照高度做比例的话应该不难,白色最底层,红色地二层,黑色第三层,只需要设置红色的高度就可以了,红色的宽度可以和黑色的一样,变换红色的高度,看看这个思路行不? 解决方案二: 钻石是个图片么,钻石中间透明,改变红色高度就行 解决方案三: Echarts.js

请教各位,希望自己动手开发一个基于JAVE语言的,录入单据系统,希望可以有“自动完成”的等功能,选择什么AJAX框架

问题描述 希望开发一个基于JAVE语言的,录入单据系统,希望可以有"自动完成"的功能,还有一些工作流的代码(例如后工序审核)应该使用什么框架比较啊容易做到这些功能呢?有没视频提供一下学习,我是一个自学开发的初哥(有一点JAVA基础:主要希望实现的是把原来的桌面型的系统,开发成为用JAVA+AJAX造的网页型的单据管理系统) 解决方案 解决方案二:prototype或JQuery都行吧解决方案三:JQuery比较好一点,容易掌握学习prototype现在企业才用

我参加了Cloud Foundry博客征文大赛,我的参赛作品是:使用Node.js + Mongodb构建基于Cloud Foundry的项目

问题描述 我参加了CloudFoundry博客征文大赛,我的参赛作品是:使用Node.js+Mongodb构建基于CloudFoundry的项目www.wordmars.netwww.jzjyfc.comwww.fedtr.com 解决方案 解决方案二: 解决方案三: 解决方案四: 解决方案五: 好东西啊,,,,,解决方案六: 解决方案七: 不错,好东西