Introdução ao gRPC com Node.js

Introdução

Muitos desenvolvedores estão comentando e utilizando gRPC no seu dia dia, mas o que ele realmente ele é? e quais as vantagens de se utilizar ele?

Em um breve resumo nós temos:

gRPC foi desenvolvido pelo Google com foco em ser um serviço de alto desempenho para atender chamadas RPC (Remote Call Procedures) ou no português “Chamada de protocolo Remoto”. Ele é open source e pode ser executado em qualquer ambiente, independentemente de linguagem de programação ou plataforma. O gRPC tem suporte a load balancetracinghealth-check autenticação.

Mas o que é exatamente o RPC (Remote Call Procedures)?

RPC (Remote Procedure Call) é uma tecnologia para desenvolvimento de programas distribuídos client/server de comunicação de alto nível no sistema operacional. (deinfo.uepg.br)

gRPC trabalha com Protobuf (Protocol buffers), método criado e utilizado pelo Google para serializar dados estruturados, tornando a comunicação entre serviços mais eficiente. Ele é uma forma simples e agnóstica com relação a linguagem de se definir uma estrutura de dados como XML, só que mais rápido e mais simples.

Agora falando sobre os benefícios de se utilizar o gRPC:

  • A estrutura RPC é mais leve e de alto desempenho
  • Ele esta disponível para várias linguagens de programação
  • Tem suporte a chamada bidirecional de streaming entre client/server
  • Com a serialização do Protobuf, nós temos uma redução no trafego de dados na rede

Agora para ficar mais claro, vamos criar um exemplo prático de gRPC utilizando o Node.js

Exemplo prático

Para que você possa ter uma visão geral sobre esse assunto eu irei criar dois exemplos, um demonstrando o gRPC rodando no lado do servidor e um outro no lado do cliente.

O primeiro passo será a criação de um novo projeto. Para isso, abra um terminal no seu computador, escolha um diretório e execute o comando abaixo:

npm init -y

Esse comando deve criar um arquivo chamado package.json com as informações iniciais do seu projeto.

Com essa etapa OK e ainda no seu terminal, execute o comando abaixo para importar a biblioteca grpc para o seu projeto:

npm install --save grpc

Conforme comentado na introdução desse artigo, para trabalhar com gRPC nós precisamos criar os nossos arquivos Protobuf . Crie um novo arquivo chamado notes.proto na raiz do seu projeto e atualize ele com o seguinte trecho de código:

syntax = "proto3";

service NoteService {
    rpc List (Empty) returns (NoteList) {}
}

message Empty {}

message Note {
   string id = 1;
   string title = 2;
   string content = 3;
}
message NoteList {
   repeated Note notes = 1;
}

Analisando o trecho de código acima nós temos:

  • syntax: versão do protocol buffer language que nós estamos utilizando
  • note: model com 3 propriedades (id,title e content). Obs.: Os valores 1,2 e 3 são os indixes de cada propriedade
  • NoteService: método aceitando Empty em caso de mensagem vazia e retornando NoteList
  • NoteList: mensagem que sera retornada. No nosso exemplo deve retornar um array de note

Com o arquivo .proto criado, vamos criar o arquivo de configuração do nosso server. Para isso, crie um novo arquivo na raiz do seu projeto chamado index.js e atualize ele com o trecho de código abaixo:

const grpc = require('grpc')
const notesProto = grpc.load('notes.proto')

const notes = [
    { id: '1', title: 'Note 1', content: 'Content 1' },
    { id: '2', title: 'Note 2', content: 'Content 2' }
]
const server = new grpc.Server();

server.addService(notesProto.NoteService.service, {
    list: (_, callback) => {
        callback(null, notes)
    },
})
server.bind('127.0.0.1:50051', grpc.ServerCredentials.createInsecure())
console.log('Server running at http://127.0.0.1:50051')
server.start()

Analisando o trecho de código acima nos temos:

  • 1: chamada do pacote ‘grpc
  • 2: estamos carregando o arquivo .proto
  • 4 a 7: Objeto que iremos enviar para o nosso server. Note que ele tem as mesmas propriedades do nosso arquivo .proto (id, title e content).
  • 8: criação do server gRPC
  • 10 a 13: estamos passando o arquivo .proto para o server
  • 15 a 17: subindo o server na porta 50051

Com o arquivo .proto definido e o server OK, vamos criar o nosso client. Para isso, crie um novo diretório no seu projeto chamado client e dentro dele dois novos arquivos: client-grpc.js e get_notes.js, em seguida atualize eles com os seguintes trechos de código:

client-grpc.js

const grpc = require('grpc')
const PROTO_PATH = '../notes.proto'
const NoteService = grpc.load(PROTO_PATH).NoteService

const client = new NoteService('localhost:50051',
    grpc.credentials.createInsecure())
    
module.exports = client

Analisando o trecho de código acima nos temos:

  • 2: estamos passando o arquivo do arquivo .proto
  • 5: criando uma chamado com o server

get_notes.js

const client = require('./client-grpc')

client.list({}, (error, notes) => {
    if (!error) {
        console.log(notes)
    } else {
        console.error(error)
    }
})

Analisando o trecho de código acima nos temos:

  • 1: importando o modulo criado no passo anterior
  • 3 a 9: chamando o metodo List RPC e retornando os dados na console

Obs.: o método list e o mesmo que foi definido no arquivo .proto e na criação do service no arquivo index.js

Agora para testar os passos anteriores, abra dois terminais no seu computador e execute os comandos abaixo:

para executar o server:

node index.js

para executar o client:

cd client 
node .\get_notes.js

Abaixo você tem um print do projeto executando no meu computador, com o retorno esperado:Image for post

Bom, com isso nos finalizamos mais um artigo 😉 caso tenha interesse em clonar a versão final do projeto demonstrado aqui, segue link dele no meu GitHub: node-grpc.

Espero que tenham gostado e até um próximo artigo pessoal.

Referências: https://medium.com/xp-inc/introdu%C3%A7%C3%A3o-ao-grpc-com-node-js-98f6a4ede11