Сравнительная таблица
SOAP | REST | gRPC | |
---|---|---|---|
Протокол | HTTP1.1. | HTTP1.1. | HTTP2 (работает в двух направлениях и за счет этого быстрее HTTP1.1) |
Подход | сервисно-ориентированный дизайн. Клиент запрашивает у сервера услугу или функцию, которая может затрагивать ресурсы сервера | объектно-ориентированный дизайн. Клиент запрашивает у сервера создание, совместное использование или модификацию ресурсов | сервисно-ориентированный дизайн. Клиент запрашивает у сервера услугу или функцию, которая может затрагивать ресурсы сервера |
|
|
|
|
Формат передаваемых данных | Запрос: XML Ответ: XML | Запрос: преимущественно JSON (реже XML) Ответ: JSON со всеми данными, найденными на сервере по этой конечной точке | Запрос: бинарный файл — protobuf. Ответ: бинарный файл — protobuf. |
Контракт | обязательны WSDL-схемы | необязательно OpenAPI (Swagger), эндпоинты могут быть не задокументированы | обязательно пишется по стандарту Protocol Buffers, компилируется внутренним компилятором protoc, который генерирует необходимый исходный код классов из определений в proto-файле |
Документирование | WSDL-схемы сложно писать и поддерживать | в JSON нужно задокументировать содержащиеся в нем поля и их типы. Часто информация может быть неточной, неполной или устаревшей. | четко определенная и самодокументируемая схема. API на Protobuf генерирует код, код не будет рассинхронизирован с документацией. При генерации кода из Protobuf проходит базовая проверка — сгенерированный код не принимает поля неправильного типа. |
Вес | XML весит больше аналогичных JSON и base64 и в основном применяется в legacy-системах, которые были разработаны в конце 1990-х — начале 2000-х. | JSON меньше XML, но больше protobuf | меньше JSON |
Производительность | Средняя, данные требуют дополнительной сериализации (парсинга) | Средняя, данные требуют дополнительной сериализации (парсинга) | Высокая, данные изначально сериализованы |
|
|
|
|
Связь с сервером | 1—1 | 1—1, 1—N, N—N | |
Скорость обмена | Средняя, обмен однонаправленный (запрос-ответ) | Высокая, обмен двунаправленный или стриминговый | |
Как передает данные | использует только HTTP-POST-запросы | создает разовое соединение между двумя точками: создал соединение, отправил и закрыл. Клиент шлет в API сообщения и сразу получает ответ или ждет формирования ответа. Клиенту и серверу не нужно знать о внутренних данных. Использует четыре основных метода HTTP: GET, POST, PUT, DELETE. | создает постоянное соединение — сокет — между двумя точками, по которому передает бинарный файл и вызывает удаленно функцию, передавая в нее параметры. Шлет сообщения в обе стороны: gRPC обеспечивает двунаправленную потоковую передачу данных — и клиент, и сервер могут одновременно посылать и получать несколько запросов и ответов в рамках одного соединения. REST так не умеет. Использует только HTTP-POST-запросы. |
Число конечных точек (точек входа в приложение) | 1 | без ограничений | 1 |
|
|
|
|
Работа в вебе | без допусилий | без допусилий | с дополнительными усилиями:
|
Для какой архитектуры | сложная архитектура, выходящая за рамки CRUD. SOAP используют многие банки. | преимущественно CRUD. Самая популярная архитектура API для веб-сервисов и микросервисных архитектур. | преимущественно CRUD |
Мультиязыковая поддержка | Не зависит от языка | Средняя, требуются сторонние сервисы для мультиязыковых систем | Высокая, встроенная автоматическая генерация кода для популярных языковых сред |
Достоинства |
|
|
|
Недостатки |
|
|
|
Когда использовать | финтех и другие долгие массивные проекты со сложной архитектурой, легаси с 90-00 хх гг. или исторически выбранный SOAP, от которого не отказаться. Для нового проекта, возможно, стоит присмотреться к альтернативам. | благодаря простой реализации и отображению структуры данных, удобству чтения с ним легко работать начинающим программистам. | разработан для того, чтобы дать разработчикам возможность создавать высокопроизводительные API для микросервисных архитектур в распределенных центрах обработки данных. В том числе для микросервисных архитектур на нескольких языках программирования, для которых API вряд ли будет меняться со временем. Также он хорошо подходит для внутренних систем, требующих потоковой передачи данных в реальном времени и загрузки больших объемов информации. |
Источник: https://habr.com/ru/companies/tinkoff/articles/780024/
Last updated