An open API service indexing awesome lists of open source software.

https://github.com/eneas-almeida/grpc

πŸ“œ Guia gRPC, elaborado por EnΓ©as Almeida com o principal objetivo de facilitar os repasses de informaΓ§Γ΅es Γ  equipe.
https://github.com/eneas-almeida/grpc

evans golang grpc protobuf reflection sqlite3

Last synced: 30 days ago
JSON representation

πŸ“œ Guia gRPC, elaborado por EnΓ©as Almeida com o principal objetivo de facilitar os repasses de informaΓ§Γ΅es Γ  equipe.

Awesome Lists containing this project

README

          

# gRPC - Guia Completo

> Este guia foi elaborado por **EnΓ©as Almeida** com o principal objetivo de facilitar os repasses de informaΓ§Γ΅es Γ  equipe.

```
____ ____ ____ ____
/ ___| _ \ / ___| / ___|
| | _| |_) | | | |
| |_| | _ <| |___ | |___
\____|_| \_\\____| \____|
```

## πŸ“‹ Índice

- [O que Γ© gRPC?](#o-que-Γ©-grpc)
- [CaracterΓ­sticas Principais](#caracterΓ­sticas-principais)
- [Onde Utilizar](#onde-Γ©-ideal-para-utilizar)
- [Conceitos Fundamentais](#conceitos-fundamentais)
- [Protocol Buffers](#protocol-buffers)
- [HTTP/2](#http2)
- [Tipos de ComunicaΓ§Γ£o](#formatos-de-trΓ‘fego-entre-comunicaΓ§Γ£o-grpc)
- [REST vs gRPC](#rest-vs-grpc)
- [InstalaΓ§Γ£o e ConfiguraΓ§Γ£o](#prΓ©-requisitos)
- [Comandos Úteis](#comandos)

## O que Γ© gRPC?

**gRPC** (gRPC Remote Procedure Call) Γ© um framework moderno de comunicaΓ§Γ£o entre sistemas desenvolvido pelo Google que permite a comunicaΓ§Γ£o eficiente e rΓ‘pida entre serviΓ§os distribuΓ­dos.

### CaracterΓ­sticas Principais

- **Desenvolvedor:** Google
- **Mantenedor:** CNCF (Cloud Native Computing Foundation) - mesma organizaΓ§Γ£o que mantΓ©m Kubernetes e OpenTelemetry
- **LanΓ§amento:** Fevereiro de 2015
- **LicenΓ§a:** CΓ³digo aberto
- **Protocolo:** HTTP/2
- **SerializaΓ§Γ£o:** Protocol Buffers (protobuf)
- **Performance:** Alta velocidade com baixa latΓͺncia
- **SeguranΓ§a:** Suporte nativo a TLS/SSL
- **IndependΓͺncia:** AgnΓ³stico de linguagem de programaΓ§Γ£o

## Links importantes

- [grpc.io](https://grpc.io/) - Site oficial do gRPC.
- [protobuf.dev](https://protobuf.dev/) - Manual Protocol Buffers.

## Onde Γ© ideal para utilizar?

- MicrosserviΓ§os;
- AplicaΓ§Γ΅es em tempo real;
- Sistemas distribuΓ­dos;
- AplicaΓ§Γ΅es IOT;
- Streaming de dados.

## Linguagens com suporte oficial

- Go
- Java
- C

AtravΓ©s do gRPC-C Γ© possΓ­vel utilizar python, nodejs, kotlin e etc.

## Conceitos Fundamentais

### O que significa na prΓ‘tica o Remote Procedure Call (RPC)?

RPC permite que um programa execute uma funΓ§Γ£o/procedimento em outro espaΓ§o de endereΓ§amento (geralmente em outra mΓ‘quina) como se fosse uma chamada local.

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ ARQUITETURA gRPC β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Cliente Servidor
β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ β”‚ β”‚
β”‚ App β”‚ β”‚ App β”‚
β”‚ β”‚ β”‚ β”‚
β””β”€β”€β”¬β”€β”€β”€β”˜ β””β”€β”€β”€β”¬β”€β”€β”˜
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ 1. Chamada de MΓ©todo β”‚ β”‚
β”œβ”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚ β”‚
β”‚ β”‚ getAccount(id: "123") β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”Œβ”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”
β”‚ gRPC β”‚ ◄───── HTTP/2 ─────► β”‚ gRPC β”‚
β”‚ Stub β”‚ β”‚ Server β”‚
β””β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”˜
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ 2. SerializaΓ§Γ£o Protobuf β”‚ β”‚
β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ β”‚ β”‚ Binary Data β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ [01010101...] β”‚ β”‚ β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ 3. Transporte HTTP/2 β”‚ β”‚
β”œβ”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚ β”‚
β”‚ β”‚ Headers + Binary Payload β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”΄β”€β”€β”€β”
β”‚ β”‚ Exec β”‚
β”‚ β”‚ Func β”‚
β”‚ β””β”€β”€β”¬β”€β”€β”€β”˜
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ 4. Resposta (Protobuf) β”‚ β”‚
β”‚ │◄─────────────────────────────────┼───────────
β”‚ β”‚ Account{id, name, email} β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”Œβ”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”΄β”€β”€β”
β”‚ Processa β”‚ β”‚ β”‚
β”‚ Resposta β”‚ β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜

Fluxo Detalhado:
─────────────────

1. Cliente chama mΓ©todo como se fosse local
2. gRPC Stub serializa parΓ’metros (Protobuf)
3. Dados binΓ‘rios sΓ£o enviados via HTTP/2
4. Servidor deserializa e executa a funΓ§Γ£o
5. Resultado Γ© serializado e retornado
6. Cliente recebe e deserializa a resposta
```

**EvoluΓ§Γ£o HistΓ³rica:**
- **Passado:** XML-RPC, SOAP (XML) - verboso e lento
- **Presente:** gRPC (Protobuf) - compacto e rΓ‘pido
- **Vantagem:** Contratos fortemente tipados (.proto files)

## Protocol Buffers

Protocol Buffers (Protobuf) Γ© uma linguagem de definiΓ§Γ£o de interface (IDL) criada pelo Google para serializaΓ§Γ£o estruturada de dados.

### CaracterΓ­sticas do Protocol Buffers

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ PROTOCOL BUFFERS WORKFLOW β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

1. DEFINIÇÃO DO CONTRATO (.proto)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ syntax = "proto3"; β”‚
β”‚ β”‚
β”‚ message Account { β”‚
β”‚ string id = 1; β”‚
β”‚ string name = 2; β”‚
β”‚ string email = 3; β”‚
β”‚ } β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”‚ protoc compiler
β–Ό
2. GERAÇÃO DE CΓ“DIGO
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Go β”‚ Java β”‚ Python β”‚
β”‚ ──────── β”‚ ────── β”‚ ───────── β”‚
β”‚ account. β”‚ Account β”‚ account_ β”‚
β”‚ pb.go β”‚ .java β”‚ pb2.py β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”‚
β–Ό
3. SERIALIZAÇÃO (Objeto β†’ BinΓ‘rio)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Account Object β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ id: "12345" β”‚ β”‚
β”‚ β”‚ name: "JoΓ£o Silva" β”‚ β”‚
β”‚ β”‚ email: "joao@email.com" β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”‚ Marshal/Encode
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Binary Format (Compact) β”‚
β”‚ [0x0a 0x05 0x31 0x32 0x33 0x34...] β”‚
β”‚ Tamanho: ~45 bytes β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”‚ Network Transfer
β–Ό
4. DESERIALIZAÇÃO (BinΓ‘rio β†’ Objeto)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Unmarshal/Decode β”‚
β”‚ β”‚
β”‚ Account Object (ReconstruΓ­do) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

### Vantagens do Protocol Buffers

- **Formato BinΓ‘rio:** Dados compactos e eficientes
- **Contratos Tipados:** ValidaΓ§Γ£o em tempo de compilaΓ§Γ£o
- **SerializaΓ§Γ£o RΓ‘pida:** Alto desempenho (CPU eficiente)
- **Baixo Consumo de Rede:** Arquivos 3-10x menores que JSON
- **Retrocompatibilidade:** EvoluΓ§Γ£o de schema sem quebrar compatibilidade
- **Multi-linguagem:** GeraΓ§Γ£o automΓ‘tica de cΓ³digo
- **Independente:** Pode ser usado sem gRPC

### Protocol Buffers vs JSON

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ COMPARAÇÃO: PROTOBUF vs JSON β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

EXEMPLO: Objeto Account
──────────────────────────────────────────────────────────────────

JSON (Texto) β”‚ Protobuf (BinΓ‘rio)
──────────────────────────────────┼──────────────────────────────
{ β”‚ [Binary Data]
"id": "12345", β”‚ 0x0a 0x05 0x31 0x32 0x33
"name": "JoΓ£o Silva", β”‚ 0x34 0x35 0x12 0x0b 0x4a
"email": "joao@email.com" β”‚ 0xc3 0xa3 0x6f 0x20 0x53
} β”‚ ... [compressed]
β”‚
Tamanho: ~98 bytes β”‚ Tamanho: ~45 bytes
──────────────────────────────────┼──────────────────────────────
βœ— Texto legΓ­vel β”‚ βœ“ BinΓ‘rio otimizado
βœ— Parsing mais lento β”‚ βœ“ Parsing 3-10x mais rΓ‘pido
βœ— Mais bytes na rede β”‚ βœ“ Menos uso de banda
βœ— Sem validaΓ§Γ£o de tipo β”‚ βœ“ ValidaΓ§Γ£o forte de tipos
βœ“ Human-readable β”‚ βœ— NΓ£o legΓ­vel (requer decode)
βœ“ Debugging mais fΓ‘cil β”‚ βœ— Requer ferramentas especiais

PERFORMANCE BENCHMARK
──────────────────────────────────────────────────────────────────
MΓ©trica β”‚ JSON β”‚ Protobuf β”‚ Ganho
─────────────────────┼────────────┼─────────────┼─────────────────
SerializaΓ§Γ£o β”‚ 1000 ns β”‚ 300 ns β”‚ 3.3x
DeserializaΓ§Γ£o β”‚ 1200 ns β”‚ 400 ns β”‚ 3.0x
Tamanho (10KB JSON) β”‚ 10,000 B β”‚ 3,000 B β”‚ 3.3x
CPU (Serialize 1M) β”‚ 100% β”‚ 30% β”‚ 3.3x
Uso de MemΓ³ria β”‚ Alto β”‚ Baixo β”‚ 2-3x
```

### Estrutura de um Arquivo .proto

```proto
syntax = "proto3"; // VersΓ£o do Protocol Buffers

package pb; // Namespace do pacote

option go_package = "./pb"; // Caminho de geraΓ§Γ£o para Go

// DefiniΓ§Γ£o de mensagem (estrutura de dados)
message Account {
string id = 1; // Campo 1: identificador ΓΊnico
string name = 2; // Campo 2: nome da conta
string email = 3; // Campo 3: email da conta
}

// DefiniΓ§Γ£o de serviΓ§o (APIs disponΓ­veis)
service AccountService {
rpc CreateAccount (Account) returns (Account);
rpc GetAccount (AccountRequest) returns (Account);
rpc ListAccounts (Empty) returns (stream Account);
}

message AccountRequest {
string id = 1;
}

message Empty {}
```

**PadrΓ£o:** Arquivo `.proto` (protofile)
**VersΓ£o Recomendada:** `proto3` (para gRPC)
**Compilador:** `protoc` (Protocol Buffer Compiler)

## HTTP/2

HTTP/2 Γ© a base de transporte do gRPC, oferecendo recursos avanΓ§ados para comunicaΓ§Γ£o eficiente.

### CaracterΓ­sticas do HTTP/2

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ HTTP/1.1 vs HTTP/2 COMPARISON β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

HTTP/1.1 (Texto) HTTP/2 (BinΓ‘rio)
─────────────────────────────────────────────────────────────────

MÚLTIPLAS REQUISIÇÕES:
──────────────────────────────────────────────────────────────────
Cliente Servidor Cliente Servidor
β”‚ β”‚ β”‚ β”‚
β”œβ”€β”€β”€β”€ Req 1 ────►│ β”œβ”€β”€β”¬β”€ Req 1 ────►│
β”‚ β”‚ β”‚ β”œβ”€ Req 2 ────►│
│◄─── Res 1 ────── β”‚ └─ Req 3 ────►│
β”‚ β”‚ β”‚ β”‚
β”œβ”€β”€β”€β”€ Req 2 ────►│ │◄─┬─ Res 1 ──────
β”‚ β”‚ β”‚ β”œβ”€ Res 3 ──────
│◄─── Res 2 ────── β”‚ └─ Res 2 ──────
β”‚ β”‚ β”‚ β”‚
β”œβ”€β”€β”€β”€ Req 3 ────►│ MULTIPLEXING:
β”‚ β”‚ Uma ΓΊnica conexΓ£o TCP!
│◄─── Res 3 ──────
β”‚ β”‚
3 conexΓ΅es TCP 1 conexΓ£o TCP

ESTRUTURA DE FRAMES:
──────────────────────────────────────────────────────────────────
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ HTTP/2 FRAME β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Header β”‚ Length (24) β”‚ Type (8) β”‚ Flags (8) β”‚ Stream β”‚
β”‚ (9 bytes)β”‚ β”‚ β”‚ β”‚ ID(31) β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Payload β”‚ β”‚
β”‚ (N bytes)β”‚ Frame Data β”‚
β”‚ β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Frame Types:
β€’ HEADERS - Metadados da requisiΓ§Γ£o/resposta
β€’ DATA - Payload da mensagem
β€’ SETTINGS - ConfiguraΓ§Γ΅es da conexΓ£o
β€’ PING - Keep-alive
β€’ GOAWAY - Encerramento da conexΓ£o

MULTIPLEXING EM AÇÃO:
──────────────────────────────────────────────────────────────────
Conexão TCP Única
═════════════════════════════════════════════

Stream 1 ────► [HEADERS] [DATA] [DATA]
Stream 3 ────► [HEADERS] [DATA]
Stream 5 ────► [HEADERS] [DATA]
Stream 7 ────► [HEADERS] [DATA]

⬇ Mesma ConexΓ£o TCP ⬇

Stream 1 ◄──── [HEADERS] [DATA]
Stream 3 ◄──── [HEADERS] [DATA]
Stream 5 ◄──── [HEADERS] [DATA]
Stream 7 ◄──── [HEADERS] [DATA] [DATA]

SERVER PUSH:
──────────────────────────────────────────────────────────────────
Cliente Servidor
β”‚ β”‚
β”œβ”€β”€β”€β”€ Request: index.html ──────►│
β”‚ β”‚
│◄──── Response: index.html ──────
│◄──── Push: style.css ─────────── (Antecipado!)
│◄──── Push: script.js ─────────── (Antecipado!)
β”‚ β”‚
(Cliente recebe recursos antes de solicitar)

COMPRESSÃO DE HEADERS (HPACK):
──────────────────────────────────────────────────────────────────
Request 1:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ :method: GET β”‚
β”‚ :path: /api/accounts/123 β”‚
β”‚ :authority: api.example.com β”‚
β”‚ user-agent: grpc-go/1.50.0 β”‚
β”‚ content-type: application/grpc+proto β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Tamanho: ~200 bytes

Request 2 (mesma conexΓ£o):
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ [2] [3] ← ReferΓͺncias
β”‚ :path: /api/accounts/456 ← SΓ³ o diff
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Tamanho: ~15 bytes (93% menor!)
```

### BenefΓ­cios do HTTP/2 para gRPC

- **Origem:** Criado pela Google como projeto SPDY
- **LanΓ§amento:** Maio de 2015 (RFC 7540)
- **Formato BinΓ‘rio:** Parsing mais eficiente que texto
- **Multiplexing:** MΓΊltiplas requisiΓ§Γ΅es simultΓ’neas em uma conexΓ£o TCP
- **Server Push:** Servidor pode enviar recursos proativamente
- **Header Compression (HPACK):** ReduΓ§Γ£o de overhead
- **PriorizaΓ§Γ£o de Streams:** Controle de precedΓͺncia de requisiΓ§Γ΅es
- **Flow Control:** Gerenciamento de backpressure
- **Baixa LatΓͺncia:** Reduz roundtrips
- **Economia de Recursos:** Menos conexΓ΅es TCP = menos overhead

### HTTP/2 vs HTTP/1.1

| CaracterΓ­stica | HTTP/1.1 | HTTP/2 |
|---|---|---|
| **Formato** | Texto | BinΓ‘rio |
| **Conexáes** | Múltiplas (6-8 por host) | Única por host |
| **Multiplexing** | NΓ£o | Sim |
| **Header Compression** | NΓ£o | Sim (HPACK) |
| **Server Push** | NΓ£o | Sim |
| **PriorizaΓ§Γ£o** | NΓ£o | Sim |
| **Performance** | Moderada | Alta |
| **LatΓͺncia** | Alta (head-of-line blocking) | Baixa |

## Formatos de trΓ‘fego entre comunicaΓ§Γ£o gRPC

gRPC suporta 4 padrΓ΅es de comunicaΓ§Γ£o distintos, cada um otimizado para diferentes casos de uso.

### 1. Unary RPC (RequisiΓ§Γ£o-Resposta Simples)

O padrΓ£o mais comum, similar ao REST tradicional: uma requisiΓ§Γ£o, uma resposta.

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ UNARY RPC FLOW β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Cliente Servidor
──────── ─────────

[App] [App]
β”‚ β”‚
β”‚ 1. Chamada do mΓ©todo β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί β”‚
β”‚ GetAccount(id: "123") β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”΄β”€β”€β”
β”‚ β”‚Queryβ”‚
β”‚ β”‚ DB β”‚
β”‚ β””β”€β”€β”¬β”€β”€β”˜
β”‚ β”‚
β”‚ 2. Resposta ΓΊnica β”‚
β”‚ ◄────────────────────────────────────────
β”‚ Account{id, name, email} β”‚
β”‚ β”‚
β–Ό β–Ό
[Processa] [Done]

EXEMPLO DE CΓ“DIGO (.proto):
────────────────────────────────────────────────────────────────
service AccountService {
rpc GetAccount(AccountRequest) returns (Account);
}

USO TÍPICO:
β€’ APIs CRUD bΓ‘sicas (Create, Read, Update, Delete)
β€’ ValidaΓ§Γ΅es simples
β€’ OperaΓ§Γ΅es sΓ­ncronas
β€’ SubstituiΓ§Γ£o direta de REST/HTTP APIs

FLUXO TEMPORAL:
────────────────────────────────────────────────────────────────
t=0ms Cliente envia requisiΓ§Γ£o
t=50ms Servidor recebe e processa
t=100ms Servidor envia resposta
t=150ms Cliente recebe resposta

Total: ~150ms (roundtrip completo)
```

### 2. Server Streaming RPC (Servidor Envia MΓΊltiplas Respostas)

Cliente envia uma requisiΓ§Γ£o e recebe um stream de mΓΊltiplas respostas do servidor.

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ SERVER STREAMING RPC FLOW β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Cliente Servidor
──────── ─────────

[App] [App]
β”‚ β”‚
β”‚ 1. RequisiΓ§Γ£o ΓΊnica β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί β”‚
β”‚ ListAccounts(filter) β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”΄β”€β”€β”
β”‚ 2. Stream de respostas β”‚Queryβ”‚
β”‚ ◄──────────────────────────────────┐ β”‚ DB β”‚
β”‚ Account #1 β”‚ β””β”€β”€β”¬β”€β”€β”˜
β”œβ”€β–Ί [Processa] β”‚ β”‚
β”‚ β”‚ β”‚
β”‚ ◄─────────────────────────────────── β”‚
β”‚ Account #2 β”‚ β”‚
β”œβ”€β–Ί [Processa] β”‚ β”‚
β”‚ β”‚ β”‚
β”‚ ◄─────────────────────────────────── β”‚
β”‚ Account #3 β”‚ β”‚
β”œβ”€β–Ί [Processa] β”‚ β”‚
β”‚ β”‚ β”‚
β”‚ ◄─────────────────────────────────── β”‚
β”‚ Account #N β”‚ β”‚
β”œβ”€β–Ί [Processa] β”‚ β”‚
β”‚ β”‚ β”‚
β”‚ β—„β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ [END OF STREAM] β”‚
β”‚ β”‚
β–Ό β–Ό
[Complete] [Done]

EXEMPLO DE CΓ“DIGO (.proto):
────────────────────────────────────────────────────────────────
service AccountService {
rpc ListAccounts(ListRequest) returns (stream Account);
}

USO TÍPICO:
β€’ Listagem de grandes volumes de dados
β€’ RelatΓ³rios e exportaΓ§Γ΅es
β€’ Logs em tempo real
β€’ NotificaΓ§Γ΅es push
β€’ Dashboards com dados ao vivo
β€’ Download de arquivos em chunks

VANTAGENS:
β€’ Cliente processa dados incrementalmente (menos memΓ³ria)
β€’ Servidor pode enviar dados conforme processa (streaming)
β€’ Feedback mais rΓ‘pido (primeira resposta chega antes)
β€’ Ideal para datasets grandes

FLUXO TEMPORAL:
────────────────────────────────────────────────────────────────
t=0ms Cliente envia requisiΓ§Γ£o
t=50ms Servidor envia Account #1 ──► Cliente processa
t=100ms Servidor envia Account #2 ──► Cliente processa
t=150ms Servidor envia Account #3 ──► Cliente processa
t=200ms Servidor envia Account #N ──► Cliente processa
t=250ms Stream finalizado

Total: Cliente comeΓ§a a processar em ~50ms!
```

### 3. Client Streaming RPC (Cliente Envia MΓΊltiplas RequisiΓ§Γ΅es)

Cliente envia um stream de requisiΓ§Γ΅es e recebe uma ΓΊnica resposta do servidor.

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ CLIENT STREAMING RPC FLOW β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Cliente Servidor
──────── ─────────

[App] [App]
β”‚ β”‚
β”‚ 1. Abre stream β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί β”‚
β”‚ β”‚
β”‚ 2. Envia dados #1 β”Œβ”€β”€β”΄β”€β”€β”€β”
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚Bufferβ”‚
β”‚ Account{...} β””β”€β”€β”¬β”€β”€β”€β”˜
β”‚ β”‚
β”‚ 3. Envia dados #2 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί β”‚
β”‚ Account{...} β”‚
β”‚ β”‚
β”‚ 4. Envia dados #3 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί β”‚
β”‚ Account{...} β”‚
β”‚ β”‚
β”‚ 5. Envia dados #N β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί β”‚
β”‚ Account{...} β”‚
β”‚ β”‚
β”‚ 6. Fecha stream (EOF) β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”΄β”€β”€β”
β”‚ β”‚Batchβ”‚
β”‚ β”‚Save β”‚
β”‚ β””β”€β”€β”¬β”€β”€β”˜
β”‚ β”‚
β”‚ 7. Resposta final β”‚
β”‚ ◄────────────────────────────────────────
β”‚ Summary{total: N, success: M} β”‚
β”‚ β”‚
β–Ό β–Ό
[Complete] [Done]

EXEMPLO DE CΓ“DIGO (.proto):
────────────────────────────────────────────────────────────────
service AccountService {
rpc CreateAccounts(stream Account) returns (Summary);
}

USO TÍPICO:
β€’ Upload de arquivos grandes em chunks
β€’ ImportaΓ§Γ£o em lote (batch insert)
β€’ Telemetria e mΓ©tricas (envio contΓ­nuo)
β€’ AgregaΓ§Γ΅es de dados
β€’ Backup incremental

VANTAGENS:
β€’ Cliente envia dados conforme disponΓ­veis
β€’ Servidor processa em lote (mais eficiente)
β€’ Reduz overhead de mΓΊltiplas conexΓ΅es
β€’ Ideal para uploads e batch operations

FLUXO TEMPORAL:
────────────────────────────────────────────────────────────────
t=0ms Cliente abre stream
t=10ms Cliente envia Account #1
t=20ms Cliente envia Account #2
t=30ms Cliente envia Account #3
t=40ms Cliente envia Account #N
t=50ms Cliente fecha stream
t=100ms Servidor processa todos os dados
t=150ms Servidor envia resposta final

Total: ~150ms (mas dados enviados incrementalmente)
```

### 4. Bidirectional Streaming RPC (ComunicaΓ§Γ£o Bidirecional)

Tanto cliente quanto servidor enviam streams de dados de forma independente e assΓ­ncrona.

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ BIDIRECTIONAL STREAMING RPC FLOW β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Cliente Servidor
──────── ─────────

[App] [App]
β”‚ β”‚
β”‚ 1. Abre stream bidirecional β”‚
β”œβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β–Ίβ”‚
β”‚ β”‚
β”‚ 2. Cliente envia msg #1 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί β”‚
β”‚ CreateAccount{name: "JoΓ£o"} β”‚
β”‚ β”‚
β”‚ [Processa]
β”‚ β”‚
β”‚ 3. Servidor responde msg #1 β”‚
β”‚ ◄────────────────────────────────────────
β”‚ Account{id: "123", name: "JoΓ£o"} β”‚
β”œβ”€β–Ί [Processa] β”‚
β”‚ β”‚
β”‚ 4. Cliente envia msg #2 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί β”‚
β”‚ CreateAccount{name: "Maria"} β”‚
β”‚ β”‚
β”‚ 5. Servidor responde msg #2 β”‚
β”‚ ◄────────────────────────────────────────
β”‚ Account{id: "124", name: "Maria"} β”‚
β”œβ”€β–Ί [Processa] β”‚
β”‚ β”‚
β”‚ 6. Cliente envia msg #3 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί β”‚
β”‚ CreateAccount{name: "Pedro"} β”‚
β”‚ β”‚
β”‚ 7. Servidor responde msg #3 β”‚
β”‚ ◄────────────────────────────────────────
β”‚ Account{id: "125", name: "Pedro"} β”‚
β”œβ”€β–Ί [Processa] β”‚
β”‚ β”‚
β”‚ ◄────────────────────────────────────────
β”‚ [Servidor pode enviar a qualquer momento]
β”‚ β”‚
β”‚ 8. Ambos fecham stream β”‚
β”œβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β–Ίβ”‚
β”‚ β”‚
β–Ό β–Ό
[Complete] [Done]

CARACTERÍSTICAS IMPORTANTES:
────────────────────────────────────────────────────────────────
β€’ Os streams sΓ£o INDEPENDENTES:
- Cliente pode enviar sem esperar resposta
- Servidor pode responder fora de ordem
- Ambos podem enviar/receber simultaneamente

β€’ Ordem nΓ£o Γ© garantida (por padrΓ£o)
β€’ Full-duplex: comunicaΓ§Γ£o simultΓ’nea nos dois sentidos
β€’ Streams podem ser fechados independentemente

EXEMPLO DE CΓ“DIGO (.proto):
────────────────────────────────────────────────────────────────
service AccountService {
rpc CreateAccountsStream(stream Account) returns (stream Account);
}

USO TÍPICO:
β€’ Chat em tempo real
β€’ Jogos multiplayer
β€’ Trading de alta frequΓͺncia
β€’ SincronizaΓ§Γ£o de dados
β€’ ColaboraΓ§Γ£o em tempo real (Google Docs style)
β€’ IoT com feedback bidirecional
β€’ Video/Audio streaming com controles

VANTAGENS:
β€’ LatΓͺncia ultra-baixa
β€’ ComunicaΓ§Γ£o full-duplex
β€’ NΓ£o bloqueia (totalmente assΓ­ncrono)
β€’ Ideal para aplicaΓ§Γ΅es interativas em tempo real

FLUXO TEMPORAL (Exemplo):
────────────────────────────────────────────────────────────────
t=0ms Stream aberto
t=10ms Cliente β†’ Servidor (msg #1)
t=20ms Servidor β†’ Cliente (response #1)
t=25ms Cliente β†’ Servidor (msg #2)
t=30ms Cliente processa response #1
t=35ms Servidor β†’ Cliente (response #2)
t=40ms Cliente β†’ Servidor (msg #3)
t=45ms Cliente processa response #2
t=50ms Servidor β†’ Cliente (response #3)
...
(ComunicaΓ§Γ£o contΓ­nua e assΓ­ncrona)
```

### ComparaΓ§Γ£o dos 4 PadrΓ΅es

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ COMPARAÇÃO DOS PADRΓ•ES DE COMUNICAÇÃO β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

PadrΓ£o β”‚ Cliente β†’ β”‚ Servidor β†’ β”‚ Caso de Uso
β”‚ Servidor β”‚ Cliente β”‚
────────────────────┼───────────┼────────────┼────────────────────
1. Unary β”‚ 1 msg β”‚ 1 msg β”‚ CRUD, APIs simples
β”‚ β”‚ β”‚
2. Server Streaming β”‚ 1 msg β”‚ N msgs β”‚ Listagens, logs,
β”‚ β”‚ β”‚ notificaΓ§Γ΅es
β”‚ β”‚ β”‚
3. Client Streaming β”‚ N msgs β”‚ 1 msg β”‚ Upload, batch,
β”‚ β”‚ β”‚ mΓ©tricas
β”‚ β”‚ β”‚
4. Bidirectional β”‚ N msgs β”‚ N msgs β”‚ Chat, jogos,
Streaming β”‚ β”‚ β”‚ real-time sync
────────────────────┴───────────┴────────────┴────────────────────

ESCOLHA DO PADRÃO:
──────────────────────────────────────────────────────────────────
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Precisa enviar/receber mΓΊltiplas mensagens? β”‚
β”‚ β”‚
β”‚ NΓ£o Sim, mas sΓ³ uma direΓ§Γ£o Sim, ambas β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β–Ό β–Ό β–Ό β”‚
β”‚ UNARY Quem envia mΓΊltiplas? BIDIRECTIONAL β”‚
β”‚ β”‚ β”‚ STREAMING β”‚
β”‚ β–Ό β–Ό β”‚
β”‚ Cliente Servidor β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β–Ό β–Ό β”‚
β”‚ CLIENT SERVER β”‚
β”‚ STREAMING STREAMING β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

## REST vs gRPC

ComparaΓ§Γ£o detalhada entre os dois paradigmas de comunicaΓ§Γ£o mais populares para APIs.

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ REST vs gRPC COMPARISON β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

ARQUITETURA DE COMUNICAÇÃO:
─────────────────────────────────────────────────────────────────

REST API gRPC API
──────────────────────────────── ──────────────────────────────

Cliente Cliente
β”‚ β”‚
β”‚ HTTP/1.1 β”‚ HTTP/2
β”‚ JSON (Texto) β”‚ Protobuf (BinΓ‘rio)
β”‚ β”‚
β”œβ”€β–Ί POST /api/accounts β”œβ”€β–Ί CreateAccount()
β”‚ { β”‚ Account{...}
β”‚ "name": "JoΓ£o", β”‚
β”‚ "email": "j@mail.com" β”‚
β”‚ } β”‚
β”‚ β”‚
│◄─ 201 Created │◄─ Account{id, name, email}
β”‚ { β”‚
β”‚ "id": "123", β”‚
β”‚ "name": "JoΓ£o", β”‚
β”‚ "email": "j@mail.com" β”‚
β”‚ } β”‚
β”‚ β”‚
Servidor Servidor

CARACTERÍSTICAS TΓ‰CNICAS:
────────────────────────────────────────────────────────────────

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ CaracterΓ­stica β”‚ REST β”‚ gRPC β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Formato de Dados β”‚ JSON (Texto) β”‚ Protobuf (Bin.) β”‚
β”‚ Protocolo β”‚ HTTP/1.1 β”‚ HTTP/2 β”‚
β”‚ Contrato β”‚ OpenAPI/Swagger β”‚ .proto (forte) β”‚
β”‚ GeraΓ§Γ£o de CΓ³digo β”‚ Manual/Opcional β”‚ AutomΓ‘tica β”‚
β”‚ Streaming β”‚ βœ— NΓ£o suportado β”‚ βœ“ Bidirecional β”‚
β”‚ Browser Support β”‚ βœ“ Nativo β”‚ βœ— Requer proxy β”‚
β”‚ Multiplexing β”‚ βœ— NΓ£o β”‚ βœ“ Sim β”‚
β”‚ LatΓͺncia β”‚ Alta β”‚ Baixa β”‚
β”‚ Payload Size β”‚ Grande β”‚ Pequeno (60%) β”‚
β”‚ Verbos/MΓ©todos β”‚ GET/POST/PUT/DEL β”‚ CustomizΓ‘veis β”‚
β”‚ Tipo de ComunicaΓ§Γ£o β”‚ Unidirecional β”‚ Bidirecional β”‚
β”‚ Debugging β”‚ FΓ‘cil (cURL) β”‚ Requer tools β”‚
β”‚ Caching β”‚ βœ“ HTTP Cache β”‚ βœ— Complexo β”‚
β”‚ Load Balancing β”‚ βœ“ PadrΓ£o β”‚ βœ“ Com config β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

EXEMPLO PRÁTICO - CRIAR UMA CONTA:
────────────────────────────────────────────────────────────────

REST:
─────
Request:
POST /api/v1/accounts HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer token123

{
"name": "JoΓ£o Silva",
"email": "joao@example.com"
}

Response:
HTTP/1.1 201 Created
Content-Type: application/json

{
"id": "acc_123",
"name": "JoΓ£o Silva",
"email": "joao@example.com",
"created_at": "2024-01-15T10:30:00Z"
}

Tamanho Total: ~250 bytes

gRPC:
─────
Request:
POST /AccountService/CreateAccount HTTP/2
content-type: application/grpc+proto

[Binary Protobuf Data]
0x0a 0x0b 0x4a 0xc3 0xa3 0x6f 0x20 0x53...

Response:
HTTP/2 200 OK
content-type: application/grpc+proto

[Binary Protobuf Data]
0x0a 0x07 0x61 0x63 0x63 0x5f 0x31 0x32...

Tamanho Total: ~80 bytes (68% menor!)

QUANDO USAR CADA UM:
────────────────────────────────────────────────────────────────

USE REST QUANDO: USE gRPC QUANDO:
─────────────────── ────────────────

βœ“ APIs pΓΊblicas/externas βœ“ MicroserviΓ§os internos
βœ“ Navegadores como clientes βœ“ ComunicaΓ§Γ£o servidor-servidor
βœ“ Simplicidade Γ© prioridade βœ“ Performance crΓ­tica
βœ“ Caching HTTP importante βœ“ Streaming necessΓ‘rio
βœ“ Ferramentas familiares βœ“ Baixa latΓͺncia essencial
βœ“ DocumentaΓ§Γ£o OpenAPI βœ“ Contratos fortemente tipados
βœ“ Compatibilidade ampla βœ“ Polyglot (mΓΊltiplas linguagens)
βœ“ Debug fΓ‘cil (cURL, Postman) βœ“ Real-time communication

PERFORMANCE COMPARISON:
────────────────────────────────────────────────────────────────

MΓ©trica REST gRPC Melhoria
────────────────────── ──────── ────── ────────
LatΓͺncia (1 req) 50ms 20ms 2.5x
Throughput 1000 req/s 7000 req/s 7x
Payload (10KB JSON) 10,000 bytes 3,500 bytes 65% ↓
SerializaΓ§Γ£o 1000ns 300ns 3.3x
CPU (10K reqs) 100% 40% 60% ↓
MemΓ³ria 250MB 100MB 60% ↓
ConexΓ΅es simultΓ’neas 100 500 5x

EXEMPLO DE ARQUITETURA:
────────────────────────────────────────────────────────────────

ARQUITETURA HÍBRIDA (Recomendado):
───────────────────────────────────────────────────────────────

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Browser β”‚
β”‚ Mobile β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
REST/JSON
HTTP/1.1
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”
β”‚ API Gateway β”‚
β”‚ (gRPC-Web) β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
gRPC/Proto
HTTP/2
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ β”‚
β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”
β”‚ Service │◄────►│ Service │◄────►│ Service β”‚
β”‚ A β”‚ gRPC β”‚ B β”‚ gRPC β”‚ C β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Backend: gRPC (performance)
Frontend: REST (compatibilidade)

TRANSIÇÃO DE REST PARA gRPC:
────────────────────────────────────────────────────────────────

REST Endpoint β†’ gRPC Method
─────────────────────────── ──────────────────────────────

GET /accounts/{id} β†’ GetAccount(id)
POST /accounts β†’ CreateAccount(account)
PUT /accounts/{id} β†’ UpdateAccount(account)
DELETE /accounts/{id} β†’ DeleteAccount(id)
GET /accounts β†’ ListAccounts() (stream)
```

### Resumo Executivo

| **REST** | **gRPC** |
|----------|----------|
| Maduro e amplamente adotado | Mais recente, crescendo rapidamente |
| Ideal para APIs pΓΊblicas | Ideal para microserviΓ§os |
| Suporte universal (browsers) | Requer cliente especΓ­fico |
| Baseado em recursos (CRUD) | Baseado em aΓ§Γ΅es (RPC) |
| Debugging simples | Requer ferramentas especiais |
| Payload maior (JSON) | Payload menor (Protobuf) |
| Uma req/res por vez | Streaming bidirecional |
| HTTP/1.1 padrΓ£o | HTTP/2 obrigatΓ³rio |

**ConclusΓ£o:** Use REST para APIs pΓΊblicas e interfaces com navegadores. Use gRPC para comunicaΓ§Γ£o entre serviΓ§os backend onde performance Γ© crΓ­tica.

## PrΓ© requisitos

### ProtoC

- [Manual de instalaΓ§Γ£o](https://grpc.io/docs/protoc-installation/)

```bash
# InstalaΓ§Γ£o
apt install -y protobuf-compiler
# VersΓ£o
protoc --version
```

### Pacotes Go

- [Manual de instalaΓ§Γ£o](https://grpc.io/docs/languages/go/quickstart/)

```bash
# Generator para go
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
# Generate grpc para go
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
```

### Sqlite3

```bash
# InstalaΓ§Γ£o
sudo apt install sqlite3
# VersΓ£o
sqlite3 --version
```

### Evans

Evans Γ© um cliente CLI interativo para testar serviΓ§os gRPC, similar ao Postman para REST APIs.

- [Manual de instalaΓ§Γ£o](https://github.com/ktr0731/evans)

```bash
# InstalaΓ§Γ£o
go install github.com/ktr0731/evans@latest
```

**CaracterΓ­sticas do Evans:**
- Interface REPL interativa para gRPC
- Suporte a reflection (descobre serviΓ§os automaticamente)
- Autocomplete para comandos e serviΓ§os
- Suporte a streaming (unary, server, client e bidirectional)
- Formato JSON e Protobuf
- Ideal para desenvolvimento e testes

## RecomendaΓ§Γ΅es de plugins para VsCode

### vscode-proto3

Plugin essencial para trabalhar com arquivos `.proto` no VSCode.

**Funcionalidades:**
- Syntax highlighting para Protocol Buffers
- Autocompletar para mensagens e serviΓ§os
- ValidaΓ§Γ£o de sintaxe em tempo real
- NavegaΓ§Γ£o entre definiΓ§Γ΅es (Go to Definition)
- FormataΓ§Γ£o automΓ‘tica de cΓ³digo
- Snippets para estruturas comuns

**InstalaΓ§Γ£o:**
1. Abra VSCode
2. Acesse Extensions (Ctrl+Shift+X)
3. Procure por "vscode-proto3"
4. Clique em "Install"

## Comandos

### Rodar o programa

```bash
go run cmd/grpc_server/main.go
```

### Sqlite3

```bash
# Acessa o banco
sqlite3 db.sqlite
# Cria tabela
sqlite> create table accounts (id string PRIMARY KEY, name string, email string);
# Lista os dados da tabela
sqlite> select * from accounts;
# Para sair
sqlite> .quit
```

Mais comandos do Sqlite3

```bash
# Deleta todos os registros
sqlite> DELETE FROM accounts;
# Dropa a tabela
sqlite> DROP TABLE accounts;
# Insere um registro
sqlite> INSERT INTO accounts (id, name, email) VALUES ('xx0011', 'tiago', 'tiago@gmail.com');
```

### ProtolC

```bash
# Gera os arquivos e interfaces na pasta /internal/pb
protoc --go_out=. --go-grpc_out=. proto/account.proto
# Baixa os pacotes
go mod tidy
```

### Client Evans

```bash
# 1 - Acessa o client, utilizando reflection
evans -r repl
# 2 - Seleciona o package
> package pb
# 3 - Seleciona o serviΓ§o
> service AccountService
# 4 - Executa a chamada ao serviΓ§o
> call CreateAccount
```

**AtenΓ§Γ£o:** Para parar o envio de streams no Evans: ctrl + D

## Arquitetura e Boas PrΓ‘ticas

### Estrutura de Projeto Recomendada

```
projeto-grpc/
β”œβ”€β”€ proto/ # Arquivos .proto
β”‚ β”œβ”€β”€ account.proto
β”‚ β”œβ”€β”€ user.proto
β”‚ └── common.proto
β”‚
β”œβ”€β”€ internal/ # CΓ³digo interno
β”‚ β”œβ”€β”€ pb/ # CΓ³digo gerado pelo protoc
β”‚ β”‚ β”œβ”€β”€ account.pb.go
β”‚ β”‚ β”œβ”€β”€ account_grpc.pb.go
β”‚ β”‚ └── ...
β”‚ β”‚
β”‚ β”œβ”€β”€ service/ # ImplementaΓ§Γ£o dos serviΓ§os
β”‚ β”‚ β”œβ”€β”€ account_service.go
β”‚ β”‚ └── user_service.go
β”‚ β”‚
β”‚ β”œβ”€β”€ repository/ # Camada de dados
β”‚ β”‚ └── account_repository.go
β”‚ β”‚
β”‚ └── middleware/ # Interceptors
β”‚ β”œβ”€β”€ auth.go
β”‚ β”œβ”€β”€ logging.go
β”‚ └── metrics.go
β”‚
β”œβ”€β”€ cmd/
β”‚ β”œβ”€β”€ server/ # Servidor gRPC
β”‚ β”‚ └── main.go
β”‚ β”‚
β”‚ └── client/ # Cliente gRPC
β”‚ └── main.go
β”‚
β”œβ”€β”€ db/ # Banco de dados
β”‚ └── db.sqlite
β”‚
β”œβ”€β”€ go.mod
└── README.md
```

### Fluxo de Desenvolvimento gRPC

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ CICLO DE DESENVOLVIMENTO gRPC β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

1. DEFINIR CONTRATO
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Escrever arquivo .proto β”‚
β”‚ - Definir messages β”‚
β”‚ - Definir services β”‚
β”‚ - Definir RPCs β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
2. GERAR CΓ“DIGO
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ protoc --go_out=. \ β”‚
β”‚ --go-grpc_out=. \ β”‚
β”‚ proto/*.proto β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
3. IMPLEMENTAR SERVIDOR
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ - Implementar interface β”‚
β”‚ - Adicionar lΓ³gica de negΓ³cio β”‚
β”‚ - Tratar erros β”‚
β”‚ - Adicionar middleware β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
4. IMPLEMENTAR CLIENTE
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ - Criar conexΓ£o β”‚
β”‚ - Chamar mΓ©todos β”‚
β”‚ - Tratar respostas β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
5. TESTAR
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ - Unit tests β”‚
β”‚ - Integration tests β”‚
β”‚ - Evans (manual testing) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
6. DEPLOY
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ - Docker/Kubernetes β”‚
β”‚ - Service Mesh (Istio) β”‚
β”‚ - Load Balancing β”‚
β”‚ - Monitoring β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

### Interceptors (Middleware) Pattern

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ gRPC INTERCEPTORS CHAIN β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Cliente Servidor
──────── ─────────

Request
β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”œβ”€β”€β”€β”€β–Ίβ”‚ 1. Client Interceptor (Auth) β”‚
β”‚ β”‚ - Adiciona token β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”œβ”€β”€β”€β”€β–Ίβ”‚ 2. Client Interceptor (Logging) β”‚
β”‚ β”‚ - Log da requisiΓ§Γ£o β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ REDE ─────────────────────────►
β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ 3. Server Interceptor (Auth) β”‚
β”‚ β”‚ - Valida token β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ 4. Server Interceptor (Logs) β”‚
β”‚ β”‚ - Log da requisiΓ§Γ£o β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ 5. Server Interceptor(Metrics)β”‚
β”‚ β”‚ - Coleta mΓ©tricas β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ 6. Handler (Business Logic) β”‚
β”‚ β”‚ - Processa requisiΓ§Γ£o β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
β”‚ Response
β”‚ β”‚
│◄───────────────── REDE ───────────────────────────
β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
│◄───── 7. Client Interceptor (Response) β”‚
β”‚ β”‚ - Processa resposta β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
Response

TIPOS DE INTERCEPTORS:
──────────────────────────────────────────────────────────────────

Unary Interceptor: Stream Interceptor:
- Uma req/res por vez - Streams de dados
- Simples de implementar - Mais complexo
- Uso: auth, logs, metrics - Uso: conexΓ΅es persistentes
```

### Tratamento de Erros em gRPC

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ gRPC STATUS CODES β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

CΓ³digo β”‚ HTTP β”‚ Uso
────────────────────┼─────────┼─────────────────────────────────
OK β”‚ 200 β”‚ Sucesso
CANCELLED β”‚ 499 β”‚ Cliente cancelou
UNKNOWN β”‚ 500 β”‚ Erro desconhecido
INVALID_ARGUMENT β”‚ 400 β”‚ ParΓ’metros invΓ‘lidos
DEADLINE_EXCEEDED β”‚ 504 β”‚ Timeout
NOT_FOUND β”‚ 404 β”‚ Recurso nΓ£o encontrado
ALREADY_EXISTS β”‚ 409 β”‚ Recurso jΓ‘ existe
PERMISSION_DENIED β”‚ 403 β”‚ Sem permissΓ£o
UNAUTHENTICATED β”‚ 401 β”‚ NΓ£o autenticado
RESOURCE_EXHAUSTED β”‚ 429 β”‚ Rate limit / Quota
FAILED_PRECONDITION β”‚ 400 β”‚ PrΓ©-condiΓ§Γ£o falhou
ABORTED β”‚ 409 β”‚ Conflito de concorrΓͺncia
OUT_OF_RANGE β”‚ 400 β”‚ Fora do range vΓ‘lido
UNIMPLEMENTED β”‚ 501 β”‚ NΓ£o implementado
INTERNAL β”‚ 500 β”‚ Erro interno
UNAVAILABLE β”‚ 503 β”‚ ServiΓ§o indisponΓ­vel
DATA_LOSS β”‚ 500 β”‚ Perda de dados

EXEMPLO DE TRATAMENTO:
──────────────────────────────────────────────────────────────────

Servidor (Go):
─────────────
if account == nil {
return nil, status.Error(
codes.NotFound,
"account not found",
)
}

if err := validate(req); err != nil {
return nil, status.Error(
codes.InvalidArgument,
fmt.Sprintf("invalid input: %v", err),
)
}

Cliente (Go):
────────────
resp, err := client.GetAccount(ctx, req)
if err != nil {
st, ok := status.FromError(err)
if ok {
switch st.Code() {
case codes.NotFound:
// Trata nΓ£o encontrado
case codes.InvalidArgument:
// Trata argumento invΓ‘lido
default:
// Trata outros erros
}
}
}
```

### Performance e OtimizaΓ§Γ£o

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ BOAS PRÁTICAS DE PERFORMANCE β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

1. CONNECTION POOLING
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Reutilize conexΓ΅es gRPC β”‚
β”‚ - Uma conexΓ£o por target β”‚
β”‚ - HTTP/2 multiplexing automΓ‘tico β”‚
β”‚ - Evite criar/fechar conexΓ΅es repetidamente β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2. STREAMING PARA GRANDES VOLUMES
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Use streaming ao invΓ©s de unary β”‚
β”‚ - Server streaming: listagens grandes β”‚
β”‚ - Client streaming: uploads β”‚
β”‚ - Bidirecional: real-time β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3. COMPRESSÃO
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Habilite compressΓ£o para payloads grandes β”‚
β”‚ - gzip (padrΓ£o) β”‚
β”‚ - Trade-off: CPU vs Rede β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

4. TIMEOUTS E DEADLINES
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Sempre defina timeouts β”‚
β”‚ - Context com deadline β”‚
β”‚ - Previne requisiΓ§Γ΅es travadas β”‚
β”‚ - Libera recursos rapidamente β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

5. LOAD BALANCING
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Client-side: β”‚
β”‚ - Round-robin β”‚
β”‚ - Pick-first β”‚
β”‚ β”‚
β”‚ Server-side: β”‚
β”‚ - Nginx β”‚
β”‚ - Envoy β”‚
β”‚ - Istio β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

6. MONITORING
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ MΓ©tricas importantes: β”‚
β”‚ - LatΓͺncia (p50, p95, p99) β”‚
β”‚ - Taxa de erro β”‚
β”‚ - Throughput (req/s) β”‚
β”‚ - ConexΓ΅es ativas β”‚
β”‚ β”‚
β”‚ Ferramentas: β”‚
β”‚ - Prometheus + Grafana β”‚
β”‚ - OpenTelemetry β”‚
β”‚ - Jaeger (tracing) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

### SeguranΓ§a em gRPC

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
│ SEGURANÇA gRPC │
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

1. TLS/SSL (Transport Security)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Cliente Servidor β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”œβ”€β”€β”€β”€ TLS Handshake ──────────►│ β”‚
β”‚ │◄─── Certificado ────────────── β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”œβ”€β”€β”€β”€ Dados Criptografados ───►│ β”‚
β”‚ │◄─── Dados Criptografados ───── β”‚
β”‚ β”‚
β”‚ βœ“ Confidencialidade β”‚
β”‚ βœ“ Integridade β”‚
β”‚ βœ“ AutenticaΓ§Γ£o do servidor β”‚
β”‚ βœ“ (Opcional) AutenticaΓ§Γ£o mΓΊtua (mTLS) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2. AUTENTICAÇÃO
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ MΓ©todos: β”‚
β”‚ β€’ JWT (JSON Web Tokens) β”‚
β”‚ β€’ OAuth 2.0 β”‚
β”‚ β€’ API Keys β”‚
β”‚ β€’ mTLS (Mutual TLS) β”‚
β”‚ β”‚
β”‚ ImplementaΓ§Γ£o: β”‚
β”‚ β€’ Metadata/Headers β”‚
β”‚ β€’ Interceptors para validaΓ§Γ£o β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3. AUTORIZAÇÃO
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Request β”‚
β”‚ β”‚ β”‚
β”‚ β”œβ”€β”€β–Ί Auth Interceptor β”‚
β”‚ β”‚ β”œβ”€ Valida Token β”‚
β”‚ β”‚ β”œβ”€ Extrai Claims β”‚
β”‚ β”‚ └─ Verifica PermissΓ΅es β”‚
β”‚ β”‚ β”‚
β”‚ β”œβ”€β”€β–Ί Handler (se autorizado) β”‚
β”‚ β”‚ β”‚
β”‚ └──► Error (se nΓ£o autorizado) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

4. RATE LIMITING
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Protege contra: β”‚
β”‚ β€’ DoS/DDoS β”‚
β”‚ β€’ Abuse de API β”‚
β”‚ β€’ Custos excessivos β”‚
β”‚ β”‚
β”‚ EstratΓ©gias: β”‚
β”‚ β€’ Token Bucket β”‚
β”‚ β€’ Leaky Bucket β”‚
β”‚ β€’ Fixed Window β”‚
β”‚ β€’ Sliding Window β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

### MicroserviΓ§os com gRPC

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
│ ARQUITETURA DE MICROSERVIÇOS │
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ API Gateway β”‚
β”‚ (gRPC-Web/REST) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ β”‚
β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”
β”‚ Service A β”‚ β”‚Service β”‚ β”‚Service β”‚
β”‚ (Accounts)β”‚ β”‚ B β”‚ β”‚ C β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ β”‚
β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β” β”Œβ”€β”€β–Όβ”€β”€β”€β” β”Œβ”€β”€β–Όβ”€β”€β”€β”
β”‚Databaseβ”‚ β”‚Cache β”‚ β”‚Queue β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜

COMUNICAÇÃO ENTRE SERVIΓ‡OS:
────────────────────────────────────────────────────────────────

SΓ­ncrona (gRPC): AssΓ­ncrona (Message Queue):
───────────────── ─────────────────────────────

Service A ──gRPC──► Service B Service A ──► Queue ──► Service B
β”‚ β”‚ β”‚ β”‚
└───── Response β”€β”€β”€β”€β”˜ └─── Fire & Forget β”€β”€β”€β”€β”€β”€β”˜

Vantagens: Vantagens:
β€’ Resposta imediata β€’ Desacoplamento
β€’ Simples β€’ Escalabilidade
β€’ Contratos tipados β€’ ResilΓͺncia

Desvantagens: Desvantagens:
β€’ Acoplamento β€’ Complexidade
β€’ Cascata de falhas β€’ Eventual consistency

PADRΓ•ES DE DESIGN:
────────────────────────────────────────────────────────────────

1. SERVICE MESH (Istio, Linkerd)
β€’ Observabilidade
β€’ Traffic management
β€’ Security (mTLS)
β€’ ResiliΓͺncia (retry, timeout)

2. CIRCUIT BREAKER
β€’ Previne cascata de falhas
β€’ Fail fast
β€’ Fallback strategies

3. SAGA PATTERN
β€’ TransaΓ§Γ΅es distribuΓ­das
β€’ CompensaΓ§Γ£o de erros
β€’ ConsistΓͺncia eventual
```

## Recursos Adicionais

### DocumentaΓ§Γ£o Oficial
- **gRPC:** https://grpc.io/
- **Protocol Buffers:** https://protobuf.dev/
- **Go gRPC:** https://grpc.io/docs/languages/go/

### Ferramentas Úteis
- **Evans:** Cliente CLI para gRPC
- **grpcurl:** cURL para gRPC
- **Postman:** Suporte a gRPC (versΓ£o desktop)
- **Bloomrpc:** GUI client para gRPC
- **ghz:** Ferramenta de benchmark para gRPC

### Monitoramento e Observabilidade
- **Prometheus:** MΓ©tricas
- **Grafana:** VisualizaΓ§Γ£o
- **Jaeger:** Distributed tracing
- **OpenTelemetry:** Observabilidade completa

### Service Mesh
- **Istio:** Service mesh completo
- **Linkerd:** Service mesh leve
- **Envoy:** Proxy para gRPC



ConteΓΊdo criado por EnΓ©as Almeida