Lab prático: gRPC

6 minute read

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:

  1. cliente envia pedido ao serviço de pedidos
  2. serviço de pedidos chama o serviço de estoque via gRPC
  3. serviço de estoque responde
  4. 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 .proto com 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:

  1. iniciar servidor de estoque
  2. iniciar servidor de pedidos
  3. 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