Este artigo foi traduzido por máquina.

Sites do Azure

Criar um serviço Web Node.js e MongoDB

Erick Redkar

Baixar o código de exemplo

A nuvem é neutra para todas as línguas. Na nuvem, não importa se os apps que você executar são node. js, ASP.NET, Java ou PHP, porque a nuvem fornece uma infra-estrutura de ready-made para executá-los. A religião da nuvem é a agilidade, e agilidade permite que você implementar novas idéias rapidamente e o pôr do sol, os que não trabalham no mercado. Nos últimos anos, Node. js ganhou popularidade entre uma nova classe de desenvolvedores que favorecem o paradigma de programação assíncrono. Node. js é um mecanismo de tempo de execução de JavaScript para criação de aplicativos cliente e servidor. Ele inclui um assíncrono i/o framework que ajuda a lidar com milhares de conexões simultâneas em um único segmento com CPU mínima ou sobrecarga de memória. É um mito popular que node. js é um framework de desenvolvimento Web; na verdade, é um mecanismo de tempo de execução Simples-threaded para a execução de código JavaScript. Tem uma arquitetura baseada em módulo que permite a qualquer pessoa criar e publicar um módulo para lidar com tarefas específicas, como desenvolvimento Web ou acessando um banco de dados MongoDB. Por exemplo, o mecanismo de modelo Express é uma estrutura de aplicativo Web, que você pode baixar como um módulo em node. js. O núcleo do motor de Node. js é construído em C++ sobre o motor de JavaScript V8 de Google, que foi projetado para o navegador Chrome. Node. js é suportado no Microsoft Azure Web Sites, e a Microsoft também fornece ferramentas de desenvolvimento e um SDK nativo para programação com APIs do Azure. Há um centro dedicado colaborador de Node. js no Portal do Azure em bit.ly/1iupElQ.

Neste artigo, mostrarei como desenvolver um serviço Web RESTful em node. js que acessa um banco de dados MongoDB na nuvem e como implantá-lo para Sites Web de Azure.

Node. js é baseado em um modelo de desenvolvimento assíncrono, o que significa que cada chamada de método que fazer requer um retorno de chamada para receber a resposta. Embora os desenvolvedores .NET preferem tradicionalmente chamadas de método síncrono (solicitação-resposta), recursos assíncronos sempre existiram no Microsoft .NET Framework. Com a inclusão da nova async-aguardam o modelo de programação do .NET Framework, aplicativos assíncronos tornaram-se a norma em toda a Web e aplicações móveis. Em programação assíncrona, a função chamada assina o evento de retorno de chamada e fornece um delegate para processar a resposta. A função de retorno de chamada é chamada quando o processamento estiver concluído. É como um e-mail comparado a um telefonema.

A seguir mostra um simples servidor Web node. js que retorna uma seqüência de caracteres quando chamado:

var http = require("http");
http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type":
  "text/plain"});
  response.write("Hello MSDN");
  response.end();
}).listen(8080);

Observe que a função de resposta é chamada quando um evento de solicitação HTTP é acionado. A função exige é usada para o carregamento de módulos, semelhantes ao namespaces de carregamento de módulos (assemblies) no .NET Framework.

Tem havido muitas discussões e argumentos religiosos na ASP.NET versus node. js, mas não vou tocar esse tópico neste artigo. Minha abordagem tem sido sempre usar a melhor ferramenta para o trabalho, e com o que você é bom em fazer seu melhor.

Processamento de solicitação de Node. js

Como Figura 1 mostra, o motor de Node. js inicia um thread único para controlar as conexões simultâneas de cliente. Como já foi inicializado o thread único, não há nenhuma inicialização sobrecarga necessária para o processamento qualquer aumento dos pedidos, porque o thread rapidamente delega a solicitação de forma assíncrona para um thread de trabalho para processamento.

Node.js Request-Response Orchestration
Figura 1 orquestração de solicitação-resposta do node. js

Se o HTTP solicitar incudes uma tarefa demorada ou alta utilização de e/S, como acessar banco de dados ou uma chamada de serviço Web, ele é executado de forma assíncrona em threads de trabalho sem bloqueio. Uma vez concluída a tarefa de longa duração, os threads de trabalho retornam os resultados como um retorno de chamada para o thread principal. O thread principal, em seguida, retorna o resultado para o cliente. Um importante­tant conceito compreender aqui é que o único segmento de recebimento está sempre disponível para receber solicitações e não manter-se ocupado com o processamento porque processamento é delegado para os threads de trabalho.

Componentes principais do node. js

Node. js é composto por dois componentes principais:

Núcleo/Kernel: O kernel do node. js é escrito em C++ em cima o motor JavaScript V8 de Google. O próprio núcleo é simples-threaded e é capaz de balanceamento entre CPUs. Node. js é open source e você pode obter o código-fonte de github.com/joyent/node.

Módulos: Módulos são semelhantes aos pacotes NuGet no .NET Framework. O Node. js Gerenciador de Pacotes (NPM) é a ferramenta para gerenciar pacotes de Node. js no seu ambiente de desenvolvimento. Módulos de geram novos processos ou threads dependendo da intensidade de I/O da tarefa. Entre os módulos populares são HTTP, MongoDB, Express (um quadro do modelo de Web) e Socket.IO. Para obter uma lista dos módulos popular, visite por favor nodejsmodules.org.

Instalando e executando localmente o Node. js

Antes de executar qualquer site da Web node. js na nuvem, eu recomendo experimentá-lo localmente para se sentir confortável com a plataforma. Você pode instalar e executar o Node. js em uma plataforma Windows em apenas três passos:

  1. Baixe e instale o Node. js: Node. js Windows installer pode ser baixado e instalado a partir de nodejs.org/#download. O instalador instala o runtime de Node. js e NPM.
  2. Crie um servidor simples: Para criar um servidor HTTP em node. js, abra seu editor de texto favorito, copie o código do Figura 1e salve o arquivo como webserver.js. O código mostrado anteriormente cria um servidor de Web minimalista que escuta na porta 8080 e responde com a mesma seqüência para cada solicitação.
  3. Execute o servidor HTTP: Finalmente, para executar o servidor, abra o prompt de comando, navegue até a pasta onde você salvou o arquivo webserver.js e digite o seguinte:
    > "C:\Program Files\nodejs\node.exe" webserver.js
  4. Este comando inicia o servidor da Web, e você pode testá-lo navegando seu navegador para http://localhost:8080/. Este servidor simples deve dar confiança suficiente para experimentar o Node. js como opção para desenvolvimento de Web sites.

Execução de Node. js no Azure Web Sites

Quando eu usei node. js, decidi evitar tanto quanto possível da linha de comando. Tendo vivido minha vida no Visual Studio, valorizo muito a produtividade, que você pode conseguir usando um IDE. Felizmente, a Microsoft investiu no WebMatrix, uma ferramenta poderosa para devel­erguendo node. js aplicações no Windows. A equipe de Visual Studio lançou também as ferramentas de Node. js para Visual Studio (nodejstools.codeplex.com). Para o restante deste artigo, vou usar o WebMatrix como minha ferramenta de desenvolvimento primário. Do WebMatrix, você pode instalar pacotes NPM, publicar sites da Web para o Azure e também executá-los localmente. WebMatrix também instala o IISNode para o IIS Express, que permite hospedar o aplicativo de Node. js no IIS. Você pode obter mais detalhes sobre o IISNode no github.com/tjanczuk/iisnode.

Antes de criar um serviço Web RESTful completo, vou te mostrar como publicar um site simples para Azure do WebMatrix.

Crie um novo Site do Azure você pode criar um novo Web site no Azure no portal do Azure, como ilustrado no Figura 2.

Create a New Azure Web Site
Figura 2 criar um novo Site azul

O Portal irá criar um novo site com um nome exclusivo na região que você especificar. A região é importante para colocalizar seu site da Web, bancos de dados e outros serviços no mesmo datacenter. Dados que deixa um datacenter são cobrados.

Crie um Site Express Express é um framework Web para node. js. Ele segue o padrão Model-View-Controller (MVC) e, portanto, permite-lhe estabelecer rotas para a construção de sites da Web MVC de Node. js, bem como serviços Web RESTful. Você pode baixar o expresso de expressjs.com.

Se você ama o desenvolvimento .NET em Visual Studio, eu recomendo dominando o WebMatrix para desenvolver aplicativos de Node. js. WebMatrix 3 inclui um modelo útil, pré-construídos do Express. Abra-o e clique em New | Galeria de modelos. Então, sob a categoria de Node. js, selecione o modelo de Site Express, como mostrado em Figura 3.

Especifique um nome do site e clique em avançar para instalar o IISNode e o modelo de Site Express.

Express Site Template
Figura 3 modelo de Site Express

O servidor de Node. js que eu construí anteriormente não são executadas no Azure Web Sites porque a infraestrutura Azure Web Sites depende do IIS para sites da Web em execução. Portanto, para executar um site da Web node. js, preciso a integração entre o IIS e node. js que fornece IISNode.

Figura 4 ilustra a estrutura do arquivo criada pelo modelo Express e o código-fonte para server.js.

Express File Structure
Figura 4 estrutura de arquivo expressa

Observe que o expresso e módulos de rotas se importados automaticamente. Eu vou usar esses módulos para construir os serviços REST.

Executando o Web Site localmente seguir minha recomendação anterior, clique no botão Executar no WebMatrix para testar o site em sua máquina local. Se a instalação foi bem-sucedida, você deve ver a homepage Express.

Modelo expresso também instala o motor modelo Jade. Jade é um mecanismo de modelo HTML e é usado para construir os pontos de vista gerados a partir do quadro de Express. Jade é expressar o que está a navalha para ASP.NET MVC. Portanto, o conteúdo de index. html é processado da /views/index.jade e /routes/index.js. Essas rotas são definidas nas linhas 16, 17 e 30 de server.js, como mostrado na Figura 4. Para obter mais informações sobre o mecanismo de modelo Jade, visite jade-lang.com.

Publicar o site no Azure agora que você construiu um site Web node. js no Express localmente, vamos publicá-lo para o Azure. Clique no botão publicar no WebMatrix para iniciar o processo. Importar o perfil de publicação para seu Web site e siga o assistente para publicação, conforme mostrado no Figura 5.

Publish to Microsoft Azure
Figura 5 publicar no Microsoft Azure

Se tudo correr bem, o WebMatrix carregará seu Web site no Internet Explorer.

A URL no navegador deve ser o Azure Web Site ao qual você publicou o Web site. Esta é uma boa demonstração de como é fácil desenvolver e implantar serviços de Web e sites Web node. js para o Azure. Agora, eu vou levar um momento para olhar o MongoDB. Vou voltar mais tarde para construir serviços Web node. js.

Visão geral do MongoDB

MongoDB é uma fonte aberta, escalável, de alto desempenho, orientados a documentos banco de dados que inclui a maioria dos recursos de infra-estrutura de bancos de dados relacionais, como replicação, sharding, indexação e failover. MongoDB também oferece auto sharding e tem built-in mapa-reduzir processamento de recursos, que não são oferecidos pela maioria dos bancos de dados relacionais, hoje. Bancos de dados relacionais foram desenhados em uma era onde os sistemas de armazenamento eram caros. Armazenando dados em um formato relacional que permitia que os desenvolvedores otimizar o espaço de armazenamento sem comprometer a recuperação de dados rápida. No mundo de hoje, o armazenamento é barato quando comparado ao calcular os custos. Na nuvem, os preços de armazenamento continuam a diminuir. Como resultado, salvando e recuperando dados no formato relacional é caro em comparação com armazenamento em nuvem. A demanda para a entrega de dados contínua está em ascensão, com mais aplicativos esperando dados em tempo real do seu armazenamento de dados. MongoDB permite salvar objetos e documentos sem quebrando-as em componentes relacionais. Isto reduz a carga de processamento no aplicativo, bem como o banco de dados.

MongoDB não é recomendado para aplicações que exigem relacionamentos profundos objeto porque ele não é projetado para manter e recuperar o objeto e dados relação de vinculação, como bancos de dados relacionais. Se seu aplicativo requer relações profundas e SQL para recuperação, em seguida, use um banco de dados relacional. Se seu aplicativo requer objeto rápido armazenamento e recuperação, use o MongoDB. Como sugeri anteriormente, use a melhor ferramenta para o trabalho.

Provisionamento MongoDB no Azure

MongoDB está disponível como um add-on no armazenamento de Azure e você pode instalar uma versão de caixa de areia de graça. Faça login no seu Portal do Azure e instalar MongoDB (MongoLab) a partir da nova | Loja | Menu de Add-on, como mostrado em Figura 6.

MongoDB Add-on from MongoLab
Complemento de MongoDB Figura 6 de MongoLab

Na página Personalizar complemento, selecione a versão do Sandbox e certifique-se de instalar a instância MongoDB na mesma região como seu site da Web, como mostrado na Figura 7.

Configuring MongoDB
Figura 7-Configurando o MongoDB

Uma vez concluída a instalação, navegue até a página de complemento e salvar a seqüência de caracteres de conexão para o banco de dados instalado, como mostrado na Figura 8. Você usará a seqüência de caracteres de conexão para ligar do seu serviço de Web de Node. js.

Connection String for the Installed Database
Figura 8 String de conexão para o banco de dados instalado

MongoDB agora está rodando no Azure. MongoLab (por ObjectLabs Corp.) tem seu próprio Portal de gerenciamento dedicado, você pode ver clicando no link gerenciar seu complemento.

Agora você tem um banco de dados MongoDB rodando na nuvem, e criou um modelo vazio de Node. js. Para completar a aplicação, você precisa preencher o banco de dados MongoDB e criar serviços da Web que recuperar dados do banco de dados. Este é software padrão de desenvolvimento na nuvem.

Instalando pré-requisitos de Node. js para conectividade do MongoDB

JSON é um cidadão de primeira classe no MongoDB e, portanto, complementa o Node. js. Porque o serviço da Web irá se conectar ao MongoDB, preciso instalar o driver mais recente do node. js para MongoDB da Galeria NPM (ver Figura 9).

Node.js Driver for MongoDB
Figura 9 Driver de Node. js para o MongoDB

As informações de conexão do MongoDB são armazenadas em um arquivo de configuração. O módulo nconf permite que você ler informações de configuração de arquivos (consulte Figura 10).

The nconf Module
Figura 10 o módulo nconf

Uma vez instalados, os módulos mongodb e nconf tiver completado todos os pré-requisitos para a criação de um ambiente de desenvolvimento de Node. js e MongoDB.

Criando as resto da Web serviço assinaturas

Para criar um serviço Web REST, você primeiro definir dependências e rotas em server.js:

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path'),
  pkgs=require('./routes/pkgs');

Em seguida, você definir as funções resto no arquivo /routes/pkgs.js porque, no código anterior, você delegar a função de manipulação para o módulo de pkgs. Na pasta rotas, crie um arquivo chamado pkgs.js que define as operações de serviço da Web, como mostrado em Figura 11.

Figura 11 resto operação assinaturas

exports.findAll = function(req, res) {
  res.send([{name:'app1'}, {name:'app2'}, {name:'app3'}]);
};
exports.findById = function(req, res) {
  res.send({id:req.params.id, 
  name: "DisplayName", description: "description"});
};
exports.addPkg = function (req, res) {
  res.send("Success");
};
exports.updatePkg = function (req, res) {
  res.send("Success");
};

Para testar o funcionamento básico das operações, basta crie esqueletos função retornando dados estáticos. Você pode adicionar o código de acesso de banco de dados mais tarde. Em server.js, defina os métodos de rota que correspondem aos métodos de módulo que você acabou de criar:

app.get('/pkgs', pkgs.findAll);
app.get('/pkgs/:id', pkgs.findById);
app.post('/pkgs', pkgs.addPkg);
app.put('/pkgs/:id', pkgs.updatePkg);

Se você estiver familiarizado com o ASP.NET Web API, você vai entender rapidamente essas rotas e seu mapeamento para a classe de implementação apropriada. Com a declaração de rota e mapeamento, qualquer solicitação para /pkgs será encaminhada para uma das funções em pkgs.js. Com as assinaturas de operação de serviço Web e definições no lugar, você pode testar se as rotas estão funcionando corretamente, executando o site localmente, bem como no Azure. As URLs para testar são: URL do site http://[Web] / pkgs, URL do site http://[Web] Url do site/pkgs/remoto e http://[Web] pkgs/1. Se essas URLs retornam os valores esperados, as rotas estão funcionando bem e você pode prosseguir com a integração do MongoDB.

Execução de operações de serviço Web de resto

Agora você precisa implementar as operações de serviço da Web para se conectar ao MongoDB e recuperar os dados. Quatro etapas irão realizar isto:

  1. Criando um arquivo de config.json e armazenar a seqüência de conexão do MongoDB nele.
  2. Inicializando o cliente MongoDB.
  3. Preenchendo o MongoDB com dados de exemplo. Nesta etapa, a função faz com que um HTTP GET para http://storage.appsforazure.com/appsforazureobjectstest/servicepackages.json e armazena os dados recuperados para a instância do MongoDB.
  4. Implementar as funções de acesso de dados para recuperar e armazenar dados em MongoDB.

Criando o arquivo config.json o arquivo config.json, que é semelhante a um app. config do .NET, mas no formato JSON, armazena suas informações de configuração. Adicione o seguinte par de nome-valor para o novo arquivo:

{
  "MONGOLAB_URI" :
    "mongodb://nodeapps:xxxxxxxx.f.migd9GGB9Ck3M17jlkVCUVI-@ds027758.
mongolab.com:27758/nodeapps"
}

O valor é a seqüência de conexão do MongoDB que você salvou antes do Portal do Azure.

Em pkgs.js, você tem que importar o módulo nconf para ler os valores de configuração:

var nconf = require('nconf');
nconf.env().file({ file: 'config.json' });
var connectionString = nconf.get("MONGOLAB_URI");

A connectionString variável pode então ser usada pelas funções para se conectar ao banco de dados MongoDB. Observe que connectionString é declarada como uma variável global no pkgs.js para que todas as funções podem acessá-lo.

Inicializando o cliente MongoDB: Para inicializar uma conexão ao banco de dados MongoDB, você tem que importar o módulo mongodb e chamar o método connect, como mostrado em Figura 12.

Figura 12 se conectar ao banco de dados MongoDB

var mongo = require('mongodb');
var MongoClient = mongo.MongoClient
MongoClient.connect(connectionString, function (err, db) {
  if (err) throw err;
  if (!err) {
    console.log("Connected to 'pkgsdb' database");
    db.collection('pkgs', { strict: true }, 
      function (err, collection) {
      if (err) {
        console.log(
          "The 'pkgsdb' collection doesn't exist.
Creating it with sample data...");
        populateDB(db);
      }
    });
  }
})

Quando a conexão for bem-sucedida, a variável db no Figura 12 contém o objeto de conexão de banco de dados. A função db.collection tenta se conectar a uma coleção denominada gunzipped Se pkgs não existir, um novo é criado chamando a função populateDB. Em um aplicativo do mundo real, não precisaria fazer isso, porque a coleção na verdade iria ser criada antes de executar o aplicativo. (Uma coleção de MongoDB é um agrupamento de documentos relacionados, análogos a uma tabela de banco de dados em um sistema de banco de dados relacional).

Preenchendo o MongoDB com dados de exemplo para este artigo, eu usei os dados de exemplo disponíveis como uma coleção de pacotes de software de dynamicdeploy.com. Na função populateDB, carrego essa coleção no formato JSON de http://storage.appsforazure.com/appsforazureobjectstest/servicepackages.json, como mostrado em Figura 13.

Figura 13 preencher o banco de dados

var populateDB = function (db) {
  var body = "";
  var url =
    "http://storage.appsforazure.com/appsforazureobjectstest/servicepackages.json";
  http.get(url, function (res2) {
    res2.on('data', function (chunk) {
      body += chunk;
    });
    res2.on("end", function () {
    var pkgs = JSON.parse(body)
    db.collection('pkgs', function (err, collection) {
      collection.insert(pkgs, { safe: true }, 
      function (err, result) { });
    });
    });
      res2.on("error", function (error) {
        // You can log here further
    })
  });

Observe que o JSON é um cidadão de primeira classe em node. js, assim você não precisa importar qualquer módulo para analisar os objetos JSON. A função collection.insert insere todo o documento JSON (var pkgs) da coleção de MongoDB. MongoDB determina o esquema de objetos em tempo de execução e toma decisões inteligentes sobre armazená-los. Em um banco de dados relacional, você teria que definir o esquema da tabela antes de armazenar todos os dados nele. Uma coleção lhe dá a flexibilidade para modificar a esquema em tempo de execução, apenas alterando as propriedades dos objetos JSON. Se alteram as propriedades do objeto, MongoDB aplica automaticamente as alterações ao esquema antes de armazenar o objeto. Isso é útil para a construção de aplicativos, como o social e a Internet das coisas feeds, que alterar dinamicamente com alterações nos tipos de dados.

Implementar as funções de acesso de dados finalmente, você precisa implementar as funções de acesso de dados para o HTTP GET, POST e colocar funções declararam anteriormente. A função HTTP GET é mapeada para as funções de findById e findAll no serviço da Web, como mostrado em Figura 14.

Figura 14 as localizar funções

exports.findById = function (req, res) {
  var id = req.params.id;
  console.log('Retrieving pkg: ' + id);
  MongoClient.connect(connectionString, function (err, db) {
    if (err) throw err;
    if (!err) {
        db.collection('pkgs', function (err, collection) {
          collection.findOne({ '_id': new BSON.ObjectID(id) },
            function (err, item) {
            res.send(item);
            });
        });
      }
    })
  };
exports.findAll = function(req, res) {
  MongoClient.connect(connectionString, function(err, db) {
  if(err) throw err;
  if(!err) {
    db.collection('pkgs', function(err, collection) {
      collection.find().toArray(function(err, items) {
        res.send(items);
      });
    });
    }
  })
};

A função findById recupera um objeto pelo seu Id, Considerando que a função findAll recupera todos os objetos. Funções collection.find­1 e collection.find recuperar os resultados dessas operações do MongoDB, respectivamente. Da mesma forma, Figura 15 mostra o método addPkg, que é mapeado para um HTTP POST e o método de updatePkg, que é mapeado para um HTTP PUT.

Figura 15 adicionar e atualizar funções

exports.addPkg = function (req, res) {
  var pkg = req.body;
  console.log('Adding pkgs: ' + JSON.stringify(pkg));
  MongoClient.connect(connectionString, function (err, db) {
    if (err) throw err;
    if (!err) {
      db.collection('pkgs', function (err, collection) {
        collection.insert(pkg, { safe: true }, function (err, result) {
          if (err) {
            res.send({ 'error': 'An error has occurred' });
          } else {
            console.log('Success: ' + JSON.stringify(result[0]));
            res.send(result[0]);
          }
        });
      });
    }
  })
};
exports.updatePkg = function (req, res) {
  var id = req.params.id;
  var pkg = req.body;
  console.log('Updating pkgs: ' + id);
  console.log(JSON.stringify(pkg));
  MongoClient.connect(connectionString, function (err, db) {
    if (err) throw err;
    if (!err) {
      db.collection('pkgs', function (err, collection) {
        collection.update({ '_id': new BSON.ObjectID(id) },
          pkg, { safe: true }, function (err, result) {
          if (err) {
            console.log('Error updating pkg: ' + err);
            res.send({ 'error': 'An error has occurred' });
          } else {
            console.log('' + result + ' document(s) updated');
            res.send(pkg);
          }
        });
      });
    }
  })
};

Se você seguiu o artigo até agora, você deve ser capaz de implementar uma função de excluir por conta própria. Deixarei isso como um exercício para você. Salvar e executar o site localmente primeiro e depois publicá-lo para Sites da Web de Azure para testar cada função de descanso. O código-fonte completo para o serviço Web REST e o Web site está disponível em github.com/dynamicdeploy/appsforazure.

Uma vez que você tiver o aplicativo to-end executando, você pode escalar para fora de sua infra-estrutura de MongoDB (ou serviço) dependendo da carga do usuário. Como este artigo demonstra, não precisa de qualquer infra-estrutura para implantar em larga escala node. js e MongoDB Web sites no Azure. Eu forneci no código-fonte que acompanha o esqueleto irá ajudá-lo começar a criação de serviços Web e Web sites em node. js no Azure Web Sites.

Conclusão

O objetivo deste artigo foi para você ficar confortável construindo Web services em node. js no Azure Web Sites. Node. js e MongoDB se complementam e porque ambos estão disponíveis como plataforma como serviço (PaaS), não há nenhuma infra-estrutura inicial custo para construir um Web site completo e dimensioná-lo para fora dinamicamente. Como um desenvolvedor, você pode se concentrar em criar e consumir serviços da Web desde a nuvem em seus aplicativos móveis. Portanto, acredito que o Azure Web Sites é PaaS bem feito.

Tejaswi Redkar é um autor e um desenvolvedor de software. Ele atualmente trabalha para a Microsoft como um diretor de estratégia de plataforma de aplicativo e comunidades. Seu livro, "Windows Azure Web Sites: Criando aplicativos de Web em um ritmo rápido"(Dynamic implantar LLC, 2013), é o mais abrangente e Best-seller sobre o tema. Redkar também é o criador do appsforazure Windows App Store e dynamicdeploy.com, onde ele experimenta executando aplicativos de produção em primeira mão na nuvem. Você pode alcançá-lo no tejaswi_redkar@hotmail.com e segui-lo no Twitter em twitter.com/tejaswiredkar.

Agradecemos aos seguintes especialistas técnicos pela revisão deste artigo: Equipe de gerenciamento de produto Microsoft Azure