日期:2014-05-16  浏览次数:20368 次

转:使用 Node.js 作为完整的云环境开发堆栈
使用 Node.js 作为完整的云环境开发堆栈

使用 Node.js 作为完整的云环境开发堆栈

使用通过回调的异步 I/O 开发并发模型,并构建聊天服务器
Noah Gift, 助理工程主管, AT&T Interactive
Jeremy Jones, 高级系统工程师, Predictix

简介: 本文探讨 Node.js,这是一个用于 UNIX? 类平台上 V8 JavaScript? 引擎的事件驱动的 I/O 框架,设计这一框架的目的是为了编写可伸缩的网络程序,如 Web 服务器。本文通过一个完整的例子说明如何在 Node.js 中构建聊天服务器,分析了这个框架以及围绕它的生态系统(包括云计算产品),并对这个框架进行了总结。

本文的标签:  javascript, node, node.js, nodejs, web_development, web_应用, 云计算平台, 应用开发

标记本文!

发布日期: 2011 年 8 月 01 日
级别: 中级
原创语言: 英文
访问情况 33312 次浏览
建议: 0 (添加评论)
1 star2 stars3 stars4 stars5 stars 平均分 (共 3 个评分 )

随着技术创新表面上继续以指数级速度发展,新思想层出不穷。服务器端的 JavaScript 就是这些新思想之一。 Node.js 是一种事件驱动的 I/O 框架,用于 UNIX 类平台上的 V8 JavaScript 引擎,适合于编写可伸缩的网络程序,如 Web 服务器。 Node.js 正是这种新思想的实现。

Node.js 并非与 JavaScript 抗衡,而是使用它作为完整的开发堆栈,从服务器端代码一直延伸到浏览器。Node.js 还充分利用了另一种创新思想:通过回调利用异步 I/O 的并发性模型。

Node.js 云计算平台

在云计算环境中使用 Node.js 框架时,能显示出它的一个巨大优点。对于应用程序开发人员,这往往归结使用平台即服务 (PaaS) 或基础架构即服务 (IaaS) 模型。对于开发人员而言,最抽象和公认最方便的方法是使用 PaaS 提供程序。图 1 十分简单地说明了 PaaS 和 IaaS 模型的结构。

图 1. PaaS 与 IaaS 结构
PaaS 与 IaaS 结构

最近,一个激动人心的开源项目 Cloud Foundry 公布了代码以创建一个能够运行 Node.js 的私有 PaaS。 同样的主机引擎也可用在公共云和商业云中,而且它们接受软件补丁。

基础架构管理是一大痛点,如果能够将这项工作外包(永远!)给规模经营的提供商,且无论是源代码,还是物理硬件资源,对于开发人员确实是一个激动人心的时刻。

回页首

使用 Node.js shell

在我们着手编写一个完整的 Node.js 例子之前,让我们先开始介绍如何使用交互式 shell。如果尚未安装 Node.js,您可以参考资源部分,然后按照说明安装它,或者使用在线的交互式 Node.js 站点之一,它允许您直接在浏览器中输入代码。

要在 Node.js 中以交互方式编写 JavaScript 函数,在命令行提示中输入node,如下所示:


lion% node
> var foo = {bar: 'baz'};
> console.log(foo);
{ bar: 'baz' }
>


在这个例子中,创建了对象foo,然后调用console.log 将它输出到控制台。这十分有效而且有趣,不过当您使用 tab 完成功能来探讨 foo 时,如下面的例子所示,真正的乐趣才刚刚开始。如果输入 foo.bar.,然后按下 tab 键,您将看到对象上的可用方法。


> foo.bar.
[...output suppressed for space...]
foo.bar.toUpperCase           foo.bar.trim
foo.bar.trimLeft              foo.bar.trimRight


试用 toUpperCase 方法似乎很有趣,下面显示了它的用法:

> foo.bar.toUpperCase();
'BAZ'


您可以看到,该方法将字符串转换为大写字母。这类交互式开发非常适合于使用像 Node.js 这样的事件驱动型框架进行开发。

在完成简单介绍之后,我们开始真正地构建一些东西。

回页首

用 Node.js 构建聊天服务器

Node.js 让编写基于事件的网络服务器变得十分简单。例如,让我们创建一些聊天服务器。第一个服务器十分简单,几乎没有什么功能,也没有任何异常处理。

一个聊天服务器允许多个客户端连接到它。每个客户端都可以编写消息,然后广播给所有其他用户。下面给出了最简单的聊天服务器的代码。

net = require('net');

var sockets = [];

var s = net.Server(function(socket) {

    sockets.push(socket);

    socket.on('data', function(d) {

        for (var i=0; i < sockets.length; i++ ) {
            sockets[i].write(d);
        }
    });
});

s.listen(8001);


在不到 20 行代码中(实际上,真正实现功能的代码只有 8 行),您已经构建了一个能够使用的聊天服务器。下面是这个简单程序的流程:

    当一个套接字进行连接时,将该套接字对象附加到一个数组。
    当客户端写入它们的连接时,将该数据写到所有的套接字。

现在,让我们检查所有代码,并解释这个例子如何实现聊天服务器预定功能。第一行允许访问 net 模块的内容:

net = require('net');


让我们使用这个模块中的 Server。

您将需要一个位置来保存所有客户端连接,以便在写入数据时可以写到它们中去。 下面是用于保存所有客户端套接字连接的变量:

var sockets = [];

下一行开始一个代码块,规定当每个客户端连接时要做的事情。

var s = net.Server(function(socket) {


传递到 Server 中的惟一参数是将针对每个客户端连接进行调用的一个函数。在这个函数中,将客户端连接添加到所有客户端连接的列表中:

sockets.push(socket);


下一部分代码建立了一个事件处理器,规定了当一个客户端发送数据时要做的事情:


socket.on('data', function(d) {

    for (var i=0; i < sockets.length; i++ ) {
        sockets[i]