Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 37

Understanding the App Host's Role in Local Distributed Applications

Recommended resources

Olá! Vamos continuar nossa jornada no .NET Aspire.

Na lição anterior, exploramos o "porquê" do .NET Aspire: os desafios no desenvolvimento de aplicações distribuídas que ele se propõe a resolver. Vimos como ele oferece uma "pilha opinativa" para simplificar a orquestração, a observabilidade e o gerenciamento de dependências. Identificamos o App Host como o componente central para a orquestração de desenvolvimento local.

Nesta lição, vamos aprofundar nosso entendimento sobre esse componente crucial. O objetivo é descrever o papel do App Host na orquestração de aplicações distribuídas localmente. Em vez de apenas saber o que ele faz, vamos focar em como ele funciona nos bastidores, atendendo ao seu interesse em entender a mecânica interna das tecnologias.

1. O App Host: Mais do que um Ponto de Partida

No nível mais básico, um projeto .NET Aspire App Host é um simples projeto de console C#. No entanto, seu Program.cs não contém a lógica de negócio da sua aplicação. Em vez disso, ele atua como a raiz de composição (composition root) para toda a sua aplicação distribuída. É aqui que você define um "plano" ou "planta baixa" da sua aplicação.

Esse plano é chamado de Application Model (Modelo de Aplicação). Ele é uma representação em C# de todos os componentes — ou recursos — que compõem seu sistema:

  • Seus próprios projetos .NET (APIs, Web frontends, workers).
  • Contêineres Docker para serviços de terceiros (como PostgreSQL, Redis, RabbitMQ).
  • Executáveis externos.
  • Recursos na nuvem (embora isso seja mais relevante para o deploy, não para a execução local).

.NET Aspire Tutorial For Beginners

Para começar, vamos ver na prática como um projeto App Host é criado e qual é sua estrutura básica. Este vídeo de Julio Casal mostra exatamente isso.

Assista ao trecho de 12:07 a 14:01. Preste atenção em como ele descreve o App Host como o novo "host" da sua aplicação e um "orquestrador" para os diferentes componentes. Note que, no fundo, ele é apenas uma aplicação de console com referências a pacotes especiais do Aspire.

Essencialmente, o código que você escreve no App Host não executa os serviços diretamente; ele descreve o estado desejado do seu sistema para o ambiente de desenvolvimento.

.NET Aspire AppHost Resource Diagram
Este diagrama ilustra o papel do App Host como orquestrador central. Ele define os recursos (um contêiner `cache` e dois projetos, `apiservice` e `webfrontend`) e as dependências entre eles. O App Host gerencia como esses componentes se conectam e se configuram, formando a espinha dorsal da aplicação distribuída local.

2. Construindo o Application Model em C#

Você constrói o Application Model usando um IDistributedApplicationBuilder. Os métodos de extensão nesse builder permitem que você adicione recursos e defina as relações entre eles.

Os dois métodos mais comuns que você usará são:

  • Add...(): Adiciona um recurso ao modelo. Existem vários, como builder.AddProject<T>() para projetos .NET, builder.AddPostgresContainer() ou builder.AddRedis() para dependências comuns.
  • WithReference(): Define uma dependência entre dois recursos. Por exemplo, quando você diz que sua API tem uma referência a um banco de dados (api.WithReference(database)), você está dizendo ao Aspire que a API precisa de informações para se conectar a esse banco de dados.

I Replaced Docker Compose with .NET Aspire. Here’s What Happened

Vamos ver um exemplo prático de como construir um Application Model mais complexo. Milan Jovanović demonstra como substituir um docker-compose.yml adicionando vários recursos (PostgreSQL, Redis, RabbitMQ) ao App Host e conectando-os a uma API.

Assista dos trechos 02:55 a 03:27 e 06:03 a 07:54. O primeiro trecho define claramente o papel do App Host. O segundo mostra o código C# para adicionar vários recursos e usar WithReference(). Observe como isso é mais integrado à linguagem C# em comparação com a edição de um arquivo YAML.

Agora que sabemos que o App Host define a planta da aplicação, a pergunta natural é: quem realmente constrói e gerencia a "casa"?


3. O Motor de Orquestração: Developer Control Plane (DCP)

Aqui está o ponto central para entender "como funciona": o App Host delega a orquestração real. Ele não inicia contêineres Docker nem executa processos diretamente. Em vez disso, ele se comunica com um serviço de bastidor chamado Developer Control Plane (DCP).

O DCP é o verdadeiro motor de orquestração local do Aspire. O fluxo de trabalho é o seguinte:

  1. Você executa o seu projeto App Host.
  2. O App Host lê seu código C# e "traduz" o Application Model para um formato que o DCP entende.
  3. O App Host envia essa definição para o DCP através de uma API.
  4. O DCP recebe a definição e assume a responsabilidade de tornar esse estado desejado uma realidade. Ele inicia os contêineres, executa os processos, configura as redes, etc.

A documentação oficial do Aspire é a melhor fonte para entender essa arquitetura.

Aspire architecture

Vamos ler a seção da documentação que detalha essa interação. Ela explica a separação de responsabilidades entre o App Host e o DCP.

Leia a seção "Dev-time orchestration". Foque na lista de perguntas e respostas que esclarece o papel de cada componente. Estude o diagrama que visualiza o fluxo: o seu App Model em C# é "rebaixado" (lowered) para um modelo específico do DCP, que então executa a orquestração.

Como você leu, o DCP é responsável por tarefas cruciais:

  • Gerenciamento do Ciclo de Vida: Inicia e para contêineres e processos na ordem correta, respeitando o grafo de dependências que você definiu com WithReference().
  • Configuração de Rede: Aloca portas dinamicamente para os serviços, evitando conflitos, e garante que eles possam se comunicar.
  • Injeção de Configuração: Esta é uma das magias do Aspire. Quando você usa WithReference(), o DCP injeta automaticamente as informações necessárias (como connection strings e URLs de serviço) como variáveis de ambiente no processo dependente.
Teste seu entendimento!

Você adiciona um novo contêiner Redis ao seu projeto AppHost usando builder.AddRedis("cache"). Em seguida, você adiciona uma referência a ele em seu projeto de API com myApi.WithReference(cache).

Qual componente é diretamente responsável por:

  1. Puxar a imagem Docker do Redis?
  2. Decidir qual porta o contêiner Redis usará no host?
  3. Criar a variável de ambiente ConnectionStrings__cache e injetá-la no processo da sua API?
Show answer

Em todos os três casos, o responsável direto é o Developer Control Plane (DCP). O projeto App Host apenas declara a intenção de ter um contêiner Redis e uma dependência. O DCP é o motor que executa essas instruções: ele interage com o Docker para gerenciar a imagem e o contêiner, gerencia a alocação de portas e constrói e injeta as variáveis de ambiente.


4. Uma Análise Mais Profunda do DCP

Dado seu interesse em como as coisas funcionam, vale a pena notar que a comunicação entre o App Host e o DCP utiliza um protocolo e convenções compatíveis com Kubernetes. O App Host usa uma biblioteca cliente de Kubernetes para conversar com o servidor de API do DCP. Isso não significa que você está rodando Kubernetes localmente, mas sim que o Aspire utiliza esses padrões de API robustos e testados em batalha para sua orquestração local. Isso também cria uma ponte conceitual para quando você for aprender Kubernetes mais tarde.

O vídeo a seguir reforça visualmente essa separação de responsabilidades.

.NET Aspire Tutorial For Beginners

Este trecho do vídeo de Julio Casal resume perfeitamente a arquitetura que acabamos de discutir na documentação.

Assista ao segmento de 27:57 a 30:48. Ele explica o Application Model como um "blueprint" e mostra como o App Host delega a orquestração para o DCP, que por sua vez delega o gerenciamento de contêineres para um runtime como o Docker.

Se você estiver curioso sobre a implementação do DCP, a documentação revela mais detalhes.

Aspire architecture

Para uma visão ainda mais profunda, a documentação tem uma seção específica sobre o DCP.

Leia rapidamente a seção "Developer control plane". Não é necessário memorizar, mas observe que o DCP é escrito em Go (a mesma linguagem do Kubernetes e Docker) e é composto por um servidor de API (dcp.exe) e um controlador (dcpctrl.exe). Isso demonstra a robustez da ferramenta que opera nos bastidores.


5. O Resultado da Orquestração

Depois que o DCP faz seu trabalho, o resultado é um ambiente de desenvolvimento local totalmente funcional, onde todos os seus serviços e dependências estão rodando e configurados para se comunicarem.

A maneira mais visível de observar o resultado da orquestração é através de duas coisas:

  1. Variáveis de Ambiente Injetadas: Como mencionado, o DCP injeta as configurações. Você pode inspecionar as variáveis de ambiente de um serviço no Aspire Dashboard para ver exatamente o que foi fornecido.
  2. O Aspire Dashboard: A interface do dashboard é, na verdade, uma representação visual do estado do sistema que o DCP está gerenciando. As abas "Resources" e "Graph" mostram os recursos que você definiu no App Host e como eles estão conectados.

I Replaced Docker Compose with .NET Aspire. Here’s What Happened

Vamos ver a orquestração em ação. Este vídeo mostra o resultado final: como as connection strings aparecem nas variáveis de ambiente e como a aplicação orquestrada é visualizada no dashboard.

Assista aos trechos 08:25 a 09:09 e 10:18 a 10:38. O primeiro mostra a variável de ambiente da connection string injetada dinamicamente. O segundo mostra as visualizações de "Resources" e "Graph" no dashboard, que refletem o Application Model que você definiu no App Host.


Conclusão

Nesta lição, desvendamos o funcionamento do .NET Aspire App Host. Fomos além da superfície para entender a mecânica da orquestração local.

Principais Pontos:

  • O App Host é um projeto .NET onde você define o Application Model — a planta da sua aplicação distribuída — usando código C#.
  • Ele atua como o orquestrador apenas durante o desenvolvimento local (o que o Aspire chama de "Run mode").
  • O App Host delega o trabalho de orquestração para um motor de bastidores chamado Developer Control Plane (DCP).
  • O DCP é o componente que realmente gerencia o ciclo de vida dos recursos, a ordem de inicialização, a configuração de rede e a injeção de configuração por meio de variáveis de ambiente.
  • Essa arquitetura proporciona uma experiência de desenvolvimento poderosa e integrada, aproveitando padrões de API do ecossistema cloud-native (como os do Kubernetes) para uma orquestração local robusta.

Agora que entendemos a teoria de como o App Host orquestra, na próxima lição, vamos colocar a mão na massa. Criaremos nosso próprio projeto App Host do zero e adicionaremos nosso primeiro serviço a ele, colocando esse conhecimento em prática.