Compartir a través de


Este artículo proviene de un motor de traducción automática.

Windows Azure Insider

Escenarios reales para Node.js en Windows Azure

Bruno Terkaly
Ricardo Villalobos

Descargar el ejemplo de código

Bruno Terkaly, Ricardo VillalobosLa popular frase: "si todo lo que tienes es un martillo, todo parece un clavo," ciertamente se aplica a la arquitectura de software.Los mejores desarrolladores, sin embargo, comprender una amplia variedad de Marcos, lenguajes de programación y plataformas por lo que pueden diseñar soluciones que no sólo cumplir con requerimientos del negocio inmediato, pero también dan lugar a soluciones que sean escalables, mantenible, extensible y reutilizable.Node.js irrumpió en la escena hace tres años, ofreciendo otra herramienta para la creación de sistemas de software de servidor que soportan aplicaciones escalables de Internet.Como todas las herramientas de desarrollo, Node.js no es un martillo mágico, y sus capacidades deben entenderse completamente antes de decidir si es el derecho apropiado para la solución a la mano.

Si eres nuevo en Node.js, es una plataforma para crear aplicaciones de red escalable, basados en el motor de JavaScript V8 de Google.Proporciona un modelo único subproceso evented-io, que permite la coordinación de tareas que se ejecutan en paralelo con un enfoque asincrónica/evento-callback/no-bloqueo como se muestra en figura 1.Node.js puede verse como un servidor ligero que soporta múltiples conexiones sin necesidad de un espacio de memoria de gran capacidad.

Node.js—Single-Threaded Model Based on an Asynchronous/Event-Callback/Non-Blocking Approach
Figura 1 modelo de subprocesamiento Node.js—Single basado en un enfoque asincrónica/evento-Callback/Non-Blocking

Desde una perspectiva de despliegue, el motor completo de Node.js está contenido en un pequeño ejecutable — menos de 5 MB, que puede ser instalado en Windows, Linux o Mac OS X.Implementa una arquitectura altamente modular, incluyendo algunos componentes, tales como para escuchar a los puertos HTTP y TCP, hacer peticiones o acceder al sistema de archivo.Pueden descargar módulos adicionales, proporcionados por una fuerte comunidad abierta, según sea necesario, usando la herramienta de gestor de paquetes de nodo (MNP).Gracias a este enfoque, es posible tener un servidor HTTP para arriba y funcionando con cinco líneas 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');

Dicho esto, hay algunos desafíos significativos Node.js cara de desarrolladores. En primer lugar, obliga a un modelo de programación basado en llamadas asincrónicas, corriendo en un único subproceso. Se trata de un cambio de paradigma de programación convencional, donde se pueden asignar tareas a varios subprocesos. Si no se tiene cuidado, pueden conseguir programadores en problemas, bloqueando el servidor o crear comportamientos inesperados código. El segundo desafío se relaciona con las devoluciones de llamada: Código puede llegar a ser difíciles de manejar y difícil de mantener por anidamiento profundo. Por último, depuración no es simple, particularmente para escenarios complejos. Aunque hay enfoques para trabajar a través de cada uno de estos desafíos, requiere un esfuerzo consciente y aprendizaje. Tenga en cuenta que Node.js es joven; Afortunadamente, existe una fuerte comunidad de programadores listo para ayuda, así como recursos en línea como howtonode.org.

Al final del día, la mejor forma de evaluar una nueva tecnología es en el mundo real, donde los problemas son encontrados y solucionados. En este artículo presentamos dos escenarios específicos basados en la nube con Windows Azure como la plataforma de despliegue de Node.js. Si ya eres un desarrollador de JavaScript del lado cliente, te golpeas el suelo desde un punto de vista de la lengua.

Requisitos previos

Antes de empezar a probar las soluciones presentadas en este artículo, asegúrese de descargar el instalador de Node.js Windows, que puede encontrarse en nodejs.org/download. El instalador colocará dos principales archivos en la carpeta archivos de programa de Windows: node.exe, que es el tiempo de ejecución de Node.js, y la nueva gestión pública, que te permite descargar módulos de terceros. Para implementar soluciones de Node.js para Windows Azure, descargar las herramientas de línea de comandos correspondientes, que se encuentra en windowsazure.com/en-us/develop/downloads. Requisitos específicos para los casos de uso se incluyen en cada sección.

Implementar aplicaciones de Node.js a Windows Azure

Windows Azure ofrece tres modelos de implementación de nube para aplicaciones que se desplegarán en cualquiera de los ocho centros de datos globales Microsoft: Máquinas virtuales (VMs), nube de servicios y sitios Web. El modelo de implementación más adecuado depende del nivel de la escala, el control y la flexibilidad que necesita. El precio que pagas de más escala, control y flexibilidad es la que más trabajo interviene para implementar y mantener la aplicación Node.js. El modelo de sitios Web libera el desarrollador de la preocupación de las reglas del cortafuegos, redes virtuales y sistemas operativos. Naturalmente, usted renuncia un control detallado de su implementación al seleccionar esta opción.

A pesar de que es imposible cubrir todos los tipos de escenarios en un mismo diagrama, figura 2 muestra un árbol de decisión para determinar cómo implementar su solución de Node.js, basada en componentes de infraestructura y software requeridos por la aplicación. Lo usaremos para determinar el modelo de implementación de Windows Azure para los ejemplos del mundo real en este artículo.

Decision Tree for Deploying Node.js Applications to Windows Azure
Figura 2 árbol de decisión para implementar aplicaciones de Node.js a Windows Azure

Escenario del mundo real 1: Servidores y clientes en tiempo real de comunicación Web entre HTTP el primer escenario ilustra cómo Node.js tiene sentido para las aplicaciones que requieren una comunicación en tiempo real entre los navegadores Web y servidores HTTP, tales como soluciones de chat, redes sociales, tickers de noticias y video juegos. Tradicionalmente, los desarrolladores han logrado este tipo de comunicación utilizando diversos mecanismos de conexión a largo plazo, incluyendo largo-votación y streaming. Más recientemente, la especificación de HTML5 ha incluido un protocolo de comunicación llamado WebSockets que ofrece canales de comunicación full-duplex sobre una única conexión TCP, pero esto sólo es apoyada por las últimas versiones de los navegadores más comunes. Node.js aplicaciones pueden soportar escenarios de comunicación en tiempo real a través de un módulo de terceros llamado socket.io, que soporta múltiples tipos de transportes, incluyendo xhr-votación y WebSockets. Socket.IO se basa en un enfoque orientado a evento entre el servidor y los clientes de explorador Web, como se muestra en figura 3. Está bien documentado en bit.ly/NlDOv7.

Real-Time Communication Between Web Browsers and HTTP Servers Using Node.js
Figura 3 comunicación en tiempo real entre los navegadores Web y servidores HTTP utilizando Node.js

El flujo básico es el siguiente:

  1. El cliente Web se conecta al servidor y está de acuerdo con un protocolo de comunicación (por ejemplo, WebSockets, XMLHttpRequest (XHR), tomas de largo-interrogación o flash).
  2. El cliente Web envía un evento al servidor Node.js vía JavaScript, utilizando el método socket.emit.
  3. El servidor captura el evento haciendo coincidir el nombre de la función que envía el cliente al que define en cualquiera de sus definiciones de socket.on.
  4. El servidor puede responder al cliente mediante el método socket.emit o transmiten mensajes a todos los clientes conectados mediante socket.broadcast.emit.

Esto se ilustra en figura 4 y figura 5, que muestran el código de servidor y cliente, respectivamente. El código simplemente emite un mensaje a todos los clientes conectados.

Figura 4 código del lado del servidor para establecer comunicación en tiempo 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 del lado del cliente para establecer comunicación en tiempo 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>

Probar su aplicación localmente

Siga estos pasos para probar la aplicación localmente:

  1. Cree una carpeta local llamada {Letra}: / / investigación/zócalos.
  2. Usando su editor de textos preferido, cree un archivo denominado server.js.
  3. Copiar y pegar el código que aparece en figura 4 para el lado del servidor.
  4. En el mismo directorio, cree un archivo denominado index.html.
  5. Copiar y pegar el código que aparece en figura 5 para el lado del cliente.
  6. Abra un símbolo y cambie el directorio a {letra}: / / investigación/tomas.
  7. Asegúrese de que está conectado a Internet y tipo npm instalar socket.io. Esto instalará el módulo requiere socket.io.
  8. Tipo npm instalar expresa. Express es un módulo que simplifica el acceso a las funciones de servidor HTTP y puede ser fácilmente integrado con socket.io.
  9. Tipo nodo server.js.
  10. Abra un navegador Web compatible con WebSockets e introduzca la URL http://localhost:8080.
  11. Abra una segunda pestaña del navegador de Web o ventana, apuntando a la misma URL.
  12. Un mensaje enviado desde el primer cliente se transmitirá a todos los clientes conectados al servidor.

Implementar su solución a Windows Azure

Basado en el árbol de decisión en figura 2, sitios Web de Windows Azure es una buena opción para nuestra aplicación (Linux no se requiere; no se necesitan componentes adicionales en el sistema operativo; y una infraestructura de híbrido no es necesaria ejecutar la solución). Tenga en cuenta que en el momento de escribir esto, WebSockets no se admite en Windows Azure sitios Web, así que hemos añadido una línea en nuestro código que especifica el protocolo de comunicación para ser usado por socket.io—we desea utilizar el transporte xhr-votación para la comunicación entre el servidor y los clientes de explorador de Web. La forma más fácil para implementar una aplicación para sitios Web Windows Azure es mediante Git, que puede descargarse en scm.com/git-descargar. Una vez que lo tienes instalado, vaya al portal de Windows Azure en manage.windowsazure.com y crear un nuevo sitio Web vacía. Habilitar Git publicación haciendo clic en la opción correspondiente, como se muestra en figura 6.

Enable Git Publishing for Your New Web Site
Figura 6 permiten publicación Git para su nuevo sitio Web

Después de unos segundos, aparecerá una nueva pantalla, mostrando la URL en el repositorio Git para su sitio Web. Si no configura ninguna credencial para su cuenta, sin embargo, usted necesitará proporcionar antes de continuar. La dirección URL tiene la forma https://WindowsAzureAccount@WebSiteName.scm.azurewebsites. net/WebSiteName.git. Grabarlo, ya que se utilizará en los próximos pasos de implementación. Asegúrese de que ejecuta la prueba local antes de continuar, porque los módulos necesitan descargarse primero. (Tenga en cuenta que también puede crear sitios Web utilizando la herramienta de línea de comandos para Mac y Linux, en bit.ly/RGCc3A.) Una vez que se ha creado su sitio Web, siga estos pasos para implementar su solución Node.js en Windows Azure:

  1. Abra un símbolo del sistema y cambiar su actual carpeta {Letra}: / / investigación/tomas (donde creó su aplicación).
  2. Tipo git init. Esto crea un repositorio Git local para su solución.
  3. Tipo git add. Esto suma la solución a su nuevo repositorio local.
  4. Tipo git commit corredera "inicial compromiso." Esto crea un compromiso pendiente de Git.
  5. Tipo git remoto azul {URLforGITRepository}. Utilizar la URL de Git, encontrado en el portal de Windows Azure, que usted previamente grabado.
  6. Maestro de tipo git push azul. Introduzca su contraseña cuando se le solicite.
  7. Espere hasta que el progreso llegue a 100 por ciento, y entonces la solución está lista para ser utilizado en la nube.

Escenario del mundo real 2: Crear una rápida y sólida capa de servicios Web RESTful para aplicaciones de datos como hemos analizado en artículos anteriores, soluciones móviles que se ejecutan en diferentes dispositivos (iOS, Android, Windows Phone) pueden ser unificadas por hacerlas hablar a servicios Web que proporcionan acceso a las operaciones de datos en el back-end. Esto requiere generalmente una capa de datos que extrae o inserta información desde o hacia la base de datos, así como una capa de servicio que asigna objetos internos a objetos de la interfaz de usuario (generalmente en formato JSON). Aunque esto puede lograrse mediante el uso tradicionales servidores Web como IIS y marcos como la API de Web ASP.NET , Node.js ofrece una solución más simple para este escenario, actuando como un simple orquestador que delega las consultas para el motor de base de datos y envía respuestas posteriores en formato JSON, debido a su naturaleza de JavaScript (ver figura 7).

Node.js Provides a Web Service Layer to Data Apps
Figura 7 Node.js proporciona una capa de servicios Web para aplicaciones de datos

Los objetos obtenidos de la base de datos pueden entregarse fácilmente en formato JSON mediante el método res.json. En el ejemplo de figura 8 define un par de llamadas de descanso para el servidor HTTP, Lee los datos de una base de datos de SQL Server y devuelve los resultados en formato JSON.

Figura 8 exponer un completo descanso API para una base de datos SQL Server en 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 probar esta solución, implementar la base de datos AdventureWorks en Windows Azure siguiendo las instrucciones en bit.ly/d0apaC.Usted necesitará modificar la cadena de conexión en el ejemplo de figura 8 en consecuencia.Para implementar el ejemplo para Windows Azure, siga los mismos pasos explicados en el primer escenario de prueba localmente e implementación a la nube.

Se trata de la forma más sencilla para exponer una API RESTful completo para su capa de datos que se ejecuta en Windows Azure.A pesar de que se utilizó una base de datos del SQL Server para ilustrar esta situación, muchos otros motores de datos admiten Node.js, incluyendo la tabla de almacenamiento de Windows Azure, MongoDB y Casandra, entre otros.Algunos de ellos, como MongoDB, ofrecen un modelo Software-as-a-service en la tienda de Windows Azure, que facilita la integración con aplicaciones en la nube de Microsoft, incluyendo aplicaciones de Node.js.

Terminando

Hemos demostrado dos escenarios reales donde Node.js puede ser utilizado para tareas de conectividad sencilla, aprovechando su single -­rosca de enfoque y módulos creados por la comunidad.Lo importante a recordar es que cualquier operación sincrónica de bloqueo interrumpe este modelo, y aplicaciones se deben escribir con esto en mente.En muchos casos, Node.js puede ser instalado side-by-side con otros motores, actuando como un servidor de descarga para funcionalidades específicas dentro de la solución.También, se pueden implementar Node.js utilizando tres diferentes modelos en Windows Azure, dependiendo del nivel de escalabilidad y control requerido.

Bruno Terkaly es un evangelista de desarrollador de Microsoft. Su profundidad de conocimiento proviene de años de experiencia en el campo, escribir código con una multitud de plataformas, idiomas, Marcos, SDK, bibliotecas y APIs. Pasa escribir código de tiempo, blogging y dando presentaciones en vivo en la construcción de aplicaciones basadas en la nube, específicamente con la plataforma Windows Azure.

Ricardo Villalobos es un arquitecto de software experimentado con más de 15 años de experiencia en diseño y creación de aplicaciones para empresas en la industria de gestión de cadena de suministro. Sostiene diferentes certificaciones técnicas, así como una maestría en administración de empresas de la Universidad de Dallas, trabaja como un arquitecto de la nube en el grupo de incubación de Windows Azure CSV para Microsoft.

Gracias a los siguientes expertos técnicos por su ayuda en la revisión de este artículo: Glenn Block
Glenn Block trabaja en el equipo de Windows Azure para asegurarse que sea una plataforma de culo de retroceso para el desarrollo de código abierto.Cuando no está desarrollando productos o con familia, encontrará lo en una conferencia en algún lugar del mundo, hacking lejos en algo nuevo, emparejando con quien él puede encontrar, o twitteando hasta altas horas de la noche como @gblock.