Gateway responsável por intermediar a comunicação entre a interface web e o servidor de processamento de imagens utilizando gRPC sobre HTTP/2.
O projeto segue uma arquitetura composta por três projetos:
┌──────────────────────────────────────────────────────────────┐
│ Browser │
│ (HTML + JavaScript) │
└──────────────────────────────┬───────────────────────────────┘
│ HTTP
▼
┌──────────────────────────────────────────────────────────────┐
│ Gateway (.NET 8) │
│--------------------------------------------------------------│
│ • Hospeda a interface web │
│ • Recebe o upload da imagem │
│ • Atua como cliente gRPC │
│ • Encaminha a requisição para o Server │
│ • Retorna a imagem processada │
└──────────────────────────────┬───────────────────────────────┘
│ gRPC + HTTP/2
▼
┌──────────────────────────────────────────────────────────────┐
│ Server (.NET 8 + gRPC) │
│--------------------------------------------------------------│
│ • Implementa o serviço gRPC │
│ • Processa a imagem │
│ • Aplica o filtro de escala de cinza │
│ • Retorna a imagem processada │
└──────────────────────────────────────────────────────────────┘
Responsável por:
- Hospedar a interface web.
- Receber o upload da imagem.
- Validar o arquivo enviado.
- Comunicar-se com o Server através de gRPC.
- Retornar a imagem processada ao navegador.
O Gateway não realiza processamento de imagem.
Responsável por:
- Implementar o serviço gRPC.
- Receber a requisição enviada pelo Gateway.
- Aplicar o filtro de escala de cinza.
- Retornar a imagem processada.
Projeto responsável por compartilhar os contratos gRPC entre o Gateway e o Server.
Contém:
- Arquivos
.proto - Classes C# geradas automaticamente
Usuário
↓
Seleciona uma imagem
↓
Browser
↓
POST /process-image
↓
Gateway
↓
ImageProcessingService
↓
gRPC
↓
Server
↓
Processa imagem
↓
Resposta gRPC
↓
Gateway
↓
Imagem processada
↓
Browser
- .NET 8
- ASP.NET Core
- Razor Pages
- Minimal APIs
- gRPC
- HTTP/2
- Protocol Buffers
- Kestrel
Executa o serviço gRPC.
Porta:
https://localhost:7101
Configurado para utilizar HTTP/2 através do Kestrel.
Executa a interface web.
Porta:
https://localhost:7102
Também configurado utilizando HTTP/2.
O Gateway registra um cliente gRPC apontando para o Server:
builder.Services.AddGrpcClient<ImageService.ImageServiceClient>(options =>
{
options.Address = new Uri("https://localhost:7101");
});Toda a comunicação entre os dois backends ocorre através de gRPC.
O endpoint responsável pelo upload é:
POST /process-image
Fluxo interno:
- Recebe a imagem enviada pelo navegador.
- Valida o arquivo.
- Converte a imagem para
byte[]. - Chama o
ImageProcessingService. - O serviço monta a requisição gRPC.
- O Server processa a imagem.
- O Gateway retorna a imagem processada.
A comunicação gRPC foi isolada na classe:
ImageProcessingService
Essa classe possui como responsabilidade:
- montar a requisição gRPC;
- chamar o Server;
- receber a resposta;
- retornar apenas os bytes da imagem.
Dessa forma, o Program.cs permanece responsável apenas pelo fluxo HTTP da aplicação.
Selecionar o projeto Server como Startup Project e iniciar a aplicação.
O servidor ficará disponível em:
https://localhost:7101
Selecionar o projeto Gateway como Startup Project e iniciar a aplicação.
A interface ficará disponível em:
https://localhost:7102
- Abrir o Gateway no navegador.
- Selecionar uma imagem.
- Clicar em Enviar para processamento.
- O Gateway enviará a imagem ao Server utilizando gRPC.
- O Server retornará a imagem em escala de cinza.
- A interface exibirá a imagem processada.
- Opcionalmente, realizar o download da imagem.
A solução utiliza um padrão semelhante ao Backend for Frontend (BFF).
Browser
│
▼
Gateway
│
▼
gRPC Server
Dessa forma:
- O navegador nunca acessa diretamente o serviço gRPC.
- Toda a comunicação ocorre através do Gateway.
- O processamento permanece isolado no Server.
- A comunicação entre Gateway e Server utiliza gRPC sobre HTTP/2.
- O projeto Shared centraliza os contratos compartilhados entre os dois backends.
- A separação entre Gateway e Server permite desacoplar a interface do processamento da imagem, facilitando a manutenção e a evolução da aplicação.