本文章是由機器翻譯。

Windows Azure 內行人

Windows Azure 中 Node.js 的真實場景

Bruno Terkaly
Ricardo Villalobos

下載代碼示例

Bruno Terkaly, 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.NETWeb 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 為 Windows Azure 上運行的SQL Server資料庫展示一個完整 rest 風格的 API

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 是微軟的開發人員宣傳員。他淵博的知識是來自在該領域使用眾多平台、語言、架構、SDK、程式庫和 API 撰寫程式碼的多年經驗。他把時間投入在撰寫程式碼、部落格以及發表現場簡報,特別是使用 Windows Azure 平台。

Ricardo Villalobos 是經驗豐富的軟體架構設計師,在為供應鏈管理產業的公司設計和建立應用程式擁有 15 以上的經驗。他在從達拉斯大學工商管理持有不同的技術認證,以及碩士學位,微軟作為一個雲建築師在 Windows Azure CSV 孵化組工作。

感謝以下技術專家對本文的審閱中:Glenn Block
葛籣塊確保它開放源碼的開發踢屁股平臺 Windows Azure 團隊的工作原理。 他不開發產品或與家庭,你會發現他在發佈會上某個地方在世界中,駭客對一些新事物、 配對時誰與他能找到,或到作為夜淩晨網名 @gblock