Este artigo foi traduzido por máquina.

Windows Azure Insider

Cenários do mundo real para o Node. js no Windows Azure

Bruno Terkaly
Ricardo Villalobos

Baixar o código de exemplo

Bruno Terkaly, Ricardo VillalobosA citação popular, "se tudo que você tem é um martelo, tudo parece um prego," certamente aplica-se a arquitetura de software. Os melhores desenvolvedores, no entanto, entendem uma grande variedade de estruturas, linguagens de programação e plataformas para que eles podem projetar soluções que não só cumprir as necessidades dos negócios de imediato, mas também resultam em soluções que são escaláveis, fácil manutenção, extensível e reutilizáveis. Node. js estourou na cena há três anos, oferecendo mais uma ferramenta para a criação de sistemas de software de servidor que suportam aplicações escaláveis de Internet. Como todas as ferramentas de desenvolvimento, Node. js não é um martelo mágico e seus recursos devem ser totalmente entendidos, antes de decidir se é o direito apto para a solução na mão.

No caso de você novo node. js, é uma plataforma para construir aplicações de rede escalável, baseadas no motor JavaScript V8 de Google. Ele fornece um modelo single-threaded evented-io, que permite a orquestração de tarefas em execução em paralelo, usando uma abordagem assíncrona/evento-de retorno de chamada/sem bloqueio, conforme mostrado no Figura 1. Node. js pode ser visto como um servidor leve que oferece suporte a várias conexões sem a necessidade de um espaço de memória grande.

Node.js—Single-Threaded Model Based on an Asynchronous/Event-Callback/Non-Blocking Approach
Figura 1 modelo de segmentação Node.js—Single baseado em uma abordagem assíncrona/evento-Callback/Non-Blocking

De uma perspectiva de implantação, o motor completo do node. js está contido em um pequeno executável — menos que 5MB — que pode ser instalado em Windows, Linux ou Mac OS X. Ele implementa uma arquitetura altamente modular, incluindo alguns componentes internos, tais como aqueles para escutar em portas TCP e HTTP, fazer solicitações ou acessar o sistema de arquivos. Módulos adicionais, fornecidos por uma forte comunidade aberta, podem ser baixados conforme necessário, usando o utilitário Gerenciador de pacote nó (npm). Graças a essa abordagem, é possível ter um servidor HTTP e funcionando com cinco linhas de código:

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');

Dito isto, existem alguns desafios significativos face de desenvolvedores do node. js. Primeiro, ele força um modelo de programação baseado em chamadas assíncronas, executando em um único segmento. Esta é uma mudança de paradigma de programação convencional, onde as tarefas podem ser atribuídas a vários segmentos. Se não é tomado, programadores podem ficar em apuros, criando comportamentos de código inesperado ou bloquear o servidor. O segundo desafio está relacionado com retornos de chamada: Código pode se tornar pesado e difícil de manter devido a aninhamento profundo. Por último, a depuração não é simples, particularmente para cenários complexos. Embora existam abordagens para trabalhar através de cada um desses desafios, é preciso esforço consciente e aprendizagem. Tenha em mente que o Node. js é jovem; Felizmente, existe uma comunidade robusta de programadores prontos para ajudar, bem como recursos on-line tais como howtonode.org.

No final do dia, a melhor maneira de avaliar uma nova tecnologia é no mundo real, onde os problemas são encontrados e resolvidos. Neste artigo apresentamos dois cenários específicos baseados na nuvem usando o Node. js, com Windows Azure como a plataforma de implantação. Se você já é um desenvolvedor de JavaScript do lado do cliente, você bateu o chão fugindo de um ponto de vista de linguagem.

Pré-requisitos

Antes de iniciar o teste as soluções apresentadas neste artigo, certifique-se de você baixar o instalador do Windows de Node. js, que pode ser encontrado em nodejs.org/download. O instalador vai colocar dois principais arquivos na pasta arquivos de programa do Windows: node.exe, que é o tempo de execução do node. js, e o npm, que permite que você baixe módulos de terceiros. Para implantação de soluções de Node. js no Windows Azure, Baixe as ferramentas de linha de comando correspondentes, que você encontrará em windowsazure.com/en-us/develop/downloads. Pré-requisitos específicos para os casos de uso são incluídos em cada seção.

Implantando aplicativos de Node. js no Windows Azure

O Windows Azure oferece três modelos de implantação de nuvem para os aplicativos a serem implantados em qualquer um dos oito datacenters Microsoft globais: Máquinas virtuais (VMs), Cloud Services e Sites da Web. O modelo de implantação mais adequado depende do nível de escala, controle e flexibilidade que você precisa. O preço que você paga mais escala, controle e flexibilidade é que mais trabalho para implantar e manter seu aplicativo de Node. js. O modelo de Web Sites libera o desenvolvedor de se preocupar com regras de firewall, redes virtuais e sistemas operacionais. Naturalmente, você desistir de controle refinado de sua implantação quando você selecionar esta opção.

Mesmo que seja impossível cobrir todos os tipos de cenários em um único diagrama, Figura 2 mostra uma árvore de decisão para determinar onde implantar sua solução do node. js, baseada em componentes de software e de infra-estrutura exigidos pelo aplicativo. Vamos usar isso para determinar o modelo de implantação do Windows Azure para os exemplos neste artigo.

Decision Tree for Deploying Node.js Applications to Windows Azure
Figura 2 árvore de decisão para implantar aplicativos de Node. js no Windows Azure

Mundo real cenário 1: Servidores e clientes em tempo real de comunicação entre HTTP da Web o primeiro cenário ilustra como node faz sentido para aplicativos que precisam se comunicar em tempo real entre navegadores Web e servidores HTTP, como soluções de bate-papo, social media, tickers de notícias e jogos de vídeo. Tradicionalmente, os desenvolvedores conseguiram este tipo de comunicação por meio de diferentes mecanismos de conexão a longo prazo, incluindo long-sondagem e streaming. Mais recentemente, a especificação HTML5 incluiu um protocolo de comunicação chamado WebSockets que fornece canais de comunicação full-duplex sobre uma única conexão de TCP, mas este tem suporte apenas com as versões mais recentes dos navegadores mais comuns. Aplicações de Node. js podem oferecer suporte a cenários de comunicação em tempo real através de um módulo de terceiros chamado socket.io, que suporta vários tipos de transportes, incluindo xhr-sondagem e WebSockets. Socket.IO é baseado em uma abordagem orientada a eventos entre o servidor e os clientes de navegador da Web, como descrito em Figura 3. É bem documentado no bit.ly/NlDOv7.

Real-Time Communication Between Web Browsers and HTTP Servers Using Node.js
Figura 3 em tempo real comunicação entre navegadores e servidores HTTP usando o Node. js

O fluxo básico é o seguinte:

  1. O cliente da Web se conecta ao servidor e está de acordo com um protocolo de comunicação (como WebSockets, XMLHttpRequest (XHR), soquetes de long-sondagem ou flash).
  2. O cliente da Web envia um evento para o servidor de Node. js via JavaScript, utilizando o método de socket.emit.
  3. O servidor captura o evento combinando o nome da função enviada pelo cliente para aquele definido em qualquer uma das suas definições de socket.on.
  4. O servidor pode responder ao cliente usando o método de socket.emit, ou transmitir mensagens a todos os clientes conectados usando socket.broadcast.emit.

Isso é ilustrado no Figura 4 e Figura 5, que mostra o código do lado do servidor e código do cliente, respectivamente. O código simplesmente transmite uma mensagem a todos os clientes conectados.

Figura 4 código do lado do servidor para estabelecer a comunicação em tempo real

// 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);
  });
});

Figura 5 código do lado cliente para estabelecer a comunicação em tempo real

<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>

Teste seu aplicativo localmente

Siga estas etapas para testar seu aplicativo localmente:

  1. Crie uma pasta local chamada {letra}: / / nodejs/soquetes.
  2. Usando seu editor de texto preferido, crie um arquivo chamado server.js.
  3. Copie e cole o código relacionado em Figura 4 para o lado do servidor.
  4. No mesmo diretório, crie um arquivo chamado index. html.
  5. Copie e cole o código relacionado em Figura 5 para o lado do cliente.
  6. Abra um prompt de comando e altere o diretório para {letra}: / / nodejs/soquetes.
  7. Certificar-se de que você está conectado à Internet, e instalar o tipo npm socket.io. Isto irá instalar o módulo de socket.io necessário.
  8. Npm tipo instalar express. Express é um módulo que simplifica o acesso para as funções de servidor HTTP e pode ser facilmente integrado com socket.io.
  9. Tipo nó server.js.
  10. Abra um navegador da Web compatível com WebSockets e digite a URL http://localhost:8080.
  11. Abra uma segunda aba do navegador da Web ou janela, apontando para a mesma URL.
  12. Uma mensagem enviada a partir do primeiro cliente será transmitida a todos os clientes conectados ao servidor.

Implantando sua solução no Windows Azure

Com base na árvore de decisão em Figura 2, Sites da Web do Windows Azure é uma boa opção para a nossa aplicação não (Linux é necessária; sem componentes adicionais no sistema operacional são necessários; e uma infra-estrutura híbrida não é necessária para executar a solução). Tenha em mente que no momento da redação deste texto, WebSockets não é suportado no Windows Azure Web Sites, então nós adicionamos uma linha em nosso código que especifica o protocolo de comunicação a ser usado pelo socket.io—we quer usar o transporte de xhr-sondagem para a comunicação entre o servidor e os clientes de navegador da Web. A maneira mais fácil de implantar um aplicativo para Windows Azure Web Sites é usando o Git, o qual pode ser baixado em git-scm.com/download. Depois que você tiver instalado, vá para o portal do Windows Azure no manage.windowsazure.com e crie um novo Site vazio. Habilitar publicação do Git, clicando na opção correspondente, como mostrado na Figura 6.

Enable Git Publishing for Your New Web Site
Figura 6 permitir publicação de Git para seu novo Site

Depois de alguns segundos, uma nova tela aparecerá, mostrando a URL do repositório Git para seu Web Site. Se você não configurar as credenciais para sua conta ainda, você precisará fornecê-los antes de continuar. A URL é https://WindowsAzureAccount@WebSiteName.scm.azurewebsites o formulário. net/WebSiteName.git. Gravá-lo, porque ele será usado nas próximas etapas de implantação. Não se esqueça que você executou o teste local antes de continuar, porque os módulos precisam ser baixados primeiro. (Note que Web Sites também podem ser criadas usando a ferramenta de linha de comando para Mac e Linux, encontrado em bit.ly/RGCc3A.) Uma vez que seu Site tiver sido criado, siga estas etapas para implantar sua solução do node. js no Windows Azure:

  1. Abra um prompt de comando e altere a pasta atual para {letra}: / / nodejs/soquetes (onde você criou seu aplicativo).
  2. Tipo git init. Isso cria um repositório Git local para sua solução.
  3. Adicionar o tipo git. Isso adiciona a solução para seu novo repositório local.
  4. Digite git commit – m "inicial compromisso." Isso cria um compromisso pendente do Git.
  5. Digite git remoto azure {URLforGITRepository}. Use o URL de Git encontrado no portal do Windows Azure, que você gravou anteriormente.
  6. -Tipo git push azure mestre. Digite sua senha quando solicitado.
  7. Aguarde até que o progresso chega a 100 por cento, e, em seguida, sua solução está pronta para ser usado na nuvem.

Mundo real cenário 2: Criação de uma forma rápida e robusta camada de serviço Web RESTful para aplicações de dados como discutimos em artigos anteriores, as soluções móveis executados em dispositivos diferentes (iOS, Android, Windows Phone) podem ser unificadas, fazendo-os falar para serviços da Web que fornecem acesso para operações de dados no back-end. Isso geralmente requer uma camada de dados que extrai ou insere informações de ou para o banco de dados, bem como uma camada de serviço que mapeia objetos internos para objetos de interface do usuário (normalmente no formato JSON). Mesmo que isto pode ser conseguido usando os tradicionais servidores Web como o IIS e frameworks, como o ASP.NET Web API, Node. js oferece uma solução mais simples para este cenário, atuando como um orquestrador simples que delega as consultas para o mecanismo de banco de dados e envia respostas para trás no formato JSON nativo, devido à sua natureza de JavaScript (ver Figura 7).

Node.js Provides a Web Service Layer to Data Apps
Node. js Figura 7 fornece uma camada de serviço da Web para aplicativos de dados

Todos os objetos obtidos a partir do banco de dados podem ser facilmente retornados no formato JSON, usando o método de res.json. O exemplo em Figura 8 define um par de chamadas RESTful para o servidor HTTP, lê dados de um banco de dados do SQL Server e retorna os resultados no formato JSON.

Figura 8 expor uma API RESTful completo para um banco de dados do SQL Server em execução no Windows Azure

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");

Para testar esta solução, implantar o banco de dados AdventureWorks para o Windows Azure, seguindo as instruções em bit.ly/d0apaC. Você precisará modificar a seqüência de conexão no exemplo em Figura 8 nesse sentido. Para implantar o exemplo para o Windows Azure, siga os mesmos passos explicados no primeiro cenário para testar localmente e implantação para a nuvem.

Esta é a maneira mais simples de expor uma API RESTful completo para sua camada de dados em execução no Windows Azure. Mesmo que nós usamos um banco de dados do SQL Server para ilustrar este cenário, muitos outros motores de dados são suportados em node. js, incluindo a tabela de armazenamento do Windows Azure, MongoDB e Cassandra, entre outros. Alguns deles, como MongoDB, são oferecidos em um modelo de como um serviço no armazenamento do Windows Azure, que facilita a integração com aplicativos implantados na nuvem Microsoft, incluindo aplicações de Node. js.

Resumo

Nós mostramos-lhe dois cenários do mundo real, onde node pode ser usado para tarefas simples de conectividade, aproveitando seu único -­abordagem e módulos criados pela Comunidade. A coisa importante a lembrar é que qualquer operação de bloqueio síncrona interrompe este modelo e aplicações devem ser escritas com isso em mente. Em muitos casos, Node. js pode ser instalado lado a lado com outros motores, atuando como um servidor de descarregamento para uma funcionalidade específica dentro da solução. Além disso, Node. js pode ser implantado usando três modelos diferentes no Windows Azure, dependendo do nível de escalabilidade e controle necessário.

Get help building your Azure app!

Bruno Terkaly é desenvolvedor e divulgador da Microsoft. Seu profundo conhecimento é fruto de anos de experiência no campo, escrevendo código com uma grande quantidade de plataformas, linguagens, estruturas, SDKs, bibliotecas e APIs. Ele passa seu tempo escrevendo código, escrevendo blogs e fazendo apresentações ao vivo sobre como criar aplicativos baseados na nuvem, especificamente usando a plataforma Windows Azure.

Ricardo Villalobos is a seasoned software architect with more than 15 years of experience designing and creating applications for companies in the supply chain management industry. Detentor de diferentes certificações técnicas, e mestre em administração pela Universidade de Dallas, ele trabalha como arquiteto de nuvem no grupo de incubação do Windows Azure CSV para a Microsoft.

Agradecemos ao seguinte especialista técnico pela revisão deste artigo: Glenn Block
Glenn Block trabalha na equipe do Windows Azure, certificar-se de que é uma plataforma para o desenvolvimento de código aberto. Quando ele não está desenvolvendo produtos ou com a família, você encontrará ele em uma conferência em algum lugar do mundo, hacking longe em alguma coisa nova, emparelhando-se com quem ele pode encontrar, ou twittar até altas horas da noite como @gblock.