Aula 17 - Arquiteturas de APIs Avançadas (GraphQL vs REST vs gRPC) 🌐
Objetivo Pedagógico
Objetivo: Análise comparativa e arquitetura de estilos de comunicação entre serviços: RESTful com HATEOAS, GraphQL para consultas sob demanda e gRPC com Protocol Buffers.
📑 1. Fundamentos Teóricos & Análise Técnica
A escolha do protocolo e estilo arquitetural de uma API define a escalabilidade, o consumo de banda de rede e a complexidade de integração entre sistemas. No cenário de engenharia moderna, três paradigmas predominam: 1. REST (Representational State Transfer): Baseado nos verbos e códigos de status do HTTP (GET, POST, PUT, DELETE), com suporte universal a cache e HATEOAS. Contudo, padece frequentemente de problemas de Over-fetching (receber mais dados do que o necessário) ou Under-fetching (necessitar de múltiplas requisições sequenciais para montar uma tela). 2. GraphQL: Permite que o cliente defina declarativamente o formato exato da resposta através de um esquema fortemente tipado (Schema Definition Language - SDL). Resolve o over/under-fetching em uma única chamada HTTP POST, mas exige complexidade adicional para cache em nível de rede e controle de complexidade de queries. 3. gRPC (Google Remote Procedure Call): Protocolo de alta performance executado sobre HTTP/2 com serialização binária compacta através de Protocol Buffers (protobuf). É o padrão de fato para comunicação síncrona entre microsserviços internos, reduzindo drasticamente a latência e o overhead de CPU comparado ao JSON textual.
📐 Arquitetura Conceitual & Diagrama de Fluxo
graph TD
ClientWeb["Web Client / SPA"] -->|GraphQL (Sob Demanda)| Gateway["API Gateway / BFF"]
ClientMobile["Mobile Client"] -->|REST / JSON| Gateway
Gateway -->|gRPC / HTTP2 Protobuf (Ultrarrápido)| ServiceAuth["Microsserviço Auth"]
Gateway -->|gRPC / HTTP2 Protobuf| ServiceOrders["Microsserviço Pedidos"]
Gateway -->|gRPC / HTTP2 Protobuf| ServicePayment["Microsserviço Pagamentos"]
style ClientWeb fill:#e1f5fe,stroke:#01579b
style Gateway fill:#fff3e0,stroke:#e65100
style ServiceOrders fill:#e8f5e9,stroke:#2e7d32 🔍 Pilares e Diretrizes Técnicas
Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Contrato por Esquema Forte: Uso de arquivos .proto ou .graphql para validação bidirecional de payloads. - Multiplexação HTTP/2: Envio concorrente de múltiplas requisições em uma única conexão TCP persistente em gRPC. - Mitigação de Over-fetching: GraphQL garante payloads enxutos essenciais para conexões móveis lentas. - Idempotência em Métodos REST: Garantia de que operações PUT e DELETE possam ser repetidas com segurança em falhas de rede.
🛠️ 2. Implementação Prática em Arquitetura de APIs e Protocolos de Rede
Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:
// order_service.proto (Contrato gRPC com Protocol Buffers v3)
syntax = "proto3";
package ecommerce.orders.v1;
option go_package = "ecommerce/orders/v1;ordersv1";
service OrderService {
rpc CreateOrder (CreateOrderRequest) returns (OrderResponse);
rpc StreamOrderUpdates (OrderStreamRequest) returns (stream OrderStatusUpdate);
}
message CreateOrderRequest {
string customer_id = 1;
repeated OrderItem items = 2;
double total_amount = 3;
}
message OrderItem {
string product_id = 1;
int32 quantity = 2;
double unit_price = 3;
}
message OrderResponse {
string order_id = 1;
string status = 2;
int64 created_at_unix = 3;
}
message OrderStreamRequest {
string order_id = 1;
}
message OrderStatusUpdate {
string status = 1;
string message = 2;
}
💡 Análise Passo a Passo do Código
- Sintaxe Proto3 Compacta: Campos numéricos (
= 1,= 2) representam tags binárias que eliminam o envio de strings de nomes de chaves na rede. - Streaming Bidirecional:
stream OrderStatusUpdatepermite que o servidor envie atualizações contínuas de status em tempo real via HTTP/2. - Geração de Código Multi-Linguagem: O compilador
protocgera stubs tipados automaticamente para Go, Java, Python, C# e Node.js.
🎯 3. Próximos Passos & Sequência Didática
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto