JavaRush /Курси /Модуль 5. Spring /Лекція 288: Порівняння REST і GraphQL у мікросервісах

Лекція 288: Порівняння REST і GraphQL у мікросервісах

Модуль 5. Spring
Рівень 15 , Лекція 7
Відкрита

Тепер настав час глянути на велике питання — коли краще використовувати REST, а коли — GraphQL, особливо в контексті мікросервісної архітектури.


Підходи до структури API

REST і GraphQL представляють два зовсім різні підходи до побудови API.

REST (Representational State Transfer) базується на концепції ресурсно-орієнтованого підходу. Усе в REST — це ресурс, який ідентифікується URI. Приклади маршрутів у REST можуть виглядати так:

  • GET /users/123 — отримати дані користувача з ID 123.
  • POST /users — створити користувача.
  • PUT /users/123 — оновити дані користувача.

Кожен тип операції (CRUD) пов'язаний із методами HTTP: GET, POST, PUT, DELETE.

GraphQL принципово інший: це не ресурсно-орієнтований підхід, а мова запитів. Тут у тебе немає маршрутів, а є єдина точка входу (зазвичай /graphql), до якої ти відправляєш запити з описом, які дані хочеш отримати.

Приклад запиту:


query {
  user(id: 123) {
    name
    email
    address {
      street
      city
    }
  }
}

GraphQL дозволяє гнучко вибирати, які поля повертати, мінімізуючи зайві дані.


Порівняння ключових характеристик

1. Обробка запитів

У REST кожен запит жорстко пов'язаний із фіксованою структурою даних. Наприклад, API може повернути всі дані користувача, навіть якщо тобі потрібні тільки name і email.

У GraphQL ти сам формуєш запит і вибираєш, які поля потрібні:

  • REST може повернути "зайві" дані (over-fetching).
  • GraphQL повертає саме те, що ти запросив.

Приклад надмірності:


// Відповідь REST-запиту (GET /users/123)
{
  "id": 123,
  "name": "Іван",
  "email": "ivan@example.com",
  "phone": "123-456-7890",
  "address": {
    "street": "Леніна 10",
    "city": "Москва"
  }
}

// Відповідь GraphQL-запиту query { user(id: 123) { name email } }
{
  "data": {
    "user": {
      "name": "Іван",
      "email": "ivan@example.com"
    }
  }
}

2. Гнучкість і масштабованість

REST добре підходить для монолітних систем: його структура зрозуміла і проста. Однак при роботі з мікросервісами REST може стати вузьким місцем.

Наприклад, якщо клієнту потрібно об'єднати дані з двох мікросервісів, що пропонують різні API:

  • REST вимагатиме кількох послідовних запитів від клієнта.
  • GraphQL дозволяє клієнту агрегувати дані з різних джерел в одному запиті.

Приклад:


query {
  user(id: 123) {
    name
    orders {
      id
      total
    }
  }
}

Цей запит отримає дані про користувача і його замовлення (навіть якщо замовлення знаходяться в іншому мікросервісі).


Переваги та недоліки

REST

Переваги:

  • Простота. REST зрозумілий більшості розробників (ймовірно, ти вже використовував REST).
  • Наявність інструментів, таких як Swagger/OpenAPI, для документування REST API.
  • REST добре справляється з невеликими, фіксованими API і стабільно працює в більшості сценаріїв.

Недоліки:

  • Версіонування: якщо потрібно змінити API, доводиться вводити нові версії (наприклад, /v2/users). Це може ускладнити систему з часом.
  • Over-fetching і under-fetching: REST часто повертає занадто багато або занадто мало даних, що вимагає додаткових запитів.
  • Незручний для мікросервісних систем, де дані часто розкидані між кількома сервісами.

GraphQL

Переваги:

  • Гнучкість: клієнт запитує тільки те, що потрібно.
  • Уніфікація: єдина точка доступу для отримання всіх даних.
  • Чудово працює з мікросервісами: може об'єднувати дані з різних джерел.
  • Строга типізація і зручність розробки: схема GraphQL слугує "контрактом" між клієнтом і сервером.

Недоліки:

  • Складність впровадження: знадобиться більше часу і ресурсів для налаштування GraphQL-сервера та інструментів.
  • Потенційні проблеми з продуктивністю: складні запити можуть навантажувати сервер, якщо не оптимізувати резолвери.
  • Крива навчання для нових розробників, які звикли до REST.

Коли обрати GraphQL, а коли REST?

GraphQL краще підходить для:

  • Клієнтських застосунків з динамічним інтерфейсом. Наприклад, якщо у тебе React/Vue застосунок, який має показувати різні набори даних для різних користувачів.
  • Мікросервісів: GraphQL дозволяє "сховати" складність мікросервісної системи за єдиним фасадом.
  • Складних запитів і об'єднань даних: якщо твій застосунок активно використовує агреговані дані з кількох джерел.

REST краще підходить для:

  • Простих API: наприклад, сервіси, що надають дані, які рідко змінюються.
  • Систем з обмеженими ресурсами: REST простіший і потребує менше обчислювальної потужності для обробки запитів.
  • Сценаріїв кешування: REST API легко кешувати на рівні HTTP (наприклад, за допомогою CDN), чого GraphQL не підтримує "з коробки".

Гібридні архітектури

Як кажуть, навіщо обирати одне, коли можна використовувати обидва? Гібридний підхід — це використання REST і GraphQL в одному проєкті.

Приклад:

  • REST для простих мікросервісів, де дані не вимагають гнучкості.
  • GraphQL як єдиний фасад до складної системи мікросервісів.

Сценарій з реального життя:

Припустимо, у тебе є e-commerce платформа. REST можна використовувати для мікросервісу авторизації (/auth), а GraphQL — для мікросервісу каталогу товарів, де клієнту потрібно вибирати, які дані про товари запитувати.


Потенційні проблеми

REST і GraphQL — обидва можуть створювати проблеми, якщо використовувати їх неправильно. У REST це може бути надмірна або недостатня кількість запитів. У GraphQL — неоптимальні резолвери і занадто складні запити, які можуть перевантажити сервер.


Підсумкова рекомендація

При виборі між REST і GraphQL важливо враховувати потреби твоєї системи. Якщо ти працюєш зі звичною системою або простими мікросервісами, REST може бути відмінним рішенням. Якщо ж твоя система має бути гнучкою, працювати з великими обсягами даних і надавати кастомізовані відповіді, GraphQL стане твоїм новим найкращим другом!

Для додаткової інформації:

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ