Шлюз (шаблон проєктування)
![]() | Ця стаття не має інтервікі-посилань. |
Шлюз (англ. Gateway) — шаблон проєктування, який інкапсулює доступ до зовнішнього ресурсу.
Часто при взаємодії із зовнішніми ресурсами використовується API. Але будь-який API написаний таким чином, що розкриває структуру самого ресурсу, будь то SQL до реляційних баз даних, або ж JSON чи XAML, тощо. Змішуючи різні API програмний код стає заплутанішим та важче піддається змінам.
У широкому розумінні шлюз є об'єктом, що приховує різноманітні API та уніфіковує доступ до ресурсів.
![](https://cdn.statically.io/img/upload.wikimedia.org/wikipedia/uk/f/f2/%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4_%D0%B2%D0%B7%D0%B0%D1%94%D0%BC%D0%BE%D0%B4%D1%96%D1%97_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%96%D0%B2_%D0%BF%D1%80%D0%B8_%D1%80%D0%B5%D0%B0%D0%BB%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_%D1%88%D0%BB%D1%8E%D0%B7%D1%83.png)
Цей шаблон не без причин набув великої популярності при реалізації мікросервісної архітектури. При наявності декількох сервісів клієнту необхідно взаємодіяти із ними усіма. Конфігурація клієнтів ускладнюється ще й тим, що API різних сервісів може відрізнятись.
![](https://cdn.statically.io/img/upload.wikimedia.org/wikipedia/uk/b/bd/%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4_%D0%B2%D0%B7%D0%B0%D1%94%D0%BC%D0%BE%D0%B4%D1%96%D1%97_%D0%BC%D1%96%D0%B6_%D0%BA%D0%BB%D1%96%D1%94%D0%BD%D1%82%D0%BE%D0%BC_%D1%82%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%BC_%D0%B1%D0%B5%D0%B7_%D1%80%D0%B5%D0%B0%D0%BB%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_API_Gateway_%D1%82%D0%B0_%D0%B7_%D0%BD%D0%B8%D0%BC.png)
Використання шлюзу у цьому випадку надає декілька переваг:
- Спрощується налаштування клієнта, конфігурацію залишаються на стороні сервера
- Для клієнта робота із системою виглядає так ніби відбувається взаємодія з одним компонентом, а не багатьма. Таким чином серверна частина має єдину точку взаємодії
- Клієнт не знає про внутрішню архітектуру та взаємодію системи. Gateway передає дані тому сервісу, який їх потребує по вірному каналу зв’язку
- Зміни розташування сервісів залишаються непомітними для клієнта
- Більше не потрібно реалізовувати логіку автентифікації для кожного сервісу, її може виконувати шлюз
- Зменшує кількість запитів та навантаження, оскільки дозволяє зібрати дані із декількох сервісів та об'єднати їх у потрібний для клієнта формат
При цьому не варто забувати про недоліки такого підходу:
- Наявність ще одного сервісу, який необхідно підтримувати
- Збільшується час відгуку через те, що кожний запит проходить через шлюз
Одною із різновидностей цього шаблону є Backends for frontends (BFF). Оскільки різні клієнти можуть потребувати різний API для своєї роботи, варто виокремити специфічну логіку в окремі сервіси.
![](https://cdn.statically.io/img/upload.wikimedia.org/wikipedia/uk/7/79/%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4_%D0%B2%D0%B7%D0%B0%D1%94%D0%BC%D0%BE%D0%B4%D1%96%D1%97_%D0%BC%D1%96%D0%B6_%D0%BA%D0%BB%D1%96%D1%94%D0%BD%D1%82%D0%BE%D0%BC_%D1%82%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%BC_%D0%BF%D1%80%D0%B8_%D1%80%D0%B5%D0%B0%D0%BB%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_Backends_for_frontends.png)
- Прикладний програмний інтерфейс
- Адаптер (шаблон проєктування)
- Замісник (шаблон проєктування)
- Фасад (шаблон проєктування)
- Мікросервіси
- Front end та back end
- Gateway [Архівовано 16 листопада 2020 у Wayback Machine.]
- API Gateway [Архівовано 8 листопада 2020 у Wayback Machine.]
- Застосування API Gateway [Архівовано 15 листопада 2020 у Wayback Machine.]