O que são os microsserviços?
A nuvem impulsiona o desenvolvimento de aplicativos e o gerenciamento de sistemas de TI atuais. Os aplicativos de nuvem modernos precisam ser rápidos, ágeis, massivamente escaláveis e confiáveis.
O uso de contêineres pode ajudá-lo a implantar aplicativos que atendam 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 o caminho para uma nova cidade sem usar um mapa ou GPS. Você pode acabar no 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 dos 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 AMQP (Advanced Message Queuing Protocol). Cada microsserviço implementa um domínio específico de ponta a ponta ou capacidade de negócios dentro de um determinado limite de contexto. Cada microsserviço deve ser desenvolvido de forma autônoma e deve ser implantável de forma independente. Finalmente, cada microsserviço deve possuir seu modelo de dados de domínio relacionado e lógica de domínio. 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 características-chave 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 reconstruir e reimplantar todo o aplicativo.
- Eles persistem seus dados ou o estado externo em seus respetivos 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. Os detalhes internos da implementação de cada serviço estão ocultos de outros serviços.
- Eles suportam 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 geralmente encapsulam funcionalidades mais simples de requisitos do cliente, que podem ser dimensionadas ou ampliadas. 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 tecnologia específica. Cada pequena equipe de desenvolvimento desenvolve um microsserviço com base em um cenário de cliente. A equipa escolhe as tecnologias que utiliza.
Os microsserviços proporcionam agilidade a longo prazo. Os microsserviços oferecem suporte à manutenção em sistemas complexos, grandes e altamente escaláveis, permitindo que você crie aplicativos com base em muitos serviços implantáveis de forma independente, cada um com ciclos de vida granulares e autônomos.
Como outro benefício, os microsserviços podem ser expandidos de forma independente. Em vez de ter um único aplicativo monolítico que você deve dimensionar como uma unidade, você pode, em vez disso, expandir 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 economia de custos porque você precisa de menos hardware.
A abordagem de microsserviços permite alterações ágeis e iteração rápida de cada microsserviço porque você pode alterar áreas pequenas e específicas de aplicativos complexos, grandes e escaláveis.
A arquitetura de aplicativos refinados baseados em microsserviços permite a integração contínua e práticas de entrega contínua. Ele também acelera a entrega de novas funções no aplicativo. Você pode executar e testar microsserviços isoladamente e evolui-los de forma autônoma, mantendo contratos claros entre serviços. Contanto que você não altere as interfaces ou contratos, você pode alterar a implementação interna de qualquer microsserviço ou adicionar novas funcionalidades sem quebrar outros microsserviços.
Que papel desempenham os contentores?
A conteinerização é uma abordagem ao desenvolvimento de software na qual um aplicativo ou serviço, suas dependências e sua configuração (abstraídas como arquivos de manifesto de implantação) são empacotadas juntas 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. Isto é semelhante à forma como os contentores de transporte transportam mercadorias de todos os tipos por navio, comboio ou camiã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 parece que a conteinerização de um aplicativo pode ser uma ótima maneira de implementar o padrão de arquitetura de microsserviços, é. Os benefícios do uso de contêineres se alinham quase exatamente com os benefícios do uso de uma arquitetura de microsserviços.
Nota
A conteinerização de um aplicativo 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 no restante deste módulo.
Outro benefício da conteinerização é a escalabilidade. Você pode expandir rapidamente criando novos contêineres para usar em tarefas de curto prazo. Do ponto de vista do aplicativo, instanciar uma imagem (criar um contêiner) é semelhante a instanciar um processo como um serviço ou aplicativo Web.
Em resumo, 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 criados 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 dotnet publish
comando. As ferramentas fazem um monte de inferência com base nas propriedades do seu projeto e seus resultados. Em seguida, o .NET cria a mesma imagem que um Dockerfile criaria. Pode levar 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:
- Visando o Linux como o sistema operacional (--os linux).
- Especificando uma arquitetura x64 (--arch x64).
- Usando a configuração de liberação (-c Release).
Você pode controlar muitos aspetos do contêiner gerado por meio das propriedades do MSBuild. Em geral, se você pode usar um comando em um Dockerfile para definir alguma configuração, você pode fazer o mesmo via MSBuild.
Por que criar microsserviços no .NET?
Começando com o .NET Core e continuando para as iterações atuais, o .NET foi criado para ser nativo da nuvem primeiro. Ele é executado entre plataformas, de modo que sua imagem do Docker pode ser baseada em um tipo de Linux, e seu código .NET ainda é executado. A Microsoft já criou imagens .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 código aberto 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 no local. A Docker é também a empresa que promove e evolui esta tecnologia. O Docker como 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 serviço e sua configuração e dependências.
A imagem, quando executada, torna-se o contêiner. O contentor é a instância na memória de uma imagem.
Uma imagem de contentor é imutável. Depois de criar uma imagem, a imagem não pode ser alterada. Como não é possível 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 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. Dockerfiles são escritos em uma linguagem de script mínima projetada para criar e configurar imagens. 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, normalmente você 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 por uma imagem pronta que já contém 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 tempo de execução 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 que você precisa para executar seu aplicativo, incluindo o próprio aplicativo.