Lab prático: gRPC
Published in Universidade de São Paulo, Ciência da Computação, 2026
Contexto
Uma empresa de vendas online deseja modernizar parte do seu sistema. Atualmente, o cadastro de pedidos é feito de forma simples e centralizada, o que dificulta a separação de responsabilidades entre os serviços.
Para melhorar a arquitetura, a empresa decidiu criar um sistema distribuído baseado em gRPC. A ideia é separar o sistema em dois serviços:
- um serviço responsável por receber e registrar pedidos
- um serviço responsável por consultar o estoque dos produtos
Nesse projeto, você deverá implementar a comunicação entre serviços usando gRPC, podendo escolher Python ou Java.
Problema a ser resolvido
Quando um cliente faz um pedido, o sistema precisa:
- receber os dados do pedido
- verificar se o produto existe
- consultar a quantidade em estoque
- decidir se o pedido pode ser aceito
- devolver uma resposta ao cliente
O objetivo é substituir chamadas locais ou lógica monolítica por comunicação remota via gRPC.
Objetivo de aprendizagem
Ao final do projeto, você deverá ser capaz de:
- entender o papel do gRPC em sistemas distribuídos
- definir serviços e mensagens com Protocol Buffers
- implementar cliente e servidor
- realizar comunicação remota entre processos
- tratar erros simples de comunicação
- testar um serviço distribuído básico
Cenário do projeto
O sistema terá dois componentes principais:
1. Serviço de Estoque
Responsável por:
- informar se um produto existe
- informar a quantidade disponível
- reservar unidades de um produto, se houver estoque suficiente
2. Serviço de Pedidos
Responsável por:
- receber uma solicitação de novo pedido
- consultar o serviço de estoque via gRPC
- aprovar ou rejeitar o pedido
- retornar o status final ao cliente
Requisitos funcionais
O projeto deve atender aos seguintes requisitos.
Serviço de Estoque
O serviço deve permitir:
- consultar produto por identificador
- consultar quantidade disponível
- reservar quantidade de um produto
- retornar erro quando o produto não existir
- retornar erro quando não houver estoque suficiente
Serviço de Pedidos
O serviço deve permitir:
- criar um pedido com id do pedido, id do produto e quantidade
- consultar o serviço de estoque antes de confirmar o pedido
- retornar pedido aprovado ou rejeitado
- informar o motivo da rejeição
Cliente
O cliente deve permitir:
- enviar requisições de criação de pedido
- exibir a resposta recebida
- testar pelo menos três casos diferentes
Exemplos de casos:
- produto existe e há estoque
- produto existe, mas não há estoque suficiente
- produto não existe
Requisitos técnicos
Os alunos devem:
- usar gRPC
- usar Protocol Buffers
- implementar em Python ou Java
- separar cliente e servidor
- organizar o projeto em arquivos e pastas
- incluir instruções para execução
Estrutura sugerida do sistema
- servidor de estoque
- servidor de pedidos
- cliente
Fluxo:
- cliente envia pedido ao serviço de pedidos
- serviço de pedidos chama o serviço de estoque via gRPC
- serviço de estoque responde
- serviço de pedidos retorna resultado ao cliente
Mensagens e operações sugeridas
Serviço de Estoque
RPCs sugeridas
- GetProductStock
- ReserveProduct
Exemplo conceitual
GetProductStock:
- entrada: product_id
- saída: product_id, nome, quantidade_disponivel, existe
ReserveProduct:
- entrada: product_id, quantidade
- saída: sucesso, mensagem, quantidade_restante
Serviço de Pedidos
RPC sugerida
- CreateOrder
Exemplo conceitual
CreateOrder:
- entrada: order_id, product_id, quantidade
- saída: sucesso, status, mensagem
Enunciado para os alunos
Enunciado
Desenvolva um mini-sistema distribuído para processamento de pedidos utilizando gRPC.
O sistema deve simular uma loja online que recebe pedidos de produtos. Quando um pedido for recebido, o serviço de pedidos deve consultar remotamente o serviço de estoque para verificar se há quantidade suficiente do produto solicitado.
Se houver estoque, o pedido deve ser aprovado e a quantidade reservada. Caso contrário, o pedido deve ser rejeitado com uma mensagem adequada.
O projeto deve ser implementado em Python ou Java e deve usar gRPC para a comunicação entre os serviços.
Seu sistema deve demonstrar claramente:
- definição de serviços com
.proto - comunicação cliente-servidor
- chamada entre serviços
- tratamento básico de erros
- execução de casos de teste
Requisitos detalhados
A implementação deve conter:
Parte 1. Definição do contrato
- arquivo
.protocom mensagens e serviços - nomes claros para mensagens e métodos
Parte 2. Implementação
- servidor do serviço de estoque
- servidor do serviço de pedidos
- cliente para testar o sistema
Parte 3. Dados de teste
O serviço de estoque deve iniciar com alguns produtos fixos, por exemplo:
- P1: Teclado, 10 unidades
- P2: Mouse, 5 unidades
- P3: Monitor, 0 unidades
Parte 4. Casos mínimos de teste
O cliente deve demonstrar:
- pedido aprovado para produto com estoque
- pedido rejeitado por falta de estoque
- pedido rejeitado por produto inexistente
Parte 5. Documentação curta
Um arquivo README com:
- linguagem escolhida
- como compilar ou instalar dependências
- como executar os servidores
- como executar o cliente
Passo a passo
Etapa 1. Entender o problema
Antes de programar:
- leia o enunciado
- identifique os serviços
- entenda o fluxo entre cliente, pedidos e estoque
Pergunta-chave:
- quem chama quem?
Resposta esperada:
- o cliente chama pedidos
- pedidos chama estoque
Etapa 2. Definir o contrato gRPC
Crie um arquivo .proto contendo:
- as mensagens de entrada
- as mensagens de saída
- os serviços
- os métodos remotos
Dica:
- mantenha o contrato simples
- use nomes diretos
- pense primeiro nas entradas e saídas
Etapa 3. Gerar os arquivos do gRPC
Use o compilador do Protocol Buffers para gerar os arquivos da linguagem escolhida.
Em Python
Gerar os arquivos a partir do .proto.
Em Java
Gerar as classes necessárias com o plugin adequado do gRPC/Protobuf.
Objetivo: obter as classes de mensagens e stubs do gRPC
Etapa 4. Implementar o serviço de estoque
Implemente o servidor de estoque com dados fixos em memória.
Ele deve:
- armazenar produtos em estrutura simples
- responder consultas de estoque
- reservar quantidade quando possível
- retornar mensagens claras em caso de erro
Dica: use dicionário em Python ou Map em Java.
Etapa 5. Implementar o serviço de pedidos
Implemente o servidor de pedidos.
Ele deve:
- receber pedido do cliente
- chamar o serviço de estoque via gRPC
- verificar a resposta
- aprovar ou rejeitar o pedido
- retornar o resultado final
Esse é o ponto principal do projeto, pois mostra comunicação entre serviços.
Etapa 6. Implementar o cliente
Crie um cliente simples que envie pedidos ao serviço de pedidos.
O cliente deve:
- montar requisições
- enviar pedidos
- imprimir respostas
- testar diferentes cenários
Etapa 7. Testar o sistema
Execute os componentes na ordem correta:
- iniciar servidor de estoque
- iniciar servidor de pedidos
- executar cliente
Teste casos como:
- pedido de 2 teclados
- pedido de 10 monitores
- pedido de produto inexistente
Observe:
- mensagens retornadas
- comportamento esperado
- possíveis erros
Etapa 8. Documentar
Crie uma documentação curta explicando:
- estrutura do projeto
- arquivos principais
- comandos de execução
- exemplos de teste
Sugestão de organização de pastas
proto/stock_service/order_service/client/README.md
Extensões opcionais
Você também pode implementar as funcionalidades opcionais abaixo:
- cancelar pedido e devolver estoque
- registrar histórico de pedidos
- usar streaming gRPC
- simular falha de comunicação
- persistir dados em arquivo ou banco
