.NET

5 jun, 2017

ASP.NET Core: APIs REST na nuvem com Docker e Azure Web App

Publicidade

O objetivo deste artigo é demonstrar a implementação de uma API REST na nuvem com o ASP.NET Core, empregando, para isto, containers Docker, o Docker Hub e o Azure Web App on Linux.

Introdução

O deployment de softwares através de containers vem ganhando cada vez mais força, com as mais variadas tecnologias se adequando para suportar este tipo de prática. O isolamento de aplicações e um uso mais racional de recursos estão entre as principais vantagens obtidas por meio da adoção dessas estruturas.

Um container pode ser definido, do ponto de vista técnico, como uma unidade isolada para deployment de um projeto e todas as suas dependências. Dentre as tecnologias baseadas neste conceito, merece destaque o Docker, uma das opções mais populares da atualidade para a utilização de containers.

A Microsoft não ficou alheia a esta tendência, oferecendo suporte a containers Docker em produtos, como o .NET Core, o ASP.NET Core e o SQL Server 2017. No que se refere à nuvem, uma das possibilidades de uso do Docker está no Azure Web App on Linux. Esta alternativa PaaS (Plataform as a Service) viabiliza o deployment de aplicações construídas a partir de tecnologias compatíveis com distribuições Linux (caso de containers Docker), além de oferecer inúmeras facilidades em termos de gerenciamento, escalabilidade, segurança, monitoramento e deploy.

Nas próximas seções, será abordado o uso em conjunto de tecnologias como ASP.NET Core, Docker e Azure. Isto acontecerá através de um exemplo prático, que dará ênfase à implementação e deployment de uma API REST na nuvem.

Alguns detalhes da aplicação de testes

A implementação da API descrita neste artigo já foi detalhada anteriormente no neste artigo (embora utilizando a versão do ASP.NET Core baseada no arquivo project.json, com o uso de tal recurso sendo posteriormente descontinuado).

Este projeto permitirá a conversão de alturas em pés (medida comumente adotada na aviação) para o equivalente em metros, considerando para isto a seguinte fórmula:

Para a construção do exemplo de testes serão utilizados:

  • O Visual Studio 2017 com o update 15.2 devidamente instalado;
  • O ASP.NET Core 1.1 como tecnologia de desenvolvimento Web;
  • O Docker for Windows, que permitirá a criação de imagens e containers para testes em máquinas de desenvolvimento baseadas no Windows 10;
  • O Windows PowerShell para a execução de comandos envolvendo o uso do Docker;
  • O Docker Hub, repositório na nuvem para publicação de imagens públicas (gratuitamente) e privadas (mediante a escolha de um plano pago). Tais imagens poderão ser empregadas na criação e publicação de containers;
  • Azure Web App on Linux para a hospedagem da API de conversão de alturas sob a forma de um container, empregando para isto uma imagem pública hospedada no Docker Hub.

Implementando a aplicação de exemplo

Inicialmente, será criado um projeto do tipo ASP.NET Core Web Application (.NET Core) chamado APIAlturas:

Selecionar na sequência a versão 1.1 e a opção Web API em ASP.NET Core 1.1 Templates:

A classe ConversorAlturasController será responsável pela conversão de alturas em pés para o equivalente em metros, com isso acontecendo através do método Get (este último responsável pelo tratamento de requisições HTTP):

using System;
using Microsoft.AspNetCore.Mvc;

namespace APIAlturas.Controllers
{
    [Route("api/[controller]")]
    public class ConversorAlturasController : Controller
    {
        [HttpGet("PesMetros/{alturaPes}")]
        public object Get(double alturaPes)
        {
            return new
            {
                AlturaPes = alturaPes,
                AlturaMetros = Math.Round(alturaPes * 0.3048, 4)
            };
        }
    }
}

Na imagem a seguir, é possível observar o resultado da conversão de uma altura de 100 pés (30, 48 metros):

Criando uma imagem da API e publicando no Docker Hub

Com a API de conversão já implementada, o próximo passo será a criação e deployment no Docker Hub de uma imagem Docker, a qual permitirá a publicação da aplicação sob a forma de um container no Azure Web App on Linux. Trata-se de um processo extremamente simples, graças ao Visual Studio Tools for Docker – conjunto de ferramentas de suporte ao Docker disponíveis para uso no Visual Studio 2017.

Dentre as funcionalidades que integram o Visual Studio Tools for Docker, destacam-se recursos para building, debugging e execução de containers a partir de projetos gerados com o .NET Core.

Os procedimentos descritos nesta seção dependem da instalação prévia do Docker for Windows em um ambiente de desenvolvimento baseado no Windows 10. Na interface de configuração deste aplicativo, será necessário acessar a seção Shared Drives e, na sequência, marcar o driver C: (isto permitirá a utilização das diversas funcionalidades do Visual Studio Tools for Docker):

Dentro do Visual Studio 2017 será necessário adicionar os arquivos de suporte ao Docker para a aplicação criada na seção anterior. Um dos caminhos para isto consiste em acionar o menu de contexto para o projeto APIAlturas e, em seguida, as opções Add e Docker Support:

Como resultados desta ação, serão criados os seguintes itens:

  • Dockerfile, arquivo no qual constará a imagem do ASP.NET Core a ser utilizada na geração de containers baseados no projeto APIAlturas;
  • Os arquivos do Docker Compose (agrupados em docker-compose), com as configurações para a criação da imagem correspondente à API de conversão de alturas.

O contéudo do arquivo Dockerfile pode ser observado na próxima listagem:

FROM microsoft/aspnetcore:1.1
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "APIAlturas.dll"]

Já na listagem a seguir, estão as configurações do arquivo docker-compose.yml:

version: '2'

services:
  apialturas:
    image: apialturas
    build:
      context: ./APIAlturas
      dockerfile: Dockerfile

Alternativamente, os arquivos de suporte ao Docker também poderiam ser adicionados no momento de criação da aplicação (selecionando para isto a opção Enable Docker Support na tela de seleção de templates do ASP.NET Core 1.1):

Neste momento, o projeto APIAlturas já estará devidamente configurado para sua execução e até mesmo debugging, a partir de um container Docker. O próprio ícone para ativar a aplicação indica isto:

Com aplicação APIAlturas em modo de execução será possível verificar a existência de uma imagem Docker criada para efeitos de desenvolvimento, além de um container baseado nessa estrutura.

Ao executar o comando docker images no PowerShell, aparecerão as imagens microsoft/aspnetcore:1.1 e apialturas:dev:

Já o comando docker ps -a exibirá o container gerado para a execução por meio do Visual Studio:

Uma nova imagem Docker deverá ser gerada com base nas configurações de release da aplicação. Selecionar para isto a opção Release (ao invés de Debug) no Visual Studio 2017:

Efetuar, em seguida, a compilação do projeto (a partir do menu Build > Build Solution). Ao executar novamente o comando docker images no PowerShell, constará agora a imagem apialturas:latest:

Uma tag chamada renatogroffe/apialturas deverá ser criada para a imagem apialturas:latest, com este novo elemento contendo o nome a ser registrado no Docker Hub (formado por identificação do repositório/login + nome da aplicação; esses dois itens estarão separados ainda por uma barra – “/”). Executar para isto o seguinte comando no PowerShell:

docker tag apialturas:latest renatogroffe/apialturas

Uma nova execução da instrução docker images trará agora uma imagem chamada renatogroffe/apialturas:

Para registrar a imagem no Docker Hub, será necessária uma conta para uso deste repositório. Caso precise criar tal login e/ou obter maiores informações, acesse: https://hub.docker.com/.

O próximo passo será logar no Docker Hub (via PowerShell) através da seguinte instrução – que solicitará usuário e senha:

docker login

Para publicar a imagem renatogroffe/apialturas no Docker Hub, será utilizado o comando:

docker push renatogroffe/apialturas

O resultado desta ação pode ser observado na próxima imagem:

A imagem renatogroffe/apialturas aparecerá, então, no Docker Hub após a conclusão deste último procedimento:

Deployment no Azure

No portal do Azure será necessário criar um novo recurso baseado no serviço Web App on Linux:

Informar no formulário de criação do recurso:

  • O nome do aplicativo (apialturas);
  • Um grupo de recursos (TesteDocker, neste exemplo);
  • Opcionalmente poderão ser configurados detalhes de localização (data center escolhido para hospedagem) e do plano de serviço.

Acionar após o preenchimento destes campos a opção Configurar contêiner:

Em Contêiner do Docker, selecionar o item Docker Hub, certificando-se de que a opção Público está marcada em Acesso ao Repositório e informando no campo Imagem e Marca Opcional o valor renatogroffe/apialturas (correspondente à imagem publicada anteriormente no Docker Hub):

Selecionar OK em Contêiner do Docker, confirmando as definições a serem utilizadas para a criação do container na nuvem. Concluir, então, este processo acionando o botão Criar no formulário em que se especificaram as configurações da API REST, que ficará hospedada na nuvem:

Na opção Todos os Recursos, será possível constatar, após um curto período de tempo, a presença do recurso apialturas:

Ao acessar o item apialturas, será exibido um painel no qual constará o endereço da aplicação de testes, além de outras opções para a configuração e gerenciamento deste recurso:

Um teste com a URL http://apialturas.azurewebsites.net/api/conversoralturas/pesmetros/1000 retornará o resultado da conversão de mil pés (304,8 metros):

Conclusão

Este artigo procurou apresentar uma das alternativas para uso do ASP.NET Core com Docker na nuvem da Microsoft: o Azure Web App on Linux. Esse serviço é uma excelente opção não só para a utilização de containers, como também para a hospedagem de aplicações que empreguem plataformas tipicamente associadas a distribuições Linux. O Azure Web App on Linux conta ainda com funcionalidades que facilitam sua configuração, gerenciamento e, até mesmo, integração contínua de soluções Web.

Referências