Iniciando com gRPC

Luiz Felipe da Silva
4 min readDec 16, 2020

O que é gRPC?

Antes de falar sobre gRPC, precisamos saber o que é o RPC. Para não misturar os assuntos e conceitos, RPC é a definição de um protocolo para executar procedimentos em outros computadores em rede, e não cabe ao RPC especificar como a mensagem é enviada de um processo para o outro. O gRPC é um framework do Google que implementa RPC, e tem inúmeras vantagens para a escolha do gRPC.

Principais vantagens:

  • Desenvolvimento de API Contract-first, com Protocol Buffer por padrão
  • Disponível em mais de 10 linguagens de programação.
  • Suporte a chamadas streaming do cliente para o servidor, do servidor para cliente e bidirecional (irei falar mais deste assunto).
  • Reduz a utilização da rede, latência, pois os dados são trafegados em binário.
  • Utiliza o protocolo HTTP2.

Protocol Buffer

Protocol buffer ou protobuf é um método criado pelo Google de serialização de dados estruturados, agnóstico de linguagem. A transferência de dados chega a ser até 6x mais rápida que um JSON. O gRPC utiliza o arquivo com extensão .proto para criar o código base, garantindo o Contract-first. A serialização/deserialização faz um uso menos intensivo da CPU pelo fato das mensagens estarem em formato binário, ou seja, mais próximo de como o computador representa os dados.

Cliente e o servidor em qualquer linguagem

Atualmente o Google tem disponibilizado o gRPC em mais de 10 linguagens. Podendo utilizar qualquer uma no cliente e no servidor.

Principais vantagens do HTTP2

Irei citar as principais vantagens, mas não entrarei em detalhes, já existe bastante conteúdo na internet falando sobre.

  • Fluxo multiplexados
  • Compressão do cabeçalho
  • Protocolo binário
  • etc…

Demonstração de como o http2 é mais rápido que o http1.1. Se você tiver uma internet muito rápida, pode experimentar colocar no navegador no modo low-end mobile: https://imagekit.io/demo/http2-vs-http1

Mão na massa…

Para este tutorial, irei fazer um crud de usuários no mongodb, irei utilizar o servidor e o cliente no mesmo projeto em java.

Dependências que estou utilizando no servidor. Para outras configurações, vou deixar o link do projeto no github.

SERVER

1 .Precisamos definir o .proto que será o contrato da nossa API. Arquivo user.proto. Observe que a operação ListUser, o servidor irá mandar os usuários por stream na mesma conexão tcp, e o cliente irá ficar recebendo os usuários em tempo real. Para as operações CreateUser e DeleteUser será unário, para cada request, uma response. Não irei fazer stream do cliente para o server e nem bidirecional, pois o artigo ficará gigante, mas a forma como fazemos não é muito diferente.

2. Agora precisamos execurar o plugin que irá gerar todo o código que o gRPC irá usar com base no que definimos no user.proto. O build do projeto faz este trabalho automatico. Não precisamos nos preocupar como os arquivos foram gerados, apenas com a implementação deles.

3. Feito isto, precisamos subir nosso servidor para receber requests, mas ainda não temos nenhum serviço implementado.

4. Como definimos três operações no serviço UserService, iremos implementar apenas a lógica de como cada uma irá proceder, o gRPC irá criar tudo que precisamos para implementar. Para isto criei o arquivo UserServiceImpl com algumas configurações para conectar no mongodb e as operações. A primeira operação será a CreateUser, é uma request unária, ou seja, uma request, uma response.

5. Operação deletar usuário. Está operação tem um tratamento para usuário não encontrado, assim como fazemos nas rest apis.

6. Operação listar usuários. Nesta operação o cliente fica com uma conexão aberta recebendo os usuários por stream.

7. Para finalizar o servidor, precisamos disponibilizar o serviço que implementamos para o servidor. Apenas adicionei a linha 11.

CLIENT

Para o cliente irei implementar as operações de criar, deletar e listar usuário.

  1. Precisamos criar um channel para comunicar com o servidor.

2. Criar novo usuário.

3. Deletar usuário.

4. Listar usuários. Perceba que aqui estamos usando streaming para enviar os usuários do servidor para o cliente na mesma conexão TCP.

--

--