Чим GRPC відрізняється від REST?


98

Я читаю це пояснення GRPC, і ця діаграма представляє інтерес:

введіть тут опис зображення

Як працює транспортний шар? Якщо це через мережу ... чому його називають RPC? Що ще важливіше, чим це відрізняється від REST, який реалізує API для сервісного рівня (клас клієнта, який має методи, що створюють запит http)?


20
«Якщо це через мережу ... чому його називають RPC» - Оскільки RPC - це віддалений виклик процедури, а «віддалений» може означати «інший хост».
weirdan

Відповіді:


104

Транспортний шар працює за допомогою HTTP / 2 поверх TCP / IP. Це дозволяє знизити затримку (швидші) з'єднання, які можуть скористатися одним з'єднанням від клієнта до сервера (що дозволяє більш ефективно використовувати з'єднання і може призвести до більш ефективного використання ресурсів сервера.

HTTP / 2 також підтримує двонаправлене підключення та асинхронне підключення. Таким чином, сервер може ефективно контактувати з клієнтом для надсилання повідомлень (відповідь асинхронізації / сповіщення тощо).

Хоча і REST, і gRPC можуть генерувати заглушки клієнта / сервера (використовуючи щось на зразок swagger для REST), REST має обмежений набір первинних "функціональних" викликів (або дієслів):

+ ----------- + ---------------- +
| HTTP Дієслово | CRUD |
+ ----------- + ---------------- +
| ЗАРАЗ | Прочитайте |
| ПУТ | Оновлення / Заміна |
| ПАТЧ | Оновлення / зміни |
| УДАЛИТИ | Видалити |
+ ----------- + ---------------- +

тоді як gRPC ви можете визначити будь-який тип функціональних викликів, включаючи синхронні / асинхронні, однонаправлені / двонаправлені (потоки) тощо.

За допомогою gRPC клієнт здійснює виклик до локального методу. Програмісту виглядає так, що ви здійснюєте локальний дзвінок, але нижній рівень (автоматично сгенерований замовник клієнта) надсилає виклик серверу. На сервер схоже, що його метод викликався локально.

gRPC піклується про всі основні сантехнічні системи та спрощує парадигму програмування. Однак для деяких відданих пуристів REST це може здатися надмірним ускладненням. YMMV


2
Отже, швидке запитання: У програмі REST ви також можете викликати будь-яку функцію. Наприклад, в Rails я можу надіслати GET-запит до кінцевої точки, яка не є RESTful, і зробити щось, крім того, щоб просто отримати ресурс. Я можу розпочати справді будь-яку функцію з тієї нерештивної кінцевої точки. Я також можу створювати сервіси в REST, які, як видається, викликають локальний метод, але дійсно під кришкою здійснюють http-дзвінок до кінцевої точки. Тож відмінності не такі великі, як вони ... принаймні, на транспортному шарі. Або вони?
Jwan622

2
REST / RESTful працює через HTTP, gRPC працює над HTTP / 2 (як WebSocket). За допомогою генератора коду від Swagger можна генерувати клієнтські та серверні заглушки для REST, gRPC використовує прото-файл для створення його заглушок (не на відміну від старого підходу WSDL / SOAP). Файл протоколу визначає тип, тому згенеровані заглушки клієнта / сервера є безпечними. На мобільному пристрої з'єднання gRPC є ефективним, оскільки воно може спільно використовувати той самий базовий сокет HTTP / 2 з будь-якими іншими одночасними з'єднаннями мобільного додатка.
mmccabe

Ось приємний вступ до gRPC: medium.com/square-corner-blog/grpc-reaches-1-0-85728518393b Ось демонстрація gRPC: github.com/mmcc007/go
mmccabe

1
Jwan622 та mmccabe: Використовуючи бібліотеку Superglue 2.1, я можу побудувати будинок з яблук та апельсинів. У якийсь момент ми маємо вибрати правильний інструмент для роботи та завжди прагнути мінімізувати складність нашої програмної системи. Пам'ятайте, що видалення коду - це завжди оптимізація продуктивності;)
Мартін Андерссон

4
З моєї точки зору, такі речі, як RESTful API, завжди були "хаком", щоб їздити за старими протоколами. Якщо щось з'явиться, що дозволить мені використовувати стек, більш підходящий для сучасних мов, і все ще буду агностиком до того, якою мовою конкретно користується клієнт І різко підвищить продуктивність, то я буду першою людиною, яка перескочила на прокладку!
Мартін Андерссон

42

REST не вимагає JSON або HTTP / 1.1

Ви можете тривіально побудувати послугу RESTful, яка надсилає протобуфні повідомлення (або що завгодно) через HTTP / 2

Ви можете створювати RESTful сервіси, які надсилають JSON через HTTP / 2

Ви можете створювати RESTful сервіси, які надсилають протобуфні повідомлення через HTTP / 1.1

Сервіси RESTful не є "хаком" поверх HTTP / xx, це служби, що слідують за основними архітектурними принципами, які зробили успішною будь-яку версію HTTP (наприклад, кешированість GET-запитів та перезавантаження PUT-запитів).

gRPC, SOAP та ін. al більше схожі на хаки - хаки поверх HTTP для тунелювання служб у стилі RPC через HTTP, для маршрутизації обмежень між брандмауером та середнім ящиком. Це не обов'язково погано. Іноді ви можете захотіти послугу в стилі RPC замість REST, і ми мусимо жити у світі, де середні скриньки важко замінити.

Якщо у вас немає часу прочитати фактичне визначення REST: https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

Завжди є TLDR; версія у Вікіпедії:

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

Якщо вам потрібна послуга в стилі RPC, звичайно, gRPC - це чудово. Якщо ви хочете жити в Інтернеті або хочете отримати всі переваги, що надаються послугою стилю RESTful, тоді створіть послугу стилю RESTful. І якщо занадто повільно серіалізувати / десеріалізувати дані у форматі JSON у вашому спокійному сервісі, цілком нормально використовувати протобуф або будь-що інше.

Якщо gRPC є версією 2 будь-чого, це версія 2 SOAP. Той, який не страшний, як SOAP.

І, ні, ви не можете просто "зателефонувати на будь-яку функцію" у вашому GET-запиті та отримати послуги RESTful.

Останнє: якщо ви збираєтесь використовувати протобуфи через службу RESTful, будь ласка, зробіть це правильно, використовуючи заголовки типу вмісту тощо. З цим ви можете легко підтримувати як JSON, так і протобуф.

Відступивши від мого SOAP-коробки зараз ..;)


Ви маєте на увазі, що послугу RESTful не можна створити за допомогою gRPC?
Кевін S

1
RTFM з посиланням на дисертацію Філдінга був надмірним, але в іншому випадку чудовим відгуком.
rmharrison

4

Найбільша перевага gRPC над REST - це підтримка HTTP / 2 над дідусем HTTP 1.1. Тоді найбільша перевага HTTP / 2 над HTTP 1.1 полягає в тому, що "HTTP / 2 дозволяє серверу" відштовхувати "вміст" ...


1
Натискання сервера не потребує HTTP / 2.
Робін Грін

Чи можете ви бути більш конкретними? Це вікі, що говорить про HTTP / 2 Server Push: en.wikipedia.org/wiki/HTTP/2_Server_Push
Денис Ван

2
Вибачте, я не мав на увазі натискання сервера HTTP 2, я мав на увазі потокове відповідь. Існують й інші способи здійснення потокових відповідей, наприклад, поважне довге опитування або веб-розетки, наприклад.
Робін Грін

1
Сервер gRPC не надсилає HTTP / 2 "push, а клієнт gRPC ігнорує HTTP / 2" push ". Отже, переваги gRPC, успадковані від HTTP / 2, не повинні включати" push ".
user675693
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.