Comparar serviços gRPC com APIs HTTPCompare gRPC services with HTTP APIs

Por James Newton – KingBy James Newton-King

Este artigo explica como os Serviços gRPCs se comparam às APIs http (incluindo ASP.NET Core APIs Web).This article explains how gRPC services compare to HTTP APIs (including ASP.NET Core web APIs). A tecnologia usada para fornecer uma API para seu aplicativo é uma opção importante, e o gRPC oferece benefícios exclusivos em comparação com as APIs HTTP.The technology used to provide an API for your app is an important choice, and gRPC offers unique benefits compared to HTTP APIs. Este artigo discute os pontos fortes e fracos do gRPC e recomenda cenários para usar o gRPC em relação a outras tecnologias.This article discusses the strengths and weaknesses of gRPC and recommends scenarios for using gRPC over other technologies.

Comparação de alto nívelHigh-level comparison

A tabela a seguir oferece uma comparação de alto nível dos recursos entre as APIs gRPC e HTTP com JSON.The following table offers a high-level comparison of features between gRPC and HTTP APIs with JSON.

RecursoFeature gRPCgRPC APIs HTTP com JSONHTTP APIs with JSON
ContratoContract Necessário ( . proto)Required (.proto) Opcional (OpenAPI)Optional (OpenAPI)
ProtocoloProtocol HTTP/2HTTP/2 HTTPHTTP
CargaPayload Protobuf (pequeno, binário)Protobuf (small, binary) JSON (grande, legível por humanos)JSON (large, human readable)
PrescriptivenessPrescriptiveness Especificação estritaStrict specification Cancelar.Loose. Qualquer HTTP é válido.Any HTTP is valid.
StreamingStreaming Cliente, servidor, bidirecionalClient, server, bi-directional Cliente, servidorClient, server
Suporte a navegadorBrowser support Não (requer grpc-Web)No (requires grpc-web) SimYes
SegurançaSecurity Transporte (TLS)Transport (TLS) Transporte (TLS)Transport (TLS)
Geração de código de clienteClient code-generation SimYes OpenAPI + ferramentas de terceirosOpenAPI + third-party tooling

forças gRPCsgRPC strengths

DesempenhoPerformance

as mensagens gRPC são serializadas usando Protobuf, um formato de mensagem binária eficiente.gRPC messages are serialized using Protobuf, an efficient binary message format. O Protobuf serializa muito rapidamente no servidor e no cliente.Protobuf serializes very quickly on the server and client. A serialização Protobuf resulta em cargas de mensagens pequenas, importantes em cenários de largura de banda limitada, como aplicativos móveis.Protobuf serialization results in small message payloads, important in limited bandwidth scenarios like mobile apps.

o gRPC foi projetado para HTTP/2, uma revisão importante do HTTP que fornece benefícios de desempenho significativos em relação ao HTTP 1. x:gRPC is designed for HTTP/2, a major revision of HTTP that provides significant performance benefits over HTTP 1.x:

  • Enquadramento e compactação binários.Binary framing and compression. O protocolo HTTP/2 é compacto e eficiente no envio e no recebimento.HTTP/2 protocol is compact and efficient both in sending and receiving.
  • Multiplexação de várias chamadas HTTP/2 em uma única conexão TCP.Multiplexing of multiple HTTP/2 calls over a single TCP connection. A multiplexação elimina o bloqueio de cabeçalho de linha.Multiplexing eliminates head-of-line blocking.

Geração de códigoCode generation

Todas as estruturas gRPC fornecem suporte de primeira classe para geração de código.All gRPC frameworks provide first-class support for code generation. Um arquivo de núcleo para o desenvolvimento de gRPC é o arquivo. proto, que define o contrato de serviços e mensagens do gRPC.A core file to gRPC development is the .proto file, which defines the contract of gRPC services and messages. Desse arquivo, as estruturas do gRPC de código gerarão uma classe base de serviço, mensagens e um cliente completo.From this file gRPC frameworks will code generate a service base class, messages, and a complete client.

Ao compartilhar o arquivo . proto entre o servidor e o cliente, as mensagens e o código do cliente podem ser gerados de ponta a ponta.By sharing the .proto file between the server and client, messages and client code can be generated from end to end. A geração de código do cliente elimina a duplicação de mensagens no cliente e no servidor e cria um cliente fortemente tipado para você.Code generation of the client eliminates duplication of messages on the client and server, and creates a strongly-typed client for you. Não ter de escrever um cliente economiza um tempo de desenvolvimento significativo em aplicativos com muitos serviços.Not having to write a client saves significant development time in applications with many services.

Especificação estritaStrict specification

Não existe uma especificação formal para a API HTTP com JSON.A formal specification for HTTP API with JSON doesn't exist. Os desenvolvedores debaterão o melhor formato de URLs, verbos HTTP e códigos de resposta.Developers debate the best format of URLs, HTTP verbs, and response codes.

A especificação gRPC é prescritiva sobre o formato que um serviço gRPC deve seguir.The gRPC specification is prescriptive about the format a gRPC service must follow. o gRPC elimina o debate e economiza tempo para desenvolvedores porque o gRPC é consistente entre plataformas e implementações.gRPC eliminates debate and saves developer time because gRPC is consistent across platforms and implementations.

StreamingStreaming

O HTTP/2 fornece uma base para fluxos de comunicação de longa duração e em tempo real.HTTP/2 provides a foundation for long-lived, real-time communication streams. o gRPC fornece suporte de primeira classe para streaming por meio de HTTP/2.gRPC provides first-class support for streaming through HTTP/2.

Um serviço gRPC dá suporte A todas as combinações de streaming:A gRPC service supports all streaming combinations:

  • Unário (sem streaming)Unary (no streaming)
  • Streaming de servidor para clienteServer to client streaming
  • Transmissão de cliente para servidorClient to server streaming
  • Streaming bidirecionalBi-directional streaming

Prazo/tempos limite e cancelamentoDeadline/timeouts and cancellation

o gRPC permite que os clientes especifiquem por quanto tempo eles estão dispostos a aguardar a conclusão de um RPC.gRPC allows clients to specify how long they are willing to wait for an RPC to complete. O prazo é enviado ao servidor e o servidor pode decidir a ação a ser tomada se exceder o prazo.The deadline is sent to the server, and the server can decide what action to take if it exceeds the deadline. Por exemplo, o servidor pode cancelar solicitações de gRPC/HTTP/banco de dados em andamento no tempo limite.For example, the server might cancel in-progress gRPC/HTTP/database requests on timeout.

Propagar o prazo e o cancelamento por meio de chamadas gRPC filho ajuda a impor limites de uso de recursos.Propagating the deadline and cancellation through child gRPC calls helps enforce resource usage limits.

o gRPC é bem adequado para os seguintes cenários:gRPC is well suited to the following scenarios:

  • Os microserviços – gRPC foi projetado para comunicação de baixa latência e alta taxa de transferência.Microservices – gRPC is designed for low latency and high throughput communication. o gRPC é ótimo para microserviços leves em que a eficiência é fundamental.gRPC is great for lightweight microservices where efficiency is critical.
  • A comunicação em tempo real de ponto a ponto – gRPC tem excelente suporte para streaming bidirecional.Point-to-point real-time communication – gRPC has excellent support for bi-directional streaming. os serviços gRPCs podem enviar mensagens por push em tempo real sem sondagem.gRPC services can push messages in real-time without polling.
  • Os ambientes poliglota – ferramentas de gRPC dão suporte a todas as linguagens de desenvolvimento populares, tornando o gRPC uma boa opção para ambientes com vários idiomas.Polyglot environments – gRPC tooling supports all popular development languages, making gRPC a good choice for multi-language environments.
  • Ambientes com restrição de rede – mensagens gRPC são serializadas com Protobuf, um formato de mensagem leve.Network constrained environments – gRPC messages are serialized with Protobuf, a lightweight message format. Uma mensagem gRPC é sempre menor do que uma mensagem JSON equivalente.A gRPC message is always smaller than an equivalent JSON message.

gRPC fracosgRPC weaknesses

Suporte limitado a navegadorLimited browser support

É impossível chamar diretamente um serviço gRPC de um navegador hoje.It's impossible to directly call a gRPC service from a browser today. gRPC usa intensamente recursos HTTP/2 e nenhum navegador fornece o nível de controle necessário em relação a solicitações da Web para dar suporte a um cliente gRPC.gRPC heavily uses HTTP/2 features and no browser provides the level of control required over web requests to support a gRPC client. Por exemplo, os navegadores não permitem que um chamador exija que o HTTP/2 seja usado ou forneça acesso a quadros HTTP/2 subjacentes.For example, browsers do not allow a caller to require that HTTP/2 be used, or provide access to underlying HTTP/2 frames.

gRPC-Web é uma tecnologia adicional da equipe do gRPC que fornece suporte limitado a gRPC no navegador.gRPC-Web is an additional technology from the gRPC team that provides limited gRPC support in the browser. gRPC-Web consiste em duas partes: um cliente JavaScript que dá suporte a todos os navegadores modernos e um proxy gRPC-Web no servidor.gRPC-Web consists of two parts: a JavaScript client that supports all modern browsers, and a gRPC-Web proxy on the server. O cliente Web gRPC chama o proxy e o proxy será encaminhado nas solicitações gRPC para o servidor gRPC.The gRPC-Web client calls the proxy and the proxy will forward on the gRPC requests to the gRPC server.

Nem todos os recursos de gRPC têm suporte no gRPC-Web.Not all of gRPC's features are supported by gRPC-Web. Não há suporte para o streaming bidirecional e de cliente, e há suporte limitado para streaming de servidor.Client and bi-directional streaming isn't supported, and there is limited support for server streaming.

Não legível por humanosNot human readable

As solicitações de API HTTP são enviadas como texto e podem ser lidas e criadas por humanos.HTTP API requests are sent as text and can be read and created by humans.

as mensagens gRPC são codificadas com Protobuf por padrão.gRPC messages are encoded with Protobuf by default. Embora o Protobuf seja eficiente para enviar e receber, seu formato binário não é legível por humanos.While Protobuf is efficient to send and receive, its binary format isn't human readable. Protobuf requer a descrição da interface da mensagem especificada no arquivo . proto para desserializar corretamente.Protobuf requires the message's interface description specified in the .proto file to properly deserialize. Ferramentas adicionais são necessárias para analisar cargas de Protobuf na transmissão e para compor solicitações manualmente.Additional tooling is required to analyze Protobuf payloads on the wire and to compose requests by hand.

Recursos como reflexão de servidor e a ferramenta de linha de comando gRPC existem para auxiliar com mensagens Protobuf binárias.Features such as server reflection and the gRPC command line tool exist to assist with binary Protobuf messages. Além disso, as mensagens Protobuf dão suporte à conversão de e para JSON.Also, Protobuf messages support conversion to and from JSON. A conversão interna de JSON fornece uma maneira eficiente de converter mensagens Protobuf de e para o formulário legível por humanos durante a depuração.The built-in JSON conversion provides an efficient way to convert Protobuf messages to and from human readable form when debugging.

Cenários de estrutura alternativosAlternative framework scenarios

Outras estruturas são recomendadas em relação ao gRPC nos seguintes cenários:Other frameworks are recommended over gRPC in the following scenarios:

  • APIs acessíveis ao navegador – gRPC não tem suporte total no navegador.Browser accessible APIs – gRPC isn't fully supported in the browser. o gRPC-Web pode oferecer suporte a navegador, mas tem limitações e introduz um proxy de servidor.gRPC-Web can offer browser support, but it has limitations and introduces a server proxy.
  • Transmita a comunicação em tempo real – gRPC dá suporte à comunicação em tempo real via streaming, mas o conceito de difusão de uma mensagem para conexões registradas não existe.Broadcast real-time communication – gRPC supports real-time communication via streaming, but the concept of broadcasting a message out to registered connections doesn't exist. Por exemplo, em um cenário de sala de chat em que novas mensagens de chat devem ser enviadas a todos os clientes na sala de chat, cada chamada de gRPC é necessária para transmitir individualmente novas mensagens de chat para o cliente.For example in a chat room scenario where new chat messages should be sent to all clients in the chat room, each gRPC call is required to individually stream new chat messages to the client. SignalR é uma estrutura útil para esse cenário.SignalR is a useful framework for this scenario. SignalR tem o conceito de conexões persistentes e suporte interno para mensagens de difusão. has the concept of persistent connections and built-in support for broadcasting messages.
  • A comunicação entre processos – um processo deve hospedar um servidor http/2 para aceitar chamadas gRPC de entrada.Inter-process communication – A process must host an HTTP/2 server to accept incoming gRPC calls. Para o Windows, os pipes de comunicação entre processos são um método rápido e leve de comunicação.For Windows, inter-process communication pipes is a fast, lightweight method of communication.

Recursos adicionaisAdditional resources