Como o GRPC é diferente do REST?

98

Estou lendo esta explicação de GRPC e este diagrama é de interesse:

insira a descrição da imagem aqui

Como funciona a camada de transporte? Se for pela rede ... por que é chamado de RPC? Mais importante, em que isso difere do REST que implementa uma API para a camada de serviço (a classe no cliente que possui métodos que fazem uma solicitação http)?

Jwan622
fonte
20
«Se for pela rede ... por que é chamado de RPC» - Porque RPC é uma Chamada de Procedimento Remoto, e 'remoto' pode significar totalmente 'em outro host'.
estranho

Respostas:

104

A camada de transporte funciona usando HTTP / 2 sobre TCP / IP. Ele permite conexões de menor latência (mais rápidas) que podem tirar proveito de uma única conexão de cliente para servidor (o que torna o uso da conexão mais eficiente e pode resultar em um uso mais eficiente dos recursos do servidor.

HTTP / 2 também suporta conectividade bidirecional e conectividade assíncrona. Assim, é possível que o servidor faça contato de forma eficiente com o cliente para enviar mensagens (resposta / notificações assíncronas, etc.)

Embora REST e gRPC possam gerar stubs de cliente / servidor (usando algo como swagger para REST), REST tem um conjunto limitado de chamadas de 'função' primárias (ou verbos):

+ ----------- + ---------------- +
| HTTP Verb | CRUD |
+ ----------- + ---------------- +
| GET | Leia |
| PUT | Atualizar / substituir |
| PATCH | Atualizar / modificar |
| DELETE | Excluir |
+ ----------- + ---------------- +

enquanto o gRPC pode definir qualquer tipo de chamada de função, incluindo síncrona / assíncrona, unidirecional / bidirecional (fluxos), etc.

Usando o gRPC, o cliente faz uma chamada para um método local. Para o programador, parece que você está fazendo uma chamada local, mas a camada subjacente (o stub do cliente gerado automaticamente) envia a chamada para o servidor. Para o servidor, parece que seu método foi chamado localmente.

gRPC cuida de todo o encanamento subjacente e simplifica o paradigma de programação. No entanto, para alguns puristas REST dedicados, isso pode parecer uma complicação excessiva. YMMV

mmccabe
fonte
2
Então, uma pergunta rápida: no REST, você também pode chamar qualquer tipo de função. Por exemplo, no Rails, posso enviar uma solicitação GET para um endpoint que não seja RESTful e fazer algo além de apenas obter um recurso. Posso eliminar qualquer função desse ponto de extremidade não RESTful. Eu também posso criar serviços em REST que parecem estar chamando um método local, mas realmente por baixo do capô está fazendo uma chamada http para um endpoint. Então, as diferenças não são tão grandes, são ... pelo menos na camada de transporte. Ou são eles?
Jwan622
2
REST / RESTful é executado em HTTP, gRPC executado em HTTP / 2 (como um WebSocket). Usando um gerador de código do Swagger, é possível gerar stubs de cliente e servidor para REST, o gRPC usa um arquivo proto para gerar seus stubs (não muito diferente da antiga abordagem WSDL / SOAP). O arquivo proto define o tipo, portanto, os stubs cliente / servidor gerados são seguros para o tipo. Em um dispositivo móvel, a conexão gRPC é eficiente, pois pode compartilhar o mesmo soquete HTTP / 2 subjacente com qualquer outra conexão simultânea do aplicativo móvel.
mmccabe
Esta é uma boa introdução ao gRPC: medium.com/square-corner-blog/grpc-reaches-1-0-85728518393b Aqui está uma demonstração do gRPC: github.com/mmcc007/go
mmccabe
1
Jwan622 e mmccabe: Usando a biblioteca Superglue 2.1, posso construir uma casa com maçãs e laranjas. Em algum momento, temos que escolher a ferramenta certa para o trabalho e sempre buscar minimizar a complexidade do nosso sistema de software. Lembre-se de que remover o código é sempre uma otimização do desempenho;)
Martin Andersson
4
Da minha perspectiva, coisas como APIs RESTful sempre foram um "hack" para usar em protocolos antigos. Se surgir algo que me permita usar uma pilha mais adequada para linguagens modernas e ainda ser agnóstico quanto a qual linguagem está sendo usada especificamente por um cliente E aumentar o desempenho drasticamente, então serei a primeira pessoa a entrar no trem!
Martin Andersson
42

REST não requer JSON ou HTTP / 1.1

Você pode construir trivialmente um serviço RESTful que envia mensagens protobuf (ou qualquer outra coisa) por HTTP / 2

Você pode construir serviços RESTful que enviam JSON sobre HTTP / 2

Você pode construir serviços RESTful que enviam mensagens protobuf sobre HTTP / 1.1

Os serviços RESTful não são um "hack" no topo do HTTP / xx, são serviços que seguem os princípios arquitetônicos fundamentais que tornaram qualquer versão do HTTP bem-sucedida (como a capacidade de cache de solicitações GET e a capacidade de reprodução de solicitações PUT).

gRPC, SOAP, et. todos são mais como hacks - hacks em cima de HTTP para criar um túnel de serviços no estilo RPC sobre HTTP, para contornar as restrições de firewall e middlebox. Isso não é necessariamente uma coisa ruim. Às vezes, você pode querer um serviço do estilo RPC em vez de um REST, e temos que viver em um mundo onde middleboxes são difíceis de substituir.

Se você não tem tempo para ler sobre a definição real de REST: https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

Sempre há o TLDR; versão na wikipedia:

https://en.wikipedia.org/wiki/Representational_state_transfer

Se você precisa de um serviço no estilo RPC, com certeza, o gRPC é ótimo. Se você deseja viver na web ou deseja todos os benefícios que vêm com um serviço de estilo RESTful, crie um serviço de estilo RESTful. E se for muito lento serializar / desserializar dados no formato JSON em seu serviço restful, é perfeitamente normal usar protobuf ou qualquer outro.

Se gRPC for uma versão 2 de qualquer coisa, é uma versão 2 do SOAP. Um que não seja terrível, como o SOAP.

E, não, você não pode simplesmente "chamar qualquer função" em sua solicitação GET e ter um serviço RESTful.

Uma última coisa: se você for usar protobufs em um serviço RESTful, faça certo, usando cabeçalhos de tipo de conteúdo, etc. Com isso, você pode facilmente suportar JSON E protobuf.

Saindo da minha caixa SOAP agora ..;)

user2077221
fonte
Você está sugerindo que um serviço RESTful não pode ser criado usando gRPC?
Kevin S
1
A RTFM citando a dissertação de Fielding foi um exagero, mas, de resto, uma ótima resposta.
rmharrison
4

A maior vantagem do gRPC sobre REST é o suporte de HTTP / 2 sobre o vovô HTTP 1.1. Então, a maior vantagem de HTTP / 2 sobre HTTP 1.1 é, 'HTTP / 2 permite que o servidor "envie" conteúdo' ...

Denis Wang
fonte
1
O push do servidor não precisa de HTTP / 2.
Robin Green,
Você poderia ser mais específico? Este é o wiki falando sobre HTTP / 2 Server Push: en.wikipedia.org/wiki/HTTP/2_Server_Push
Denis Wang
2
Desculpe, não quis dizer push do servidor HTTP 2, mas sim streaming de respostas. Existem outras maneiras de responder por streaming, como o venerável long polling ou websockets, por exemplo.
Robin Green,
1
O servidor gRPC não envia HTTP / 2 "push e o cliente gRPC ignora HTTP / 2" push ". Portanto, as vantagens do gRPC herdadas de HTTP / 2 não devem incluir" push ".
usuário675693