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.
- Host: GitHub
- URL: https://github.com/eneas-almeida/grpc
- Owner: eneas-almeida
- Created: 2024-02-03T14:26:02.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2025-12-17T20:18:50.000Z (6 months ago)
- Last Synced: 2025-12-21T05:36:40.779Z (6 months ago)
- Topics: evans, golang, grpc, protobuf, reflection, sqlite3
- Language: Go
- Homepage:
- Size: 733 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
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