Quem me segue há algum tempo sabe que ЕС SOU UM GRANDE Fã de Falar Sobre Novas Tecnologias – Também Daquelas Que Não São Tão Novas Assim – E, Equicenthente, Sou Ur Grande Fã Do GRPC!
Já Fiz Algumas Palestras Antes Sobre O Assunto, COMO WODê PORE VER NO Vídeo Seguir (NãO deixe de ver os слайды нет Meu Downdeck ) e este ém tema bastante recorrente Para Mim Porve, Pelo Menos Aqui No Brasil, Maioria Das Pessoas Não Sabe O Que é oun nunca itilizou grpc Em Nenhum Projeto Отказ
Meu Vídeo Sobre GRPC Apresentado Pelo Hackbuddy
Porém, o grpc não É UMA Tecnologia Muito Nova, ELE Já Está Aqui Algum Tempo e Já Vem Sendo Utilizado EM Larga Escala EM Projetos Muito Grandes Como O Docker E O Kubernetes, Então Decidi Montar Esta Série de Artigos Para ExplicaR De UMA VEZ POR TODAS O QUE É O GRPC E COMO VOCO CONSEGEGUGE КРИАР СУАС Applicações JavaScript E Tymentscript Com Ele de Forma Smple E Fácil!
Дорожная карта
Antes de Começarmos Com informação em si, vamos entender o que iremos Верну Ао Лонго Дуда Джорнада. Nervies Este Guia EM Três Partes, Nesta Parta Parte Vamos Passar Peala História Do GRPC, Entender As Ideias POR TRAS DA Construção Desta Tecnologia, Vantagens E Muito Mais.
Já Na Segunda Parte, Vamos Por Mais A Mão Na Massa E Sustruir Nossa Applação Usando GRPC Enquento Entendemos ToDo O Ecossistemase E, что и Ferramentas Que Compõem a akeação. Tudo Isso Usando JavaScript.
POM FIM, Na Terceira Parte Vamos Modififar Applação E Melhorá-la Para Usar Thmyscript Ao Invés de Javascript. Desta Forma Vamos Ter Anceência Nativa de Tipos da nossa Api Como Como Como Como Como Como Como Como Com ToDas As Camadas de Forma Correta.
Гистория
O GRPC FOI CRIADO PELA GOOGLE COMO UM PROJETO DE Código Aberto EM 2015 COMO UMA MELHORIA EM UMA Arquitetura de Comunicação Chamada de RPC (удаленный вызов процедуры).
O RPC ém modelo de comunicação um remonta desde meados dos anos 70 quante bruce jay nelson em 1981, que trabalhava na xerox parc utilizou Essa nomenclatura para descrever aomunicação entre dois processos docro do mesmo sistema emperational – ovo ainda itilizado – porém, o Modelo RPC é Mais Usado Para Comunicação de Baixo Nível, Até Que o Java Extrimoutouro UMA API Chamada JRMI (Вызов удаленного метода Java) que funciona Passicamente da mesma forma que o GRPC. Funciona Hoje EM Dia, Porém de Uma Maneira Mais Voltada Para Métodos E Classes E Não Para Comunicação Entre Processos.
Nós Vamos Falar Um Pouco Mais Sobre A Arquitutura de Umma Chamada GRPC NoS Próximos Parágrafos.
O “G” Нет GRPC NãO – значит Google, NA Verdade, ELE NãO TEM UM COM CADE REALIC, ELE MUDA DE ACORDO COM CADA DO Engine Do GRPC. Эстика АТЕ Им Документ MOSTRANDO TODOS OS NOMES que o “G” Teve Ao Longo Das Versões.
База IDEIA DO GRPC ERA SER MUITO MAIS Perfortático do Que Sua Contraparte Read POR SER BASEALO NO HTTP/2 E UTILIZAR UMA LINGAGEM DE FACHICããO de Интерфейсы (IDL) COMO COMO протокол (Protobuf). ESTE CONVUNTO de Ferramentas Torna Ossível Que o Grpc Seja Utilizado Em Diversass linguagens ao mesmo tempo comm rustale muito baixo Enquanto Continua Sendo Mais Rápido E Mais EFICESIONE DO AS DEMAIS ARQUITETURAS de Chamadas de Rede.
Алем Диссо, Чамада-дем МЕТОДО РЕМОТО ЕМЕНТ, ЮСУЛИЦИЯ, UMA CHAMADA COMUM DEM MÉTODO Местные, Que É Interceptada POR UM Modeo Local DO OBJETO REMOTO E TRANSTADA EM UMA CHAMADA DE REDE, OU SEJA, VOCê ESTA CHAMANDO UM MÉTODO Местный COMO SE Fosse Um Método Remoto. Vamos verm exemplo.
Exemplo de funcionamento.
Vamos Mastrar UM Exemplo De Em Servidor GRPC Escrito EM Node.js Para o Controle de Livros, COMO FALAMOS, O GRPC Utiliza o Protobuf, que vamos ver em mais detahles nos próximos parágrafos, este é é o nosso arquivo protobuf que gerou nosso serviço:
syntax = "proto3"; message Void {} service NoteService { rpc List (Void) returns (NoteList); rpc Find (NoteId) returns (Note); } message NoteId { string id = 1; } message Note { string id = 1; string title = 2; string description = 3; } message NoteList { repeated Note notes = 1; }
NELE ESTAMOS DESPINDINDO TODA A API API GRPC de Forma Smples, Rápida E, O Melhor de Tudo, Versionável. Agora Podemos Carregar Nosso Servidor Com Este Código:
const grpc = require('grpc') const NotesDefinition = grpc.load(require('path').resolve('../proto/notes.proto')) const notes = [ { id: '1', title: 'Note 1', description: 'Content 1' }, { id: '2', title: 'Note 2', description: 'Content 2' } ] function List (_, callback) { return callback(null, notes) } function Find ({ request: { id } }, callback) { return callback(null, notes.find((note) => note.id === id)) } const server = new grpc.Server() server.addService(NotesDefinition.NoteService.service, { List, Find }) server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure()) server.start()
Eveja Como Nosso Client Fica Smples Nas Chamadas:
const grpc = require('grpc') const NotesDefinition = grpc.load(require('path').resolve('../proto/notes.proto')) const client = new NotesDefinition.NoteService('localhost:50051', grpc.credentials.createInsecure()) client.list({}, (err, notes) => { if (err) throw err console.log(notes) }) client.find(Math.floor(Math.random() * 2 + 1).toString(), (err, note) => { if (err) throw err if (!note.id) return console.log('Note not found') return console.log(note) })
Veja que, Passianament AS Nossas Chamadas São Como Se Estivéssemos Chamando Um Método De Em objeto клиент
Местные, E Este Método Vai Ser ConvertiDo Em Uma Chamada De Rede E EnviaDo PARA O Servidor, Que Irá Chief Checker Chamada E Converter Novamente Em Objeto Local E Devolver Reposta.
Arquitutura
Arquituturas RPC São Muito Parecidas. IDEIA BASE EM CEMPER SEMPER EM Servidor E UM CLINGYE, DO LADO DO SERVISTOR TEMOS UMA CAMADA QUE É CHAMADA DE Скелет , que é Essencialmente UM DECTIPIPTADOR DE UMA CHAMADA DE REDE PARA UMA CHAMADA DE FUNCHãO, ESTE É O REACTION POR CHAMAR A a Função do lado do servidor.
Enquanto Isso, DO LADO DO CLINGEE, Temos Uma Chamada de Rede Feita Por Им заглушка que é como um “Falso” objeto repastando o objeto do lado do servidor. ESTE Objeto Tem ToDos OS Métodos Com Suassinaturas.
ESTES NOMES VARIAM DE AIRIMENACHãA PARA EXTRALYACãO, NO JRMI TINHAMOS Скелет E stub, Porém A AdvolationAção do GRPC Nomeia Os Dois Lados Como stubs.
ESTE É O Diagrama de funcionamento de Umma Chamada RPC Comum.
Диаграмма де Funcionamento Do RPC
O grpc tem um funcionamento muito próximo do diagrama que que acabamos de ver, diferença é é é temos uma camada extra que é o framework grpc Интерпретацияандо как Chamadas Codifificadas com idl do protobuf:
Диаграмма DE UM Serviço GRPC
COMO VOCE PORE VER, O MUNCIONAMETO É PARICEAMETEE O MESMO, TEMOS UM CLINGYE que Converte As Chamadas Feitas Localmente EM Chamadas de Rede Binárias COM O Protobuf e As Engia Pela Rede Até O Servidor GRPC Que a que a.
Http/2.
O http/2 já étilizado faz algum tempo e VEM SE TORNANDO A Принципиальная форма Forma de Comunicação Na Web Desde 2015.
Http ao http ao ao longo das décadas
Entre Как muitas vantagens do http/2 (que também foi criado pela google), está o fato de que Eleto Muito Mais Rápido Do Que O HTTP/1.1 POR CONTA DE VáARIOS FATTORES QUE VAMOS envender.
Мультиплексыçãо-де-запросы E Respostas
Tradizionalentede, O HTTP NãO PORE ENVIFAR MAIS DE UMA REBISISICãA POR VEZ PARA UM Servidor, OU Então Cemaster Mais de Uma Reposta Na Mesma Conexão, Isso Torna O HTTP/1.1 Mais Lento, Já Que Ele Precisa Carire UMA NOVA CONEXãO PARA CADA REQUISISICãA.
Нет http/2 TemoS o Que É Chamado de Multilexação, que содержит EM Poder Justamente Charger Várias Repostas E Heandif Várias Chamadas Em Uma Mesma Conexão. ISTO SO. ÉSOULL POR CORTA DA CRIAção de um Novo Frame No Picote HTTP Chamado de Двоичный обрамление Отказ Este Frame Essencialmente SOLA AS Duas Partes (Headers E Payload) DA Mensagem EM DOIS-кадры SELADOS, PORÉM CONTIDOS NA MESMA MENSAGEM DENTRO DERE DEM Кодирование Específico.
Двоичный обрамление Em Ação
Compressão de Headers
Outro Fatator Que Transferva O HTTP/2 EM Protocolo Mais Rapido é a Compressão de заголовки. EM Alguns Casos OS Headers de Uma Chamada HTTP Podem Ser Maiores Do Que o Seu Payload, POR ISSO O HTPP/2 TEM UMA TÉCNICA CHAMADA HPACK QUE FAZ UM TRABALHO BASTANTE interestante.
Инструменты Tudo Na Chamada é CompliMiDo, инклюзивные заголовки ОС, Isso Ajuda Na Performance Performance Porque Podemos Trafegar OS Dados Binários Ao Invés de Texto. ALÉM DISSO, O HTPP/2 Mapeia OS Заголовки ОС Que Vão Vem de Cada Lado da Chemada, Dessa Forma Essível Saber SE ОС Заголовки FORAM ALTRADOS OU ELES ESTãO IGUAIS AOS DA última Chamada.
SE OS Заголовки FORAM ALTERADOS, SOMENTE OS Заголовки ALTERADOS SãOO ENVIADOS, E OS QUE que NãO FORAM ALTRADOS TESEBEM UM INDICE PARA O Valor Ansiory Do Header, Evitando que заголовки Sejam Enviados Repetidamente.
Compressão de Headers EM Funcionamento
COMO VOCO WORE VER, SOMENTE O путь
Dessa Requisição Mudou, Portanto Só ELE SERA ENVIADO.
Протокол буферы
Protocol Protocol Buffers (Ou Só Protobuf ), São Um Método de Serialização E Desserializaçãão de Dados que Funciona Através de Usma Linguagem de Funciona de Interfaces (IDL).
Poi Criado Pela Google EM 2008 Para Facilitar A Comunicação Entre Microsserviços Tiveross. Гранди Vantagem do protobuf é que ele ed agnóstico de plataforma, Então vover Poderia Escrever A Esperificação Em Uma Linguagem Neutra (o Próprio Proto
) E Comparibilar Esse Contrato Para Vários Automos Serviços, Dessa Forma A A Conseços Unificar o Desenvolvanto DiversoS Microsserviços Utilizando UMA Linguagem única de Contratos Entre Seus Serviços.
O Protobuf Em Si Não Contém Ненхума Funcallidade, Ele é apenas um descriptivo dum serviço. O Serviço No GRPC E UM CONVUNTO DE MÉTODOS, PENSE NELE COMO SE FOSSE CLASSE. Então Podemos Descrever Cada Serviços Com Seus Parâmetros, EntraDas E Saídas.
CADA MÉTODO (OU RPC) DEM SERVIçO SO WOOD CHEENBER UM único Parâmetro de Entrada E UM DE SAIDA, POR ISSO EM GESTION PODERMOS COMPOR AS MENSAGENS DE FORMA QUE ELAS Formemm UM único Componente.
ALÉM DISOS, TODA MENSAGEM SERIALIZADA COM O Protobuf É Enviada EM Formato Binário, de forma que sua velocidade de deamplissão para seu рецептор é muito mais alta do que o Texto Puro, Já que o binário ocupa menos banda e, como o dado é comproiMiDo Pelo http/2, o uso de cpu também é muito menor.
Outra Grande Vantagem que que para a Aumento da Velocidade Do Protobuf é A SETALACãO de Contexto E Conteúdo Отказ QUANDO ESTAMOS USANDO FLOTOROS COMO JSON, O CONTEXTO VEM JUNTO COM MENSAGEM, POR Exemplo:
{ "name": "Lucas", "age": 26 }
QUANDO CRENVENTEMOS ISSO PARA UMA MENSAGEM No Formato Protobuf, Vamos Ter O Seguinte Arquivo:
syntax = "proto3"; message Name { string name = 1; int32 age = 2; }
Veja que Não Temos o Header Da Mensagem Junto Da Mensagem, Apenas Um índice informando Qual é o Местный акваресный капон-кампо.
Кодирование
Quando utilizamos o commitalador do protobuf (Chamado de protoc ), PodeMos radar o Comando A Seguir Usando O Nosso Exemplo Anderior: эхо имя: "Лукас"; Возраст: 26 '| Protoc Name.Proto> Название .Bin
Отказ
ISSO VAI КРИР БМ ARQUIVO BINáRIO COM O NOME name.bin
SE ABRIRMOS O Arquivo Binário Em Hex Hex Viewer (Como O Don VSCode ), Teremos Seguinte Cadeia de Bits:
0A 05 4C 75 63 61 73 10 1A
Temos 9 Bytes aqui aqui, contra os 24 do json, e eso é é suficatione para poder entender a mensagem, por exemplo, o que temos aqui é o seguinte:
Диаграмма закодирует протобуф
- O PAMEIRO BYTE
0А
Diz o Indice E o Theto Da Mensagem.0А
EM DECIMAL E 10, OU SEJA,0000 1010
EM Binário, de Acordo Com Esperifificação de encoding do protobuf ОС últimos Três Bits São Recordos Para o Tipo E O MSB (PAMEIRO BIT DA ESQUERDA) PORE SER DESSARTADO, ENTãO REAGRUPANDO OS BITS TEMOS0001 010
Портанто Nosso Tipo é010
Que é 2 EM Binário, o numero que представление UMA нить Нет протобуфа Отказ Já no lameiro байт0001
Temos o Indice do Campo, Que é 1, Como Softimos Na Nossa Mensagem. - O BYTE SEGUINTE
05
нос DIZ o Tamanho Desta String, Que é 5 Bytes Porve “Lucas” Tem 5 Letras. - ОС 5 байтов Seguintes
4C 75 63 61 73
Сан-цыган “Лукас” ConventiDas Para Hexadecimal e desconvertidas Para UTF-8. - O Penúltimo Byte
10
É Relativo Ao Segundo Campo, SE Convertermos EM Binário O Numero10
Теремос0001 0000
, COMO FIZEMOS NO PAMEIRO CAMPO, VAMOS AGRUPAR OS 3 BITS DA DIREIA PASSANDO O NLOL MAIS A ESQUERDA (4º BIT DA DIREITA PARA A esquerda) Para o Grupo Seguinte E Removemos o MSB FICANDO0010 000
, Оу Седжа, Темос Ой Типо0
que é Варинт , Pelos últimos 3 бита, E O PAMEIRO GRUPO NOS DA0010
ou 2 Em Binário, Que É O índice do Segundo Campo. - O último Bit É O Valor Deste Varint, O Valor
0x1a.
Para Binário é0001 1010
, Então Podemos Somente Converter Para Em Penimal Comum Somanco As Potências de 2:2 + 8 +
Que É O Valor Que Colocamos No Segundo Campo.
Então Essencialmente, Nossa Mensagem é 125lucas2026
, Veja Que Temos 12 Bytes Aqui, MAS Нет кодирования Temos apenas 9, ISTO Pireque Dois Bytes SelectaM 2 Valores Ao Mesmo Tempo E Temos Apenas 1 Байт Para o Número 26
Enquanto USAMOS 2 PARA Строка "26"
Отказ
ÉSAL USAR O Protobuf SEM O GRPC?
SIM, UMA DAS COISAS MAIS LEGAIS NO GRPC é que. ELE EM UM CONVUNTO de Freramentas, Que Juntas, Trabalham Muito Bem. Portanto O GRPC. ém um convunto de http/2 Com Protobuf E UM Sistema de Chamadas Remotas Muito Rapido.
ISSO COOTA QUE PODEMOS UTILIZAR O Commital DO Protobuf Para Gerar UM SDK de Кодирование, Que Vai Permitir Que Voce Codifique E Decodifique Suas Mensagens Utilizando O Protobuf.
POR Exemplo, Vamos Crar Crar Arquivo Smivo:
syntax = "proto3"; message Pessoa { uint64 id = 1; string email = 2; }
Agora PodeMos Executar Seguinte Linha No Nosso Terminal Para Gerar Ur Arquivo .js
que conterá uma classe Pessoa
COM OS Соседниты E Getter Configurados, BEM COMO OS Encoders E Decoders:
mkdir -p dist && protoc --js_out=import_style=commonjs,binary:dist ./pessoa.proto
O Commitador Vai Crar Em Arquivo Pessoa_PB.JS.
на пасты Dist
Усандо о Modelo de Importação Commonjs (Isso é Obrigatório SE VOCê для Executar Com Node.js), E AI Podemos Escrever UM Arquivo index.js
:
const {Pessoa} = require('./pessoa_pb') const p = new Pessoa() p.setId(1) p.setEmail('hello@lsantos.dev') const serialized = p.serializeBinary() console.log(serialized) const deserialized = Pessoa.deserializeBinary(serialized) console.table(deserialized.toObject()) console.log(deserialized)
Então Vamos Precisar Instalar O Protobuf COM NPM Установить Google-Protobuf
E Executamos o Código:
Uint8Array(21) [ 8, 1, 18, 17, 104, 101, 108, 108, 111, 64, 108, 115, 97, 110, 116, 111, 115, 46, 100, 101, 118 ] ┌─────────┬─────────────────────┐ │ (index) │ Values │ ├─────────┼─────────────────────┤ │ id │ 1 │ │ email │ 'hello@lsantos.dev' │ └─────────┴─────────────────────┘ { wrappers_: null, messageId_: undefined, arrayIndexOffset_: -1, array: [1, 'hello@lsantos.dev'], pivot_: 1.7976931348623157e+308, convertedPrimitiveFields_: {} }
Veja que temos righoding agual Ao que Analizamos Antes, UMA Tabela DOS Valores EM Objetos E A Classe Inteira.
Utilizar o Protobuf Como Camada de Comprotos é Muito útil, POR Exemplo, Para Padronizar As Mensagens Enviadas Entre Serviços de Mensageria E Entre Microsserviços. COMO ESTes Serviços Podem Comperber Qualkquer Tipo de Entrada, o Protobuf Acaba Criando UMA Forma de Garantir Que Todas As EntraDas Sejam Válidas.
Vantagens делают GRPC
COMO Pudemos Ver, O GRPC Tem Várias Vantagens Sobre O Modelo Read Pradicional:
- Mais Leve E Mais Rápido Por Utilizar Codificação Binária E http/2
- Multi Plataforma Com Mesma Interface de Contratos
- Funciona em muitas plataformas com pouco ou nenhum над головой
- O Código é Auto Documentado
- Реализация Relativamente Fácil Depois Do Desenvollimento
- Excelente Para Trabalhos Entre Times Que Não Vãoo Se Encontrar, Countrictions Para Directir ContraTos de Projetos Open.
Проблема
Assim Como Toda Tecnologia, O GRPC NãO É UMA Bala de Prata E NãO Установить проблему OS TODOS OS, Temos Alguns Defitos:
- O Protobuf NãO Toxui UM Package Manager Para Poder Gerenciar As Entency Entre Arquivos de интерфейс
- Exige UMA Pequena Mudança de Paradigma EM Relação Ao Modelo Read
- Curva de Artrendizado Silectible é Mais Complectoma
- NãO É UMA Escesificação Conhecida Por Muitos
- POR CONTA DE NãO SER MUITO CONHECIDO, DOCUSTOMACHãã É ESPARSA
- ARKITETURA DEM SISTEMA USANDO GRPC PORE SE TORNAR UM POUCO MAIS COMPORECHA
Casos de Uso
Независимые dos flanceas e de tudo que a tecnologia tem paraererecer, temos uma série de casos de uso bem famesos no Mundo Open Source que utiliza o grpc como meio de comunicação.
Кубернеты
O Kubernetes EM SI UTILIZA O GRPC COMO MEIO de Comunicação entre our kubelet e exução de que compõe a Plataforma de execução de Consivers (Como Já falamos Em vários artigos, Como Este, Este E Este).
PiCilidade de Adverymentar UMA Интерфейс USANDO O Protobuf Facilita A Comunicação Entre Os Times Times, Ainda Mais UM Time Como O Don Cubernetes Que Tem Que Suportar UMA Larga Quantidade de Provedoors Que Não São Nem Conhecidos.
Кеда
O Projeto Кеда , Também Para Kubernetes, Utiliza Como UMA FuncaliDade Neadical A Capacidade De S SE CRAIR Внешние скалеры Усандо UMA Интерфейс GRPC Para A Comunicação Com O Operador Compare.
UM DOS Projetos da CNCF Нет качества SOU UM Inpuidor, O Http Добавить на Para o Keda Утилизар Este Meio Para Crar Comunica Com O Ceda Para Aume Se Comunica COM O KEDA PARA AUMATAR A QuediDade de Pods Em um Cluster Baseado Na quantidade de requisições http, como ovo out o ver Акхи Отказ
контейнер
O Основное время Runtime de Contagers Da Atualidade, o Containerd é o Projeto que dá vida ao docker e ao kubernetes atualmente. ELE Também Возможна интерфейс UMA GRPC Para Comunicação Com Serviços Extris.
Вывод
Nesta Parte Parte Mergulhamos UM POUCO SOBRE COMO FUNCIONA E O QUE É O GRPC E Seus Компонементы, NAS Próximas Partes Deste Guia Vamos Construir Algumas Applicações E Mostrar o Ecossistema de Ferramentas que existe Para Esta Tecnologia Sensacion.
Оригинал: “https://dev.to/azure/o-guia-completo-do-grpc-parte-1-o-que-e-grpc-3o42”