microservicos/
├── catalogo/ ← Serviço A
│ └── main.py
├── pedidos/ ← Serviço B
│ └── main.py
catalogo/main.py
)from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
app = FastAPI()
class Produto(BaseModel):
id: int
nome: str
preco: float
banco_falso = [
Produto(id=1, nome="Notebook", preco=3500.0),
Produto(id=2, nome="Mouse", preco=150.0)
]
@app.get("/produtos", response_model=List[Produto])
def listar_produtos():
return banco_falso
@app.get("/produtos/{produto_id}", response_model=Produto)
def obter_produto(produto_id: int):
for p in banco_falso:
if p.id == produto_id:
return p
return {"erro": "Produto não encontrado"}
pedidos/main.py
)from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import requests
app = FastAPI()
CATALOGO_URL = "http://localhost:8000/produtos"
class Pedido(BaseModel):
id: int
produto_id: int
quantidade: int
pedidos_registrados = []
@app.post("/pedidos")
def criar_pedido(pedido: Pedido):
resposta = requests.get(f"{CATALOGO_URL}/{pedido.produto_id}")
if resposta.status_code != 200:
raise HTTPException(status_code=404, detail="Produto não encontrado no catálogo.")
pedidos_registrados.append(pedido)
return {"mensagem": "Pedido realizado com sucesso", "pedido": pedido}
@app.get("/pedidos")
def listar_pedidos():
return pedidos_registrados
localhost:8000
: uvicorn main:app --reload --port 8000
localhost:8001
: uvicorn main:app --reload --port 8001
http://localhost:8000/docs
e http://localhost:8001/docs
para testar as rotas.catalogo
e pedidos
), é importante compreender como o sistema "sabe" em qual serviço acessar determinada funcionalidade, já que ambos utilizam o mesmo framework (FastAPI) e estão sendo executados localmente.# Terminal 1 - dentro da pasta 'catalogo'
uvicorn main:app --reload --port 8000
# Terminal 2 - dentro da pasta 'pedidos'
uvicorn main:app --reload --port 8001
http://localhost:8000
, enquanto o serviço de pedidos responderá em http://localhost:8001
.requests
do Python.resposta = requests.get("http://localhost:8000/produtos/1")
requests.get(...)
).┌────────────────────────┐
│ │
│ Serviço de Catálogo │
│ (porta 8000) │
│ │
│ - /produtos │
│ - /produtos/{id} │
│ │
└─────────▲──────────────┘
│
│ HTTP GET
│ (consulta produto)
│
┌─────────┴──────────────┐
│ │
│ Serviço de Pedidos │
│ (porta 8001) │
│ │
│ - /pedidos │
│ - /pedidos/{id} │
│ │
└────────────────────────┘
/produtos
para listar todos os produtos e /produtos/{id}
para obter detalhes de um produto específico.requests
do Python. Por exemplo, ao receber um novo pedido, o Serviço de Pedidos pode executar: resposta = requests.get("http://localhost:8000/produtos/1")
Isso permite que o Serviço de Pedidos valide a existência do produto antes de processar o pedido.