此文章由机器翻译。

深入了解 Windows Azure

Windows Azure 中 Node.js 的真实场景

Bruno Terkaly
Ricardo Villalobos

下载代码示例

Bruno Terkaly and Ricardo Villalobos流行的报价单,"如果你是一把锤子,看起来像是钉子"当然适用于软件体系结构。最优秀的程序员,但是,了解各种各样的框架、 编程语言和平台,以便他们可以工程师的解决方案,不仅满足即时的业务要求,但也是可伸缩的、 易于维护的、 可扩展的和可重复使用的解决方案中的结果。Node.js 跃上现场三年前,提供另一个工具,用于创建支持可扩展的互联网应用程序的服务器端的软件系统。所有的开发工具,像 Node.js 魔法锤,并不决定如果是权利,适合手头的解决方案之前,应充分理解其能力。

如果你是新到 Node.js,它是构建可扩展的网络应用程序,基于谷歌 V8 JavaScript 引擎平台。它提供了单线程遇到 io 模型,它允许使用异步/事件的回调/非阻塞的方法,如中所示的并行运行的任务的业务流程图 1。Node.js 可视为轻量级的服务器,支持多个连接,而不需要大量的内存占用量。

Node.js—Single-Threaded Model Based on an Asynchronous/Event-Callback/Non-Blocking Approach
图 1 Node.js—Single 线程模型基于异步/事件的回调/非阻塞的方法

从部署的角度看,完整的 Node.js 引擎一个小的可执行文件中所载 — — 小于 5 MB — — 它可以安装在 Windows、 Linux 或 Mac OS X。它实现了一个高度模块化的体系结构,包括几个内置组件,例如,用于侦听 HTTP 和 TCP 端口、 提出要求,或访问文件系统。根据需要,使用节点 (故宫) 包管理器实用程序,可以下载附加模块,强烈的开放社会,所提供的。由于这种办法,很可能有一个 HTTP 服务器和五个行代码正在运行:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');}).listen(8080);
console.log('Server running on port 8080');

话虽如此,有几个重大挑战 Node.js 开发人员脸。首先,它会强制一种基于异步调用,在单个线程上运行的编程模型。这是从常规的编程,可为任务分配给多个线程的范式转变。如果不小心,程序员可以陷入困境,阻塞服务器或创建意外的代码的行为。第二项挑战被有关回调:代码可以变得臃肿和难以维护由于深度嵌套。最后,调试不是简单的特别是对于复杂的情况。即使有方法可以通过每个这些挑战,需要有意识的努力和学习。请记住 Node.js 是年轻 ; 幸运的是,有一个鲁棒社区的程序员的帮助,以及在线资源准备好如 howtonode.org

在一天结束,最佳的方法,来评估一项新技术是在现实世界中,遇到和解决问题。在这篇文章中我们提出两个方案具体基于云计算的使用 Node.js,与 Windows Azure 作为部署平台。如果你已经是一个客户端的 JavaScript 开发者,你就会落到地面,从语言的角度来看运行。

先决条件

在开始测试本文中介绍的解决方案之前,请确保您下载 Node.js Windows 安装程序,可以发现在 nodejs.org/download。安装程序将在您的 Windows 程序文件文件夹中放置两个主要文件:node.exe,这是 Node.js 运行时和故宫,这使您可以下载第三方的模块。要将 Node.js 解决方案部署到 Windows Azure,下载相应的命令行工具,你会发现在 windowsazure.com/en-us/develop/downloads。系统必备组件所特有的用例包含在每一节中。

部署 Node.js Windows Azure 应用程序

Windows Azure 提供了三种云部署模型的应用程序可以部署在任何八的微软全球数据中心:虚拟机 (Vm)、 云服务和 Web 站点。最适当的部署模型取决于规模、 控制能力和灵活性,您需要的级别。您为多个规模、 控制能力和灵活性付出的代价是更多的工作涉及部署和维护您的 Node.js 应用程序。Web 站点模型释放来自担心防火墙规则、 虚拟网络和操作系统的开发人员。当然,你放弃您的部署的细粒度控制当您选中此选项。

即使它是不可能涵盖所有类型的方案,在单个图表中, 图 2 显示决策树用于确定您的 Node.js 解决方案,基于由应用程序所需的基础架构和软件组件的部署位置。我们将使用它来确定在这篇文章的真实示例的 Windows Azure 部署模型。

Decision Tree for Deploying Node.js Applications to Windows Azure
图 2 部署 Node.js 应用程序的 Windows Azure 的决策树

真实的场景 1:实时 Web 通信之间 HTTP 客户端和服务器第一种方案说明了如何 Node.js 道理需要 Web 浏览器和 HTTP 服务器,如聊天解决方案、 社会媒体、 新闻行情收报器和视频游戏之间的实时通信的应用程序。传统上,开发人员通过使用不同的连接长期机制,包括长轮询和流媒体取得了这种类型的通信。最近,HTML5 规范已包含名为 WebSockets 上单个 TCP 连接,提供全双工通信信道的通信协议,但最常用的 Web 浏览器的最新版本才支持此选项。Node.js 应用程序可以支持通过第三方模块称为 socket.io,它支持多种类型的运输,包括 xhr 请求轮询和 WebSockets 的实时通信方案。Socket.io 基于事件驱动的方法,服务器与 Web 浏览器客户端,如所示图 3。足够的证据表明,在 bit.ly/NlDOv7

Real-Time Communication Between Web Browsers and HTTP Servers Using Node.js
图 3 实时 Web 浏览器和使用 Node.js 的 HTTP 服务器之间的通信

基本流程如下所示:

  1. Web 客户端连接到服务器,并同意上 (如 WebSockets,起始地址 (XHR) 长轮询或闪存的套接字) 的通信协议。
  2. Web 客户端将事件发送到 Node.js 服务器将通过 JavaScript,使用 socket.emit 方法。
  3. 服务器捕获事件,通过匹配由客户端发送到任何其 socket.on 定义中定义的函数的名称。
  4. 服务器可以响应客户端通过使用 socket.emit 方法,或广播消息给所有连接的客户端使用 socket.broadcast.emit。

这一点在图 4图 5,显示的服务器端代码和客户端代码,分别。该代码只是一个消息广播到所有连接的客户端。

图 4 建立实时通信的服务器端代码

// Include needed packages (socket.io and express)
var express = require('express');
var app = express()
  , http = require('http')
  , server = http.createServer(app)
  , io = require('socket.io').listen(server);
// REPLACE BELOW var port = var port = process.env.PORT || 8080;
// Allow connections on port 8080, or the environment port number
var port = process.env.PORT || 8080;
// At the time of this writing, WebSockets is not supported
// in Windows Azure Web Sites, which will force socket.io
// to fall back to a different communication protocol
// Prevent potential problems by specifying one, in this case, xhr-polling
io.set('transports', ['xhr-polling']);
// Listen for incoming requests
server.listen(port);
// Redirect request to index.html
app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});
// When connected and sendmessage is called by client,
// broadcast data sent by one client to all connected clients
io.sockets.on('connection', function (socket) {
  // When the client emits 'sendmessage,' the following method is triggered
  socket.on('sendmessage', function (data) {
    // Message is broadcast to all clients
    socket.broadcast.emit('displaymessage', data);
  });
});

图 5 建立实时通信的客户端代码

<html>
<head>
<script src="/socket.io/socket.io.js"></script>
<script>
  // Initialize the socket connection
  var socket = io.connect();
  // Ask client (browser input box) to enter text      
  function sendMessage(){
    socket.emit('sendmessage', prompt("Message to broadcast?"));
  }
  // Displaymessage event received at all clients
  // display in alert dialog box
  socket.on('displaymessage', function(data){
    alert(data);
  });
</script>
</head>
<body>
<!—Client sends user input to node.js server through the sendMessage JavaScript function-->
<input type="button" value="Broadcast new message" onClick="sendMessage();">
</body>
</html>

测试您的应用程序本地

请按照这些步骤来测试您的应用程序本地:

  1. 创建一个名为 {驱动器盘符}:/ / nodejs/插座的本地文件夹。
  2. 使用您首选的文本编辑器,创建一个名为 server.js 的文件。
  3. 中列出的代码复制并粘贴图 4 的服务器端。
  4. 在相同的目录中,创建名为 index.html 文件。
  5. 中列出的代码复制并粘贴图 5 的客户端。
  6. 打开命令提示符,并将目录更改为 {驱动器盘符}:/ / nodejs/插座。
  7. 请确保您连接到 Internet,并且类型故宫安装 socket.io。这将安装所需的 socket.io 模块。
  8. 类型故宫安装快递。快递是一个模块,简化了访问 HTTP 服务器功能,并可以方便地集成与 socket.io。
  9. 类型节点 server.js。
  10. 打开与 WebSockets 兼容的 Web 浏览器并输入 URL http://localhost:8080。
  11. 打开第二个 Web 浏览器选项卡或窗口,指向同一个 URL。
  12. 从第一次客户端发送一条消息将广播到所有其他客户端连接到服务器。

将您的解决方案部署到 Windows Azure

基于决策树的图 2,Windows Azure 网站是一个不错的选择,对于我们的应用程序 (Linux 不需要 ; 需要在操作系统中的没有额外组件 ; 且混合基础设施不需要运行解决方案)。请记住在写这篇文章的时候,WebSockets 不支持在 Windows Azure 网站,所以我们已经在我们指定的通信协议来使用的 socket.io—we 要为服务器和 Web 浏览器客户端之间的通信使用 xhr 请求轮询运输的代码中添加行。部署到 Windows Azure Web 站点的应用程序的最简单方法是使用 Git,它可以在下载 git-scm.com/下载。一旦您已安装,请转到 Windows Azure 门户 manage.windowsazure.com ,并创建一个新的空 Web 站点。如中所示,通过单击相应的选项,启用 Git 发布图 6

Enable Git Publishing for Your New Web Site

图 6 启用新 Web 站点的 Git 发布

几秒钟后,一个新的屏幕将出现,显示为您的 Web 站点的 Git 库的 URL。如果您还没有为您的帐户设置任何凭据,然而,您需要提供他们然后再继续。在窗体 https://WindowsAzureAccount@WebSiteName.scm.azurewebsites URL。net/WebSiteName.git。记录下来,因为它将在下一步的部署步骤中使用。那么请你执行本地测试,在继续之前因为模块需要先下载。(请注意还可以为 Mac 和 Linux,发现在使用命令行工具创建网站 bit.ly/RGCc3A.)一旦已创建您的 Web 站点,请按照这些步骤 Node.js 解决方案部署到 Windows Azure:

  1. 打开一个命令提示符并将您的当前文件夹更改为 {驱动器盘符}:/ / nodejs/插槽 (您在其中创建您的应用程序)。
  2. 键入 git init。这将创建本地的 Git 仓库,您的解决方案。
  3. 类型 git 添加。这将该解决方案添加到您新的本地存储库。
  4. 键入 git commit –m"初始承诺"。这将创建挂起的 Git 承诺。
  5. 类型 git 远程 azure {URLforGITRepository}。使用 Git URL 在您以前录制的 Windows Azure 门户网站中找到。
  6. 类型 git 推 azure 主控形状。输入您的密码要求时。
  7. 等到进展获取到 100%,然后您的解决方案是准备在云计算中使用。

真实的场景 2:为数据应用程序创建一个快速和稳健 rest 风格的 Web 服务层如我们在前面的文章中讨论的可以通过使他们交谈提供访问数据操作在后端的 Web 服务统一运行在不同的设备 (iOS、 Android、 Windows Phone) 上的移动解决方案。这通常需要一个数据层,提取或将信息插入到数据库中,或作为一个服务层,它将内部对象映射到用户界面对象 (通常以 JSON 格式)。尽管这可以通过使用 IIS 和 ASP.NET Web API 等框架等传统 Web 服务器实现,Node.js 提供了更简单的解决方案,此方案中,作为简单的控制器,委托到数据库引擎查询并返回响应在本机的 JSON 格式,由于其 JavaScript 性质 (见图 7)。

Node.js Provides a Web Service Layer to Data Apps
图 7 Node.js 提供 Web 服务层数据应用程序

从数据库中获取任何对象可以轻松地返回 JSON 格式,通过使用 res.json 方法。中的示例图 8 为 HTTP 服务器定义了好几个 rest 风格的电话、 从 SQL Server 数据库中读取数据并将结果返回 JSON 格式。

图 8 暴露充分 rest 风格的 API 为在 Windows Azure 上运行的 SQL Server 数据库

var sql = require('msnodesql');
var express = require('express');
var conn_str = "Driver={SQL Server Native Client 11.0};
  Server=[serverName].database.windows.
net,1433;Database=AdventureWorks2012;
  Trusted_Connection={No};
  Uid=[LoginForDb]@[serverName];Pwd=[Password];Encrypt=yes";
var app = express();
var port = process.env.PORT || 8080;
app.get('/', function(req,res) {sql.query(conn_str, "SELECT FirstName,
  LastName FROM Person.Person", function (err, results) {
    if (err)
      console.log(err);
    else
      res.json(results);
  })
});     
app.get('/lastname/:lastname', function(req,res) {sql.query(conn_str,
  "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE ?",
  [req.params.lastname], function (err, results) {
    if (err)
      console.log(err);
    else
    {
      for (var i = 0; i < results.length; i++) {
        res.json(results[i]);
      }
    }
  })
});
app.listen(port);
console.log("Server listening on port 8080");

若要测试此解决方案,AdventureWorks 数据库部署到 Windows Azure 按照下面的说明在 bit.ly/d0apaC。您需要修改连接字符串的示例中, 图 8 因此。若要部署到 Windows Azure 的示例,请遵循相同的步骤解释了在本地测试并部署到云计算的第一个方案。

这是最简单的方法公开为您在 Windows Azure 上运行的数据层充分 RESTful API。即使我们使用 SQL Server 数据库来说明这种情况下,很多其他的数据引擎都支持 Node.js,除其他外包括 Windows Azure 表存储、 MongoDB 和卡桑德拉。其中,像 MongoDB,有些是在 Windows Azure 存储中,方便集成与微软云计算,包括 Node.js 的应用程序部署的应用程序作为服务模型中提供的。

结束语

我们已经给你们看两个真实场景在 Node.js 可用于简单连接的任务,利用其单­螺纹的方法和由社区创建的模块。需要记住的重要一点是任何同步阻塞操作扰乱了此模型中,并应考虑到与此编写应用程序。在许多情况下,Node.js 可以与其他引擎,并行安装作为解决方案内的特定功能卸载服务器。此外,可以部署 Node.js 使用 Windows Azure 中的三个不同的模型所的可扩展性和所需的控制级别。

Bruno Terkaly 是 Microsoft 的开发推广人员。他的知识深度来源于多年来相关领域以及使用大量平台、语言、框架、SDK、库和 API 编写代码的经验。他不辞辛苦,就有关构建基于云的应用程序(特别是使用 Windows Azure 平台)编写代码、发布博客并给予现场演示。

Ricardo Villalobos 是一名资深的软件设计师,具有 15 年为供应链管理行业设计和创建应用程序的经验。他在从达拉斯大学工商管理持有不同的技术认证,以及硕士学位,微软作为一个云建筑师在 Windows Azure CSV 孵化组工作。

衷心感谢以下技术专家对本文的审阅:Glenn Block
格伦块确保它开放源码的开发踢屁股平台 Windows Azure 团队的工作原理。他不开发产品或与家庭,你会发现他在发布会上某个地方在世界中,黑客对一些新事物、 配对时谁与他能找到,或到作为夜凌晨网名 @gblock