{"id":751,"date":"2023-04-11T11:45:52","date_gmt":"2023-04-11T14:45:52","guid":{"rendered":"https:\/\/vadebyte.com\/?p=751"},"modified":"2023-04-11T18:51:36","modified_gmt":"2023-04-11T21:51:36","slug":"introducao-ao-grpc","status":"publish","type":"post","link":"https:\/\/vadebyte.com\/index.php\/2023\/04\/11\/introducao-ao-grpc\/","title":{"rendered":"Introdu\u00e7\u00e3o ao gRPC. O que \u00e9 gRPC?"},"content":{"rendered":"\n<p>O gRPC foi liberado pelo Google como um projeto de c\u00f3digo aberto em 2016 como resultado de melhorias em sua arquitetura de comunica\u00e7\u00e3o interna baseada em RPC (Remote Procedure Call) chamada <strong>Stubby<\/strong>.<\/p>\n\n\n\n<p>O que \u00e9 RPC e gRPC?<br>Quais suas vantagens e limita\u00e7\u00f5es?<br>Quando devemos utilizar o gRPC?<\/p>\n\n\n\n<p>Neste artigo vamos explorar um pouco sobre a hist\u00f3ria do gRPC, sua arquitetura e vantagens t\u00e9cnicas. Faremos observa\u00e7\u00f5es sobre sua depend\u00eancia de HTTP\/2, cen\u00e1rios de implementa\u00e7\u00e3o mais comuns e sua comunidade ativa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>gRPC<\/strong><\/h2>\n\n\n\n<p>O gRPC \u00e9 um framework RPC (Remote Procedure Call), moderno, de c\u00f3digo aberto e alto desempenho que pode ser executado em qualquer ambiente. O gRPC pode conectar servi\u00e7os de forma eficiente dentro e entre datacenters com suporte plug\u00e1vel para balanceamento de carga, rastreamento, verifica\u00e7\u00e3o de integridade e autentica\u00e7\u00e3o. Tamb\u00e9m tem sido utilizado nas etapas finais da computa\u00e7\u00e3o distribu\u00edda para conectar dispositivos, aplicativos m\u00f3veis e navegadores a servi\u00e7os de backend.<\/p>\n\n\n\n<p>O gRPC foi criado pelo Google, como resultado do aperfei\u00e7oamento de sua infraestrutura RPC interna de uso geral chamada <strong>Stubby<\/strong>, utilizada por mais de uma d\u00e9cada para conectar o grande n\u00famero de microsservi\u00e7os executados dentro e entre seus data centers.<\/p>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<div style=\"height:16px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image alignfull size-full\"><img decoding=\"async\" width=\"270\" height=\"113\" src=\"http:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/logo-google_2016.png\" alt=\"\" class=\"wp-image-765\"\/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<p class=\"has-text-align-left\">Em 2016, o Google criou uma vers\u00e3o atualizada do Stubby e a tornou um projeto de c\u00f3digo aberto. O resultado foi o gRPC, que agora \u00e9 usado por muitas organiza\u00e7\u00f5es para suportar casos de uso que v\u00e3o desde a comunica\u00e7\u00e3o entre microsservi\u00e7os at\u00e9 a computa\u00e7\u00e3o final por smartphones, web e Internet das Coisas.<\/p>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">O que \u00e9 RPC?<\/h2>\n\n\n\n<p>O que \u00e9 RPC ou Remote Procedure Call?<\/p>\n\n\n\n<p>O RPC \u00e9 um modelo de comunica\u00e7\u00e3o que remonta a meados dos anos 1970. Bruce Jay Nelson em 1981, que trabalhava na Xerox PARC, utilizou essa nomenclatura para descrever a comunica\u00e7\u00e3o entre dois processos dentro do mesmo sistema operacional. Sim: isso ainda \u00e9 utilizado.<\/p>\n\n\n\n<p>Uma chamada de procedimento remoto (RPC) ocorre quando um procedimento \u00e9 executado em um espa\u00e7o de endere\u00e7o diferente do endere\u00e7o local (geralmente em outro computador ou numa rede compartilhada), como se fosse executado localmente, sem que o programador necessite codificar explicitamente os detalhes para a intera\u00e7\u00e3o remota.<\/p>\n\n\n\n<p>Na programa\u00e7\u00e3o orientada a objetos, RPCs s\u00e3o representados por invoca\u00e7\u00f5es de m\u00e9todos remotos (RMIs). O modelo RPC implica em transpar\u00eancia de localiza\u00e7\u00e3o, ou seja, os procedimentos de chamada s\u00e3o praticamente os mesmos, sejam locais ou remotos, todavia n\u00e3o s\u00e3o id\u00eanticos, portanto as chamadas locais podem ser diferenciadas das chamadas remotas. As chamadas remotas geralmente s\u00e3o mais lentas e menos confi\u00e1veis do que chamadas locais, logo \u00e9 importante distingui-las.<\/p>\n\n\n\n<p>Uma chamada de procedimento <strong>local <\/strong>\u00e9 uma chamada de fun\u00e7\u00e3o dentro de um processo para executar algum c\u00f3digo.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/logo-RPC-para-gRPC_Black-1024x427.png\" alt=\"\" class=\"wp-image-767\" width=\"641\" height=\"267\" srcset=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/logo-RPC-para-gRPC_Black-1024x427.png 1024w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/logo-RPC-para-gRPC_Black-300x125.png 300w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/logo-RPC-para-gRPC_Black-768x320.png 768w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/logo-RPC-para-gRPC_Black.png 1147w\" sizes=\"(max-width: 641px) 100vw, 641px\" \/><figcaption class=\"wp-element-caption\">RPC &#8211; Remote Procedure Call<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Uma chamada de procedimento <strong>remoto <\/strong>permite que uma m\u00e1quina invoque procedimentos em outra m\u00e1quina como se fosse executado de forma local sob a \u00f3tica do usu\u00e1rio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Organiza\u00e7\u00f5es que usam o gRPC<\/h2>\n\n\n\n<p>O gRPC \u00e9 uma implementa\u00e7\u00e3o popular do modelo RPC.<br>Muitas organiza\u00e7\u00f5es adotaram o gRPC como seu mecanismo RPC preferido para conectar um grande n\u00famero de microsservi\u00e7os em execu\u00e7\u00e3o dentro e entre seus datacenters.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Organizations-using-grpc-color-black-1-1024x306.png\" alt=\"\" class=\"wp-image-771\" width=\"584\" height=\"174\" srcset=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Organizations-using-grpc-color-black-1-1024x306.png 1024w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Organizations-using-grpc-color-black-1-300x90.png 300w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Organizations-using-grpc-color-black-1-768x230.png 768w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Organizations-using-grpc-color-black-1-1536x460.png 1536w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Organizations-using-grpc-color-black-1.png 1658w\" sizes=\"(max-width: 584px) 100vw, 584px\" \/><figcaption class=\"wp-element-caption\"><br>Exemplo de empresas que usam gRPC:<br>Google, Netflix, Slack, CockRoach Labs, Cisco, Juniper Networks, CoreOS<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Popularidade do gRPC<\/strong><\/h2>\n\n\n\n<p>O que torna o gRPC t\u00e3o popular?<\/p>\n\n\n\n<p>O gRPC possui um respeitado e crescente ecossistema de desenvolvimento.<br>Isso facilita o desenvolvimento de APIs seguras, com qualidade de produ\u00e7\u00e3o e que escalam muito bem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Vis\u00e3o geral do gRPC<\/strong><\/h3>\n\n\n\n<p>No gRPC, uma aplica\u00e7\u00e3o cliente pode chamar diretamente m\u00e9todos de uma aplica\u00e7\u00e3o servidor localizada m\u00e1quinas diferentes como se fosse um objeto local, facilitando a cria\u00e7\u00e3o de aplica\u00e7\u00f5es e servi\u00e7os distribu\u00eddos.<\/p>\n\n\n\n<p>Como em muitos sistemas RPC, o gRPC \u00e9 baseado na ideia de defini\u00e7\u00e3o de um servi\u00e7o onde se especifica os m\u00e9todos que podem ser chamados remotamente com seus par\u00e2metros e tipos de retorno. A interface \u00e9 implementada no servidor gRPC para lidar com as chamadas do cliente. O cliente possui um stub (referido apenas como <strong>stub cliente<\/strong> em algumas linguagens) que fornece os mesmos m\u00e9todos do servidor.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/How-gRPC-works-black-1-1024x651.png\" alt=\"\" class=\"wp-image-776\" width=\"549\" height=\"348\" srcset=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/How-gRPC-works-black-1-1024x651.png 1024w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/How-gRPC-works-black-1-300x191.png 300w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/How-gRPC-works-black-1-768x488.png 768w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/How-gRPC-works-black-1.png 1098w\" sizes=\"(max-width: 549px) 100vw, 549px\" \/><figcaption class=\"wp-element-caption\">Vis\u00e3o geral gRPC<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Os clientes e servidores gRPC podem ser executados e se comunicarem atrav\u00e9s de v\u00e1rios ambientes, desde servidores dentro de um provedor de nuvem at\u00e9 sua \u00e1rea local de trabalho, e podem ser escritos em qualquer linguagem suportada pelo gRPC. Assim, por exemplo, voc\u00ea pode criar facilmente um servidor gRPC em Java com clientes em Go, Python ou Ruby. As APIs do Google mais recentes possuem vers\u00f5es gRPC de suas interfaces, permitindo que voc\u00ea incorpore facilmente funcionalidades do Google em seus aplicativos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Mecanismos gRPC<\/strong><\/h3>\n\n\n\n<p>O n\u00facleo do ecossistema gRPC \u00e9 o uso de <strong>Buffers de Protocolo<\/strong> ou <strong>Protocol Buffers<\/strong> ou simplesmente <strong>ProtoBuf, <\/strong>como formato de troca de dados.<\/p>\n\n\n\n<p>Buffers de Protocolo \u00e9 uma Linguagem de Defini\u00e7\u00e3o de Interfaces (IDL) e um mecanismo agn\u00f3stico, independente de linguagens de programa\u00e7\u00e3o e plataformas usado para codifica\u00e7\u00e3o de dados estruturados.<\/p>\n\n\n\n<p>O gRPC usa Buffers de Protocolo como padr\u00e3o para codificar e enviar dados pela rede. Embora o gRPC possa utilizar outros formatos de codifica\u00e7\u00e3o de dados como JSON, Buffers de Protocolo fornece v\u00e1rias vantagens que o torna o formato de codifica\u00e7\u00e3o preferido para o gRPC. Buffers de Protocolo oferecem suporte a defini\u00e7\u00f5es de esquemas fortemente tipados.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/gRPC-Tools-Trasncode-black-1024x720.png\" alt=\"\" class=\"wp-image-778\" width=\"630\" height=\"442\" srcset=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/gRPC-Tools-Trasncode-black-1024x720.png 1024w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/gRPC-Tools-Trasncode-black-300x211.png 300w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/gRPC-Tools-Trasncode-black-768x540.png 768w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/gRPC-Tools-Trasncode-black.png 1162w\" sizes=\"(max-width: 630px) 100vw, 630px\" \/><figcaption class=\"wp-element-caption\">Comunica\u00e7\u00e3o gRPC<\/figcaption><\/figure>\n<\/div>\n\n\n<p>A estrutura dos dados a ser transitada pela rede \u00e9 definida em um arquivo do tipo <strong>proto<\/strong>. Um arquivo do tipo proto \u00e9 um arquivo de texto comum com uma extens\u00e3o <strong>.proto<\/strong>. Os dados s\u00e3o estruturados como mensagens, onde cada mensagem \u00e9 um pequeno registro l\u00f3gico de informa\u00e7\u00f5es contendo uma s\u00e9rie de pares nome-valor chamados campos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Suporte aos Buffers de Protocolo<\/strong><\/h3>\n\n\n\n<p>Buffers de Protocolo fornecem um amplo suporte de ferramentas para transformar o esquema dos arquivos do tipo proto em classes de acesso a dados para as linguagens de programa\u00e7\u00e3o mais populares.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Lista-de-bibliotecas-suportadas-black-1024x569.png\" alt=\"\" class=\"wp-image-780\" width=\"629\" height=\"349\" srcset=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Lista-de-bibliotecas-suportadas-black-1024x569.png 1024w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Lista-de-bibliotecas-suportadas-black-300x167.png 300w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Lista-de-bibliotecas-suportadas-black-768x426.png 768w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Lista-de-bibliotecas-suportadas-black.png 1295w\" sizes=\"(max-width: 629px) 100vw, 629px\" \/><figcaption class=\"wp-element-caption\">Ferramentas gRPC<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Um servi\u00e7o gRPC tamb\u00e9m \u00e9 definido num arquivo do tipo <strong>proto <\/strong>especificando-se os par\u00e2metros do m\u00e9todo RPC e os tipos de retorno.<\/p>\n\n\n\n<p>As mesmas ferramentas s\u00e3o usadas para gerar os c\u00f3digos do <strong>cliente <\/strong>e <strong>servidor <\/strong>gRPC a partir do arquivo do tipo proto. Os desenvolvedores usam essas classes geradas no cliente para fazer solicita\u00e7\u00f5es RPC, e no servidor para atender \u00e0s solicita\u00e7\u00f5es RPC.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>Raz\u00f5es para a popularidade do gRPC<\/strong><\/strong><\/h2>\n\n\n\n<p>Ao oferecer suporte a muitas linguagens de programa\u00e7\u00e3o, o cliente e o servidor podem escolher de forma independente qual a linguagem de programa\u00e7\u00e3o e ecossistema mais adequados para seus casos de uso. Tradicionalmente, esse n\u00e3o \u00e9 um cen\u00e1rio de aplica\u00e7\u00e3o para a maioria dos outros frameworks RPC.<\/p>\n\n\n\n<p>A segunda raz\u00e3o pela qual o gRPC \u00e9 t\u00e3o popular \u00e9 porque ele entrega alto desempenho de forma padr\u00e3o sem necessidade de configura\u00e7\u00f5es adicionais.<\/p>\n\n\n\n<p>Dois fatores contribuem para seu desempenho.<\/p>\n\n\n\n<p>O primeiro fator \u00e9 que Buffers de Protocolo possuem um formato de codifica\u00e7\u00e3o bin\u00e1ria muito eficiente e bem mais r\u00e1pido que o JSON.<\/p>\n\n\n\n<p>O segundo fator \u00e9 que o gRPC \u00e9 constru\u00eddo sobre o HTTP\/2 utilizando todos os fundamentos de alto desempenho para cen\u00e1rios que exigem escalabilidade.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Duas-razoes-da-performance-binary-encoding-black-1-1024x649.png\" alt=\"\" class=\"wp-image-782\" width=\"607\" height=\"384\" srcset=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Duas-razoes-da-performance-binary-encoding-black-1-1024x649.png 1024w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Duas-razoes-da-performance-binary-encoding-black-1-300x190.png 300w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Duas-razoes-da-performance-binary-encoding-black-1-768x486.png 768w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Duas-razoes-da-performance-binary-encoding-black-1.png 1162w\" sizes=\"(max-width: 607px) 100vw, 607px\" \/><figcaption class=\"wp-element-caption\">Codifica\u00e7\u00e3o bin\u00e1ria <strong>protobuf<\/strong><\/figcaption><\/figure>\n<\/div>\n\n\n<p>Toda mensagem serializada com o ProtoBuf \u00e9 transformada e enviada em formato bin\u00e1rio, de forma que a velocidade de transmiss\u00e3o para o receptor \u00e9 muito mais elevada que o texto puro, j\u00e1 que ocupa menos banda e como o dado \u00e9 comprimido pelo HTTP\/2, o uso de CPU tamb\u00e9m \u00e9 muito menor.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sobre HTTP\/2<\/h3>\n\n\n\n<p>O uso do HTTP\/2 traz muitos benef\u00edcios. Os principais benef\u00edcios oferecidos pelo HTTP\/2 e aproveitados pelo gRPC s\u00e3o:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Multiplexa\u00e7\u00e3o de solicita\u00e7\u00e3o:<\/strong> HTTP 1.1 \u00e9 um protocolo sequencial. Assim, podemos enviar uma \u00fanica solicita\u00e7\u00e3o por vez. O HTTP\/2, por sua vez, permite enviar requisi\u00e7\u00f5es e receber respostas de forma ass\u00edncrona. Dessa forma, podemos fazer v\u00e1rias solicita\u00e7\u00f5es ao mesmo tempo usando uma \u00fanica conex\u00e3o<\/li>\n\n\n\n<li><strong>Prioriza\u00e7\u00e3o de solicita\u00e7\u00f5es:<\/strong> com o HTTP\/2, podemos definir uma prioriza\u00e7\u00e3o num\u00e9rica em um lote de solicita\u00e7\u00f5es. Assim, podemos ser expl\u00edcitos em que ordem esperamos as respostas, como obter um CSS de p\u00e1gina da Web antes de seus arquivos JS<\/li>\n\n\n\n<li><strong>Compacta\u00e7\u00e3o autom\u00e1tica:<\/strong> na vers\u00e3o anterior do HTTP (1.1), devemos exigir explicitamente a compacta\u00e7\u00e3o de solicita\u00e7\u00f5es e respostas. HTTP\/2, no entanto, executa uma compacta\u00e7\u00e3o GZip automaticamente<\/li>\n\n\n\n<li><strong>Redefini\u00e7\u00e3o de conex\u00e3o:<\/strong> funcionalidade que permite fechar uma conex\u00e3o entre um servidor e um cliente por algum motivo, abrindo imediatamente uma nova<\/li>\n\n\n\n<li><strong>Server push:<\/strong> para evitar que um servidor receba muitos pedidos, o HTTP\/2 introduziu uma funcionalidade de server push. Com isso, o servidor tenta prever os recursos que ser\u00e3o solicitados em breve. Portanto, o servidor envia proativamente esses recursos para o cache do cliente<\/li>\n\n\n\n<li><strong>Protocolo Bin\u00e1rio: <\/strong>o HTTP\/2 tornou-se um protocolo bin\u00e1rio, substituindo as vers\u00f5es anteriores de texto simples do HTTP<\/li>\n<\/ul>\n\n\n\n<p>Para mais detalhes sobre o funcionamento do HTTP, d\u00ea uma olhada <a rel=\"noreferrer noopener\" href=\"https:\/\/vadebyte.com\/index.php\/2023\/02\/28\/a-evolucao-do-protocolo-http\/\" target=\"_blank\">neste artigo<\/a> e <a rel=\"noreferrer noopener\" href=\"https:\/\/www.youtube.com\/watch?v=NLLlFOgRcpM\" target=\"_blank\">neste v\u00eddeo<\/a> onde discutimos anteriormente sobre o assunto.<\/p>\n\n\n\n<p>O gRPC usa fluxos de dados HTTP\/2 ou HTTP\/2 Streams. O HTTP\/2 possibilita o uso de m\u00faltiplos streams em uma \u00fanica conex\u00e3o TCP de longa dura\u00e7\u00e3o.<br>Isso permite ao framework gRPC lidar com um elevado n\u00famero de chamadas RPC simult\u00e2neas com um baixo n\u00famero de conex\u00f5es TCP entre clientes e servidores.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fluxo de uso do gRPC<\/h3>\n\n\n\n<p>Para entender como o gRPC funciona, vamos percorrer um fluxo t\u00edpico de um cliente gRPC para um servidor gRPC. No exemplo a seguir, o Servi\u00e7o de Pedido \u00e9 o cliente gRPC, e o Servi\u00e7o de Pagamento \u00e9 o servidor gRPC.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/gRPC-worlflow-2-black-1024x701.png\" alt=\"\" class=\"wp-image-785\" width=\"708\" height=\"484\" srcset=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/gRPC-worlflow-2-black-1024x701.png 1024w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/gRPC-worlflow-2-black-300x205.png 300w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/gRPC-worlflow-2-black-768x526.png 768w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/gRPC-worlflow-2-black.png 1431w\" sizes=\"(max-width: 708px) 100vw, 708px\" \/><figcaption class=\"wp-element-caption\">Fluxo de comunica\u00e7\u00e3o gRPC<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Quando o Servi\u00e7o de Pedido faz uma chamada gRPC para o Servi\u00e7o de Pagamento, ele invoca o c\u00f3digo do cliente gerado pelo conjunto de ferramentas gRPC no momento da compila\u00e7\u00e3o. Esse c\u00f3digo de cliente \u00e9 chamado de <strong>stub cliente<\/strong>.<\/p>\n\n\n\n<p>O gRPC codifica os dados passados para o <strong>stub cliente<\/strong> em Buffers de Protocolo e os envia para a camada de transporte. O gRPC envia os dados pela rede como um quadro ou frame de dados HTTP\/2.<\/p>\n\n\n\n<p>Em raz\u00e3o da codifica\u00e7\u00e3o bin\u00e1ria e da otimiza\u00e7\u00e3o de rede, \u00e9 estimado que o gRPC seja <strong>5 vezes mais r\u00e1pido que o JSON<\/strong>.<\/p>\n\n\n\n<p>O servi\u00e7o de pagamento recebe os pacotes de rede, decodifica-os e invoca o servidor de aplica\u00e7\u00f5es.<\/p>\n\n\n\n<p>O resultado retornado pelo servidor de aplica\u00e7\u00f5es \u00e9 codificado em Buffers de Protocolo e enviado para a camada de transporte. O Servi\u00e7o de Pedido recebe os pacotes, decodifica-os e envia o resultado para o aplicativo cliente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ado\u00e7\u00e3o do gRPC<\/h2>\n\n\n\n<p>Como podemos ver no exemplo de fluxo acima, em teoria o gRPC \u00e9 muito f\u00e1cil de implementar.<br>Mas se \u00e9 t\u00e3o f\u00e1cil, por que n\u00e3o vemos o uso generalizado de gRPC entre clientes e servidores web?<br>Um dos motivos \u00e9 que o gRPC depende do HTTP\/2, voc\u00ea n\u00e3o pode chamar um servi\u00e7o gRPC diretamente de um navegador web pois atualmente nenhum navegador moderno acessa quadros HTTP\/2 e n\u00e3o fornecem o n\u00edvel de controle necess\u00e1rio \u00e0s requisi\u00e7\u00f5es Web para suportar um cliente gRPC.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Alternativas para uso do gRPC na Web<\/h2>\n\n\n\n<p>\u00c9 poss\u00edvel fazer chamadas gRPC a partir de um navegador com a ajuda de um proxy. Essa tecnologia \u00e9 chamada de <strong>gRPC-Web.<\/strong> No entanto, o conjunto de funcionalidades do gRPC-Web n\u00e3o \u00e9 totalmente compat\u00edvel com o gRPC e seu uso deixa a desejar em compara\u00e7\u00e3o ao gRPC.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Proxy-reverso-back-1024x402.png\" alt=\"\" class=\"wp-image-787\" width=\"623\" height=\"244\" srcset=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Proxy-reverso-back-1024x402.png 1024w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Proxy-reverso-back-300x118.png 300w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Proxy-reverso-back-768x302.png 768w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Proxy-reverso-back.png 1481w\" sizes=\"(max-width: 623px) 100vw, 623px\" \/><figcaption class=\"wp-element-caption\">gRPC Web<\/figcaption><\/figure>\n<\/div>\n\n\n<p><br>A maioria dos navegadores usa HTTP\/1.1 como padr\u00e3o, enquanto o gRPC s\u00f3 funciona com HTTP\/2. Voc\u00ea pode usar servi\u00e7os como nginx, envoy ou traefik para executar o HTTP\/2 por tr\u00e1s de um proxy reverso, muito semelhante a como os websockets s\u00e3o frequentemente usados por tr\u00e1s de um proxy reverso (neste caso, o HTTP\/1.1 \u00e9 atualizado para uma conex\u00e3o de websockets). O proxy reverso enviar\u00e1 a solicita\u00e7\u00e3o gRPC enviada como HTTP\/1.1 para um backend HTTP\/2 e vice-versa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quando utilizar gRPC?<\/h2>\n\n\n\n<p>Ent\u00e3o, onde o gRPC se destaca e quando devemos us\u00e1-lo?<\/p>\n\n\n\n<p>O gRPC \u00e9 o mecanismo de comunica\u00e7\u00e3o entre microsservi\u00e7os preferido pelos data centers. Seu amplo suporte a muitas linguagens de programa\u00e7\u00e3o e idiomas permite que os provedores de servi\u00e7os escolham suas linguagens preferidas e desenvolvam ecossistemas mais adequados para seus casos de uso.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Onde-usar-gRPC-Microservicos-em-data-centes-black.png\" alt=\"\" class=\"wp-image-788\" width=\"630\" height=\"536\" srcset=\"https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Onde-usar-gRPC-Microservicos-em-data-centes-black.png 996w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Onde-usar-gRPC-Microservicos-em-data-centes-black-300x256.png 300w, https:\/\/vadebyte.com\/wp-content\/uploads\/2023\/04\/Onde-usar-gRPC-Microservicos-em-data-centes-black-768x655.png 768w\" sizes=\"(max-width: 630px) 100vw, 630px\" \/><\/figure>\n<\/div>\n\n\n<p>Um dos maiores pontos fortes dos microsservi\u00e7os em contraste com a arquitetura monol\u00edtica \u00e9 a capacidade de usar tecnologias diferentes e de forma independente para cada servi\u00e7o \u2014 o que for mais adequado. Os microsservi\u00e7os devem ser compat\u00edveis com a API na troca de dados, formato de dados, padr\u00f5es de erro, balanceamento de carga e muito mais. E como o gRPC permite descrever um contrato de servi\u00e7o em formato bin\u00e1rio, os programadores t\u00eam uma maneira padr\u00e3o de especificar esses contratos independente da linguagem e que garante interoperabilidade.<\/p>\n\n\n\n<p>H\u00e1 tamb\u00e9m o uso crescente de gRPC nos clientes m\u00f3veis nativos. Sua efici\u00eancia e desempenho fazem muito sentido em ambientes com restri\u00e7\u00f5es de energia e largura de banda tipicamente aplic\u00e1veis aos dispositivos m\u00f3veis.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Resumo<\/strong><\/h2>\n\n\n\n<p>O gRPC \u00e9 um framework RPC (Remote Procedure Call), moderno, de c\u00f3digo aberto e alto desempenho que pode ser executado em qualquer ambiente. O gRPC pode conectar servi\u00e7os de forma eficiente dentro e entre datacenters com suporte plug\u00e1vel para balanceamento de carga, rastreamento, verifica\u00e7\u00e3o de integridade e autentica\u00e7\u00e3o. Tamb\u00e9m vem sendo utilizado nas etapas finais da computa\u00e7\u00e3o distribu\u00edda para conectar dispositivos, aplicativos m\u00f3veis e navegadores com servi\u00e7os de backend.<\/p>\n\n\n\n<p>Outro interessante caso de uso \u00e9 a gera\u00e7\u00e3o de bibliotecas cliente mais eficientes.<\/p>\n\n\n\n<p><strong>Principais cen\u00e1rios de uso:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Comunica\u00e7\u00e3o entre microsservi\u00e7os em ambientes multi-linguagem<\/li>\n\n\n\n<li>Conex\u00e3o entre dispositivos m\u00f3veis nativos<\/li>\n\n\n\n<li>Conex\u00e3o de navegadores cliente a servi\u00e7os de backend<\/li>\n\n\n\n<li>Gera\u00e7\u00e3o de bibliotecas de clientes mais eficientes<\/li>\n<\/ul>\n\n\n\n<p><strong>Principais recursos:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bibliotecas em 11 idiomas<\/li>\n\n\n\n<li>Efici\u00eancia de rede e defini\u00e7\u00e3o de estrutura de servi\u00e7o simples<\/li>\n\n\n\n<li>Streaming bidirecional com transporte baseado em HTTP\/2<\/li>\n\n\n\n<li>Autentica\u00e7\u00e3o conect\u00e1vel, rastreamento, balanceamento de carga e verifica\u00e7\u00e3o de integridade<\/li>\n<\/ul>\n\n\n\n<p><strong>Quem est\u00e1 usando o gRPC<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Google<\/li>\n\n\n\n<li>Slack<\/li>\n\n\n\n<li>Square<\/li>\n\n\n\n<li>Netflix<\/li>\n\n\n\n<li>CoreOS<\/li>\n\n\n\n<li>CockRoach Labs<\/li>\n\n\n\n<li>Cisco<\/li>\n\n\n\n<li>Juniper Networks<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Neste artigo, falamos sobre gRPC. Exploramos sobre seu hist\u00f3rico, arquitetura t\u00e9cnica e vantagens de uso. Iniciamos contando como o framework gRPC implementa RPC (Remote Procedure Call), destacamos o uso de ProtoBuf e depend\u00eancias do HTTP\/2. Tamb\u00e9m destacamos os principais casos de uso e empresas est\u00e3o utilizando o gRPC na entrega de seus servi\u00e7os. O gRPC possui uma comunidade e ecossistemas muito competente e ativo e sua ado\u00e7\u00e3o caminha a passos largos para resolver problemas espec\u00edficos ligados principalmente a performance.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O gRPC \u00e9 um framework RPC (Remote Procedure Call), moderno, de c\u00f3digo aberto e alto desempenho que pode ser executado em qualquer ambiente.<\/p>\n","protected":false},"author":1,"featured_media":760,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"[\"content\",\"tags\"]","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[8],"tags":[9,10,12,13,11],"class_list":["post-751","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenho-de-sistemas","tag-desenho-de-sistemas","tag-http","tag-internet","tag-protocolos","tag-redes"],"_links":{"self":[{"href":"https:\/\/vadebyte.com\/index.php\/wp-json\/wp\/v2\/posts\/751","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vadebyte.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vadebyte.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vadebyte.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vadebyte.com\/index.php\/wp-json\/wp\/v2\/comments?post=751"}],"version-history":[{"count":22,"href":"https:\/\/vadebyte.com\/index.php\/wp-json\/wp\/v2\/posts\/751\/revisions"}],"predecessor-version":[{"id":794,"href":"https:\/\/vadebyte.com\/index.php\/wp-json\/wp\/v2\/posts\/751\/revisions\/794"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vadebyte.com\/index.php\/wp-json\/wp\/v2\/media\/760"}],"wp:attachment":[{"href":"https:\/\/vadebyte.com\/index.php\/wp-json\/wp\/v2\/media?parent=751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vadebyte.com\/index.php\/wp-json\/wp\/v2\/categories?post=751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vadebyte.com\/index.php\/wp-json\/wp\/v2\/tags?post=751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}