O que é o .NET Aspire?
Ecossistemas de nuvem como o Microsoft Azure e a Amazon Web Services (AWS) estão profundamente inseridos no setor de TI e em soluções de hospedagem populares para aplicativos Web e serviços Web. É provável que um sistema de hospedagem em nuvem seja a opção padrão para seus aplicativos, portanto, você precisa garantir que os aplicativos criados sejam projetados para tirar o máximo proveito desses sistemas.
Um aplicativo nativo de nuvem é aquele que você projeta especificamente para ser executado na nuvem. Os aplicativos geralmente exibem determinados padrões de arquitetura para que o desempenho, a escalabilidade e a confiabilidade sejam ideais.
Imagine que você trabalha para uma empresa de roupas e equipamentos para atividades ao ar livre. O conselho pediu que você desenvolvesse um novo aplicativo Web eShop para o principal site da empresa voltado para o cliente. Sua equipe está familiarizada com o modelo de microsserviços e você deseja saber se usar o .NET Aspire facilitará o projeto.
Nesta unidade, você aprenderá mais sobre arquiteturas nativas de nuvem e verá os desafios que podem estar envolvidos na criação delas. Você também verá como o .NET Aspire pode enfrentar esses desafios.
O que é um aplicativo nativo de nuvem?
Um aplicativo nativo de nuvem é projetado para fazer o melhor uso possível das infraestruturas de nuvem a fim de oferecer melhores desempenho, disponibilidade e resiliência. Há seis pilares de arquiteturas de software nativas de nuvem:
- Infraestrutura de nuvem. Aplicativos nativos de nuvem são implantados em soluções de hospedagem na nuvem e não em farms de servidores locais.
- Microsserviços. Aplicativos nativos de nuvem são implementados como um conjunto de microsserviços, cada um dos quais implementa uma pequena parte da funcionalidade de negócios.
- Contêineres. Microsserviços e outras partes do aplicativo são desenvolvidos e implantados em contêineres para garantir um ambiente de execução consistente.
- Serviços de apoio. Recursos auxiliares, como bancos de dados e serviços de cache, podem ser usados para fornecer funcionalidade comum a microsserviços.
- Design moderno. Os aplicativos nativos de nuvem estão em conformidade com a metodologia do Aplicativo Twelve-Factor, que inclui princípios como CI/CD (Integração Contínua/Implantação Contínua), descartabilidade, associação de portas e assim por diante.
- Automação. Aplicativos nativos de nuvem usam IaC (Infraestrutura como Código) para automatizar o provisionamento e a implantação da plataforma.
Para fornecer agilidade, um aplicativo nativo de nuvem é composto por um conjunto de microsserviços. Cada microsserviço:
- Implementa uma parte da funcionalidade completa.
- Executa em seu próprio processo e é isolado dos outros, frequentemente em um contêiner dedicado.
- É criado por uma equipe separada.
- Comunica-se com os outros, mas tem acoplamento fraco.
Cada equipe escolhe as linguagens e as tecnologias que prefere implementar seu microsserviço. Cada microsserviço é implantado e dimensionado de maneira independente dos outros.
O diagrama a seguir ilustra as diferenças entre um aplicativo Web monolítico tradicional e um aplicativo Web composto por microsserviços.
Aplicativos nativos de nuvem podem trazer muitas vantagens para sua empresa. Por exemplo:
- Ao hospedar seu aplicativo na nuvem, você não precisa criar e manter a infraestrutura, como servidores de hospedagem, sistemas operacionais e serviços de suporte por conta própria.
- Como cada microsserviço é desenvolvido de maneira independente, você pode implantar continuamente novas funcionalidades neles sem precisar esperar por outras equipes ou marcos de versão principais.
- Como cada microsserviço é executado em um ou mais contêineres, você sabe que o ambiente será o mesmo em todos os ambientes de teste, preparo e produção.
- Você pode usar um sistema de orquestração de contêineres, como o Kubernetes, para implantar instâncias extras rapidamente a fim de responder à demanda adicional.
Desafios apresentados por aplicativos nativos de nuvem
Um aplicativo nativo de nuvem que consiste em vários microsserviços e com muitos recursos pode se tornar complexo e apresentar desafios que não surgem com aplicativos monolíticos. Por exemplo:
- Definição do aplicativo. A menos que esteja documentado com cuidado, pode ser difícil para os desenvolvedores entenderem quais componentes compõem o aplicativo nativo de nuvem completo.
- Comunicação. Cada microsserviço pode precisar trocar mensagens ou dados com outros microsserviços para formular uma resposta a uma solicitação do usuário. Embora seja necessário habilitar essa comunicação, você deve fazer isso de uma forma que não acople um microsserviço a outro. Você também precisa de comunicação para permanecer confiável em momentos de alta demanda ou durante falhas de serviço.
- Resiliência. Nenhum serviço de hospedagem consegue estar 100% disponível. Você deve garantir que, em raras ocasiões em que um microsserviço não esteja disponível, o aplicativo lide com as falhas de maneira robusta e mantenha as solicitações até que o serviço retorne.
- Dados distribuídos. Cada microsserviço implementa a própria camada de armazenamento de dados e pode não usar o mesmo servidor de banco de dados que outros. Você deve considerar como consultará dados de vários microsserviços e como implementará transações.
- Segredos. Se seu aplicativo manipular qualquer tipo de dados confidenciais, cada microsserviço deverá autenticar cada solicitação recebida antes de retornar uma resposta. Muitas vezes, segredos como chaves de criptografia assimétricas e simétricas são usados para proteger dados e identificar positivamente usuários e microsserviços que estão chamando. Você deve considerar como esses segredos são armazenados e trocados em seu aplicativo nativo de nuvem.
- Integração do desenvolvedor. Os novos desenvolvedores devem ser capazes de entender a arquitetura do aplicativo e como trabalhar com ele rapidamente. Você deve garantir que os novos desenvolvedores possam se atualizar sem muito conhecimento entre domínios ou configuração local.
Recentemente, o design de aplicativo nativo de nuvem vem ganhando popularidade, mas desafios como os desta seção desencorajam algumas equipes a adotar esse padrão. O .NET, por exemplo, tem todos os recursos necessários para resolver esses problemas, mas as soluções podem precisar de um investimento significativo em treinamento e código personalizado.
O que é o .NET Aspire?
O .NET Aspire é uma nova pilha pronta para nuvem criada para .NET e projetada para permitir que os desenvolvedores criem aplicativos nativos de nuvem com rapidez e facilidade. Vamos examinar os recursos do .NET Aspire que abordam os desafios que vimos.
Orquestração
Os microsserviços e sua natureza fracamente acoplada aumentam a flexibilidade do aplicativo implantado, mas podem dificultar a configuração. A lista de serviços que compõem o aplicativo pode ficar incerta e o ponto de extremidade em que um microsserviço está disponível pode ser difícil de identificar. O .NET Aspire fornece funcionalidade de orquestração para que:
- Você possa especificar claramente para todas as equipes os projetos, contêineres, executáveis e recursos de nuvem do .NET que compõem o aplicativo.
- Os microsserviços possam descobrir pontos de extremidade automaticamente para todos os componentes do aplicativo. O .NET Aspire executa essa descoberta de serviço gerenciando cadeias de conexão e injetando-as em microsserviços quando necessário.
Ao criar uma solução .NET Aspire, você verá um novo projeto na solução chamada <SolutionName>.AppHost. Este projeto implementa a orquestração para seu aplicativo e você deve garantir que ele seja o projeto de inicialização da solução.
Componentes
Os microsserviços geralmente têm requisitos funcionais para serviços de apoio complexos que sustentam seus recursos. Por exemplo:
- Armazenamento de dados. Para manter os dados a fim de dar suporte a catálogos de produtos, carrinhos de compras, repositórios de identidade e outros recursos, os microsserviços devem armazenar dados em repositórios estruturados ou semiestruturados.
- Cache. Para maximizar o desempenho, os microsserviços podem armazenar respostas parciais ou completas em um cache para que solicitações semelhantes subsequentes possam ser atendidas mais rapidamente.
- Mensagens. Microsserviços fracamente acoplados devem se comunicar entre si e você deve garantir que essa comunicação seja confiável mesmo quando o tráfego for alto ou as condições de rede forem desafiadoras. Um serviço que enfileira e distribui mensagens de remetentes para destinatários é um requisito comum.
No .NET Aspire, é fácil implementar esses serviços de apoio em cada microsserviço porque a pilha inclui componentes do .NET Aspire. Cada componente é um pacote NuGet que você pode adicionar à solução e implementa uma interface padrão a um serviço de backup. Essa interface padrão garante que seu microsserviço se conecte aos serviços de backup de maneira consistente e direta.
Os componentes prontos para uso do .NET Aspire incluem:
- Componentes de armazenamento de dados, como os do PostgreSQL, do Banco de Dados SQL, do Azure Cosmos DB e do MongoDB.
- Componentes de cache, como o componente para Redis.
- Componentes de mensagens, como os do RabbitMQ e do Barramento de Serviço do Azure.
Importante
O .NET Aspire inclui muitos componentes que funcionam com serviços do Azure, como o Armazenamento do Azure e o Barramento de Serviço do Azure, mas o Azure não é necessário para projetos do .NET Aspire e eles funcionam igualmente bem com serviços de apoio de fora do Azure, como RabbitMQ e MongoDB.
Ferramentas
O .NET Aspire também adiciona às ferramentas disponíveis para desenvolvedores no Visual Studio. Por exemplo:
- Novos modelos de projeto permitem que você crie soluções do .NET Aspire com algumas etapas em um assistente.
- O painel do .NET Aspire é uma interface da Web que aparece sempre que você inicia a solução no Visual Studio. Esse painel exibe todos os microsserviços e serviços de backup do aplicativo e você pode chamá-los para teste. Ele também mostra ferramentas de desempenho e monitoramento.
- Itens de menus extras são exibidos, que você pode usar para adicionar um componente do .NET Aspire, registrar um projeto para suporte ao orquestrador do .NET Aspire ou concluir outras tarefas.
Observação
Você aprenderá mais sobre as ferramentas do .NET Aspire mais adiante neste módulo.