Skip to content

Latest commit

 

History

History

js_grpc

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

gRPC no NodeJS 🍏

Temos as seguintes etapas para fazer:

1. asdf
1.1. Instalar o plugin asdf do NodeJS
1.2. Instalar uma versão do NodeJS

2. NodeJS
2.1 Inicializar o projeto
2.2. Instalar dependências

3. Criar os arquivos
3.1. sorteio.proto
3.2 server.js
3.3 client.js

4. Executar teste


📌 Para uma fundamentação teórica e explicação do código, recomendamos a leitura da Wiki do projeto. Aqui vamos cuidar apenas dos comandos para fazer o gRPC funcionar com JavaScript.


1. asdf

1.1. Instalar o plugin asdf do NodeJS

asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

1.2. Instalar uma versão do NodeJS

Nós estamos usando a versão 18.7.0 do NodeJS. Para evitar problemas, recomendamos usar a mesma versão.

asdf install nodejs 18.7.0

📌 O que está destacado a seguir é opcional.

Se quiser instalar a versão mais recente o comando é:

asdf install nodejs latest

Poderá ter qualquer versão disponível entre as listadas:

asdf list all nodejs

Poderá configurar a última versão globalmente, como versão default:

asdf global nodejs latest

Mas aqui nós vamos utilizar localmente (tcc_grpc/js_grpc/) neste repositório a versão específica.

asdf local nodejs 18.7.0

2. NodeJS

O NodeJS traz a reboque em seu binário o gerenciador de pacotes npm. Primeiro precisamos inicializá-lo.

2.1 Inicializar o projeto

npm init -y

2.2. Instalar dependências

Nós vamos precisar de duas bibliotecas, vamos pedir para o npm buscá-las para nós.

  • @grpc/grpc-js
npm i @grpc/grpc-js
  • @grpc/proto-loader
npm i @grpc/proto-loader

3. Criando os arquivos server.js, client.js e o contrato sorteio.proto

Vamos criar os três arquivos que iremos precisar.

touch sorteio.proto server.js client.js

Vamos editar os arquivos para que fiquem como nas listagens 1, 2 e 3.

3.1. sorteio.proto

//sorteio.proto
syntax = "proto3";

option java_package = "com.java_grpc";

service SorteioService {
  rpc SortearNumero (IntervaloRequest) returns (SorteadoResponse) {}
}

message IntervaloRequest {
  int32 min = 1;
  int32 max = 2;
}ME.md

message SorteadoResponse {
  int32 numero = 1;
}

Listagem 1: sorteio.proto

3.2. server.js

// server.js
const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");
const PROTO_PATH = "./sorteio.proto";

const protoObject = protoLoader.loadSync(PROTO_PATH);
const sorteioDefinition = grpc.loadPackageDefinition(protoObject);
const SorteioService = sorteioDefinition.SorteioService;
const server = new grpc.Server();
server.addService(SorteioService.service, {sortearNumero});


function sortearNumero({ request:{min, max} }, callback) {
  let sorteado = bingo(min, max);
  sorteadoResponse = {numero: sorteado};
  console.log('🍏 API JavaScript - Número Sortedado:' + sorteado);
  return callback(null, sorteadoResponse);
}

function bingo(min, max) {
  return Math.floor( Math.random() * (max - min + 1) ) + min;
};

const endereco = 'localhost';
const porta = '50053';
const pontoAcesso = endereco + ':' + porta;

server.bindAsync(
  pontoAcesso,
  grpc.ServerCredentials.createInsecure(),
  (error, port) => {
    console.log("\n🍏 Servidor rodando no ponto de acesso " + pontoAcesso);
    server.start();
  }
);

Listagem 2: server.js

3.3. client.js

// client.js
const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");
const PROTO_PATH = "./sorteio.proto";
const packageDefinition = protoLoader.loadSync(PROTO_PATH);
const sorteioStub = grpc.loadPackageDefinition(packageDefinition);
const SorteioService = sorteioStub.SorteioService;
const endereco = 'localhost';
const porta = '50053';
const pontoAcesso = endereco + ':' + porta;

const client = new SorteioService(
  pontoAcesso,
  grpc.credentials.createInsecure()ME.md
);

let intervaloRequest = {min: 0, max:50}
Aplicação cliente consumindo microserviço e servidor respondendo às requisições com gRPC
client.sortearNumero(intervaloRequest, (error, responseSorteado) => {  
  if (!error) {
    //console.log("Sucesso!!!");
    let msg = responseSorteado.numero;
    console.log('🍏 número sorteado:' + msg.toString() + '\n');
  }else {
    console.log(error);
  }
});

Listagem 3: client.js


4. Executar teste

Vamos subir o servidor com o comando:

node server.js

Veremos o servidor escutando requisições na porta 50053.

Servidor NodeJS gRPC ouvindo na porta 50053
Figura 1: Servidor NodeJS gRPC ouvindo na porta 50053

Deixaremos o servidor escutando em um terminal e abriremos outro, no mesmo diretório, para executar o client.js que irá consumir a API.

node client.js

A cada execução do comando acima, a aplicação cliente JS envia uma requisição para o servidor usando o framework gRPC. O servidor gera um número entre 0 e 50 e o envia para a aplicação cliente, que recebe o valor e imprime na tela.

Aplicação cliente e servidor se comunicando através do framework gRPC
Figura 2: Aplicação cliente e servidor se comunicando através do framework gRPC


Seguindo nossa sequência, agora vamos implementar nosso microserviço de gerador de id em 2. Golang.



⬆️ Topo