O que são microsserviços?
A nuvem impulsiona o desenvolvimento de aplicativos e o gerenciamento de sistemas de TI de hoje. Os aplicativos de nuvem modernos precisam ser rápidos, ágeis, altamente escalonáveis e confiáveis.
O uso de contêineres pode ajudá-lo a implantar aplicativos que atendem a todos esses requisitos. Mas colocar um aplicativo em um contêiner sem seguir um padrão de design estratégico é como entrar em um veículo e esperar encontrar seu caminho para uma nova cidade sem usar um mapa ou GPS. Você pode acabar em seu destino, mas a rota provavelmente não será direta ou a mais eficiente.
Uma arquitetura de microsserviços é útil nesse cenário. Os microsserviços oferecem uma abordagem de desenvolvimento e implantação de software perfeitamente adequada aos requisitos de agilidade, escalabilidade e confiabilidade de aplicativos de nuvem modernos.
O que é uma arquitetura de microsserviços?
Em uma arquitetura de microsserviços, um aplicativo grande é dividido em um conjunto de serviços menores. Cada serviço é executado em seu próprio processo e se comunica com outros processos usando protocolos como HTTP/HTTPS, WebSocket ou Advanced Message Queuing Protocol (AMQP). Cada microsserviço implementa uma funcionalidade de negócios ou domínio de ponta a ponta específica dentro de um determinado limite de contexto. Cada microsserviço deve ser desenvolvido de forma autônoma e deve ser implantado de forma independente. Por fim, cada microsserviço deve possuir seu modelo de dados de domínio e lógica de domínio relacionados. Os microsserviços podem ser baseados em diferentes tecnologias de armazenamento de dados (SQL, NoSQL) e diferentes linguagens de programação.
Aqui estão algumas das principais características dos microsserviços:
- Eles são pequenos, independentes e vagamente acoplados.
- Cada microsserviço tem uma base de código separada que uma pequena equipe de desenvolvimento pode gerenciar.
- Eles são implantados de forma independente. Uma equipe pode atualizar um microsserviço existente sem recompilar e reimplantar o aplicativo inteiro.
- Eles persistem seus dados ou o estado externo em seus respectivos bancos de dados. Ao contrário de uma arquitetura monolítica, os microsserviços não compartilham bancos de dados.
- Eles se comunicam entre si usando APIs bem definidas. Detalhes da implementação interna de cada serviço ficam ocultos de outros serviços.
- Eles dão suporte à programação poliglota. Por exemplo, os microsserviços que compõem um aplicativo Web não precisam compartilhar a mesma pilha de tecnologia, bibliotecas ou estruturas.
Por que desenvolver usando uma arquitetura de microsserviços?
Os microsserviços normalmente encapsulam uma funcionalidade mais simples de requisito do cliente, na qual você pode escalar horizontalmente ou escalar horizontalmente. Você pode testá-los, implantá-los e gerenciá-los de forma independente. Um benefício importante de uma abordagem de microsserviços é que as equipes são orientadas mais por cenários de clientes do que pelo uso de tecnologias específicas. Cada pequena equipe de desenvolvimento desenvolve um microsserviço com base em um cenário de cliente. A equipe escolhe as tecnologias que usa.
Os microsserviços fornecem agilidade no longo prazo. Os microsserviços dão suporte à manutenção em sistemas complexos, grandes e altamente escalonáveis, permitindo que você crie aplicativos com base em muitos serviços implantáveis independentemente que têm ciclos de vida granulares e autônomos.
Como outro benefício, os microsserviços podem ser expandidos de maneira independente. Em vez de ter um único aplicativo monolítico que você deve escalar horizontalmente como uma unidade, você pode escalar horizontalmente microsserviços específicos. Você pode dimensionar apenas a área funcional que precisa de mais poder de processamento ou largura de banda de rede para dar suporte à demanda em vez de dimensionar outras áreas do aplicativo que não precisam ser dimensionadas. Isso significa economias de custo, porque você precisa de menos hardware.
A abordagem de microsserviços permite alterações ágeis e iteração rápida de cada microsserviço, pois você pode alterar áreas específicas e pequenas de aplicativos complexos, grandes e escalonáveis.
A arquitetura de aplicativos baseados em microsserviços refinados permite práticas de integração e de entrega contínua. Ela também acelera a entrega de novas funções no aplicativo. Você pode executar e testar microsserviços isoladamente e desenvolvê-los de forma autônoma, mantendo contratos claros entre os serviços. Desde que você não altere a interfaces ou contratos, é possível alterar a implementação interna de qualquer microsserviço ou adicionar novas funcionalidades sem interromper outros microsserviços.
Que função os contêineres desempenham?
O uso de contêineres é uma abordagem de desenvolvimento de software na qual um aplicativo ou serviço, suas dependências e sua configuração (abstraídos como arquivos de manifesto de implantação) são empacotados juntos como uma imagem de contêiner. Você pode testar o aplicativo em contêiner como uma unidade e implantá-lo como uma instância de imagem de contêiner no sistema operacional host.
Os contêineres de software atuam como uma unidade padrão de implantação de software que pode conter diferentes códigos e dependências. Isso é semelhante à forma como os contêineres transportam mercadorias de todos os tipos por navio, trem ou caminhão. Desenvolvedores e profissionais de TI podem usar software em contêineres para implantar código e dependências em ambientes com pouca ou nenhuma modificação.
Se parecer que o contêiner de um aplicativo pode ser uma ótima maneira de implementar o padrão de arquitetura de microsserviços, ele é. Os benefícios do uso de contêineres se alinham quase exatamente com os benefícios de usar uma arquitetura de microsserviços.
Observação
Colocar um aplicativo em contêineres não é a única maneira de implantar microsserviços. Você pode implantar microsserviços como serviços individuais no Serviço de Aplicativo do Azure, em máquinas virtuais ou de várias maneiras. Os contêineres são a ferramenta de implantação que usaremos para nossos microsserviços para o restante deste módulo.
Outro benefício do uso de contêineres é a escalabilidade. Você pode escalar horizontalmente rapidamente criando novos contêineres a serem usados para tarefas de curto prazo. Do ponto de vista do aplicativo, criar uma instância de uma imagem (criar um contêiner) é semelhante a criar uma instância de um processo, como um serviço ou aplicativo Web.
Resumindo, os contêineres oferecem os benefícios de isolamento, portabilidade, agilidade, escalabilidade e controle em todo o fluxo de trabalho do ciclo de vida do aplicativo.
Os microsserviços que você criar neste módulo serão executados em um contêiner do Docker, publicado usando a CLI do .NET.
Publicação de contêiner do SDK do .NET
No .NET 7, o SDK do .NET ganhou a capacidade de criar imagens de contêiner por meio do comando dotnet publish
. As ferramentas fazem várias inferências com base nas propriedades do seu projeto e suas saídas. Em seguida, o .NET cria a mesma imagem que um Dockerfile criaria. Ele pode usar apenas dois comandos para criar um novo aplicativo e publicá-lo como uma imagem:
dotnet new webapi
dotnet publish --os linux --arch x64 /t:PublishContainer -c Release
Os comandos anteriores da CLI do .NET criam uma nova API Web e publicam o aplicativo como um contêiner:
- Direcionar o Linux como o sistema operacional (SO linux).
- Especificar uma arquitetura x64 (arch x64).
- Usando a configuração de versão (Versão -c).
Você pode controlar muitos aspectos do contêiner gerado por meio das propriedades do MSBuild. Em geral, se você puder usar um comando em um Dockerfile para definir alguma configuração, poderá fazer o mesmo por meio do MSBuild.
Por que criar microsserviços no .NET?
Começando com o .NET Core e continuando às iterações atuais, o .NET é criado para ser nativo de nuvem primeiro. Ele é executado entre plataformas, para que sua imagem do Docker possa ser baseada em uma variante do Linux e seu código .NET ainda seja executado. A Microsoft já criou imagens do .NET para o Docker. Além disso, o .NET é extremamente rápido. O servidor Web ASP.NET Kestrel supera rotineiramente outros servidores Web.
Docker
O Docker é uma plataforma de software livre que você pode usar para automatizar a implantação de aplicativos como contêineres portáteis e autossuficientes que podem ser executados na nuvem ou localmente. O Docker também é a empresa que promove e evolui essa tecnologia. O Docker como uma organização trabalha em colaboração com fornecedores de nuvem, Linux e Windows, incluindo a Microsoft.
Os contêineres do Docker podem ser executados em qualquer lugar: localmente no datacenter do cliente, em um provedor de serviços externo ou na nuvem. Os contêineres de imagem do Docker podem ser executados nativamente no Linux e no Windows.
O que é uma imagem?
Quando um desenvolvedor usa o Docker, ele cria um aplicativo ou serviço. Em seguida, eles empacotam o aplicativo ou serviço e suas dependências em uma imagem de contêiner. Uma imagem é uma representação estática do aplicativo ou do serviço e de sua configuração e dependências.
A imagem, quando executada, torna-se o contêiner. O contêiner é a instância em memória de uma imagem.
Uma imagem de contêiner é imutável. Depois de criar uma imagem, a imagem não poderá ser alterada. Como você não pode alterar uma imagem, se precisar fazer alterações no aplicativo ou serviço e suas dependências, crie uma nova imagem. Esse recurso garante que a imagem usada na produção seja a mesma imagem usada no desenvolvimento e nos testes.
O que é um Dockerfile?
Um Dockerfile é um arquivo de texto que contém instruções sobre como criar uma imagem do Docker. Os dockerfiles são escritos em uma linguagem de script mínima projetada para criar e configurar imagens. Os Dockerfiles também documentam as operações necessárias para criar uma imagem, começando com uma imagem base.
Para criar uma imagem do Docker que contenha seu aplicativo, você normalmente começa identificando uma imagem base. Em seguida, você adiciona mais arquivos e configuração à imagem base. O processo de identificação de uma imagem base adequada geralmente começa com uma pesquisa no Docker Hub. Você procura uma imagem pronta que já contenha uma estrutura de aplicativo e todos os utilitários e ferramentas de uma distribuição Linux como Ubuntu ou Alpine. Por exemplo, se você tiver um aplicativo ASP.NET que deseja empacotar em um contêiner, a Microsoft publicará uma imagem chamada mcr.microsoft.com/dotnet/aspnet que já contém o runtime do ASP.NET.
Você pode personalizar uma imagem iniciando um contêiner com uma imagem base e, em seguida, fazer alterações nela. As alterações geralmente envolvem atividades como copiar arquivos para o contêiner do sistema de arquivos local e executar várias ferramentas e utilitários para compilar código.
Um Dockerfile é um conjunto de instruções que criam uma imagem do Docker que tem o software exato necessário nele para executar seu aplicativo, incluindo o próprio aplicativo.