1. Введение в архитектурные стили: REST, GraphQL и gRPC
Введение в архитектурные стили: REST, GraphQL и gRPC
Добро пожаловать на курс «Основы проектирования и архитектуры API». Это первая статья, и мы начнем с фундамента. Прежде чем писать код или выбирать базу данных, архитектор должен ответить на главный вопрос: как компоненты системы будут общаться друг с другом?
API (Application Programming Interface) — это не просто набор функций. Это контракт, по которому одна программа просит другую выполнить работу. От того, как составлен этот контракт, зависит скорость разработки, производительность приложения и удобство его поддержки.
Сегодня мы разберем «большую тройку» современных подходов к построению API: REST, GraphQL и gRPC. Мы узнаем, чем они отличаются, где их сильные стороны и почему нельзя просто выбрать один стиль на все случаи жизни.
Что такое архитектурный стиль API?
Представьте, что вы пришли в ресторан. Вы (клиент) хотите получить еду (данные) с кухни (сервер). Официант — это API. Но как именно вы взаимодействуете с официантом?
!Иллюстрация различий в подходах взаимодействия клиента и сервера
Разберем каждый стиль подробнее.
REST: Классика интернета
REST (Representational State Transfer) — это архитектурный стиль, который стал стандартом де-факто для веб-разработки. Он был описан Роем Филдингом в 2000 году и базируется на протоколе HTTP.
Ключевая концепция: Ресурсы
В REST всё вращается вокруг ресурсов. Ресурс — это сущность (пользователь, заказ, товар), к которой можно обратиться по уникальному адресу (URI).
Для взаимодействия с ресурсами используются стандартные HTTP-методы (глаголы):
* GET: Получить данные (чтение). * POST: Создать новый ресурс. * PUT / PATCH: Обновить существующий ресурс. * DELETE: Удалить ресурс.
Пример REST API
Допустим, мы хотим получить информацию о пользователе с ID 1.
Запрос:
Ответ (JSON):
Преимущества REST
GET — это чтение, а DELETE — удаление.Недостатки REST
Главная проблема REST — это Over-fetching (избыточная выборка) и Under-fetching (недостаточная выборка).
* Over-fetching: Вы хотите получить только имя пользователя, но сервер возвращает вам огромный объект с адресом, историей заказов и датой регистрации. Вы тратите трафик зря.
* Under-fetching: Вам нужно имя пользователя и список заголовков его последних статей. В REST вам часто придется сделать два запроса: сначала GET /users/1, а потом GET /users/1/posts.
GraphQL: Гибкость и точность
GraphQL — это язык запросов для API, разработанный Facebook в 2012 году и выпущенный в 2015. Он был создан именно для решения проблем REST с гибкостью выборки данных.
Ключевая концепция: Клиент определяет данные
В GraphQL обычно есть всего один эндпоинт (обычно /graphql), который принимает POST-запросы. В теле запроса клиент описывает структуру данных, которую хочет получить.
Пример GraphQL
Вернемся к примеру с пользователем. Нам нужно только имя и заголовки его постов.
Запрос:
Ответ (JSON):
Обратите внимание: сервер вернул ровно то, что мы просили. Ни байтом больше.
!Сравнение эффективности выборки данных в REST и GraphQL
Преимущества GraphQL
Недостатки GraphQL
POST на один адрес, стандартное HTTP-кэширование не работает. Нужно придумывать свои механизмы.gRPC: Скорость и эффективность
gRPC (gRPC Remote Procedure Call) — это высокопроизводительный фреймворк, разработанный Google. Если REST и GraphQL чаще используют JSON (текстовый формат), то gRPC использует Protocol Buffers (бинарный формат).
Ключевая концепция: Удаленный вызов процедур
В gRPC мы не думаем о «ресурсах» (как в REST). Мы думаем о «функциях», которые можно вызвать на другом сервере так же просто, как если бы они были в вашем коде.
Данные передаются в бинарном виде, что делает их очень компактными, а передачу — быстрой. gRPC работает поверх протокола HTTP/2, что позволяет использовать стриминг (потоковую передачу данных).
Пример определения (Protobuf)
В gRPC сначала пишется .proto файл — контракт.
Преимущества gRPC
.proto файла можно автоматически сгенерировать клиентский и серверный код для множества языков (Go, Java, Python, C++ и др.).Недостатки gRPC
!gRPC идеально подходит для внутренней коммуникации между микросервисами
Сводная таблица: Что выбрать?
Выбор архитектурного стиля зависит от задачи. Не существует «лучшего» стиля, есть наиболее подходящий.
| Характеристика | REST | GraphQL | gRPC | | :--- | :--- | :--- | :--- | | Основная идея | Ресурсы (существительные) | Граф данных (запросы) | Действия (глаголы/функции) | | Формат данных | Обычно JSON | JSON | Protocol Buffers (бинарный) | | Протокол | HTTP/1.1 (чаще всего) | HTTP/1.1 | HTTP/2 | | Кэширование | Легкое (средствами HTTP) | Сложное | Сложное | | Читаемость | Высокая | Высокая | Низкая (бинарный) | | Идеально для | Публичные API, простые сервисы | Сложные UI, мобильные приложения | Микросервисы, IoT, высокая нагрузка |
Заключение
В этой статье мы познакомились с тремя китами современного API:
* Выбирайте REST, если вам нужен простой, понятный и кэшируемый API для публичного использования или интеграции с множеством сторонних сервисов. * Выбирайте GraphQL, если у вас сложный фронтенд, которому нужны гибкие выборки данных, или мобильное приложение, где важна экономия трафика. * Выбирайте gRPC, если вы строите внутреннюю сеть микросервисов, где критична скорость, низкая задержка и строгая типизация.
В следующих статьях курса мы углубимся в проектирование каждого из этих стилей, начиная с детального разбора REST. Мы научимся правильно именовать ресурсы, обрабатывать ошибки и версионировать наши API.