Pular para conteúdo

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

  1. Sintaxe Proto3 Compacta: Campos numéricos (= 1, = 2) representam tags binárias que eliminam o envio de strings de nomes de chaves na rede.
  2. Streaming Bidirecional: stream OrderStatusUpdate permite que o servidor envie atualizações contínuas de status em tempo real via HTTP/2.
  3. Geração de Código Multi-Linguagem: O compilador protoc gera stubs tipados automaticamente para Go, Java, Python, C# e Node.js.

🎯 3. Próximos Passos & Sequência Didática