Я створюю API для кількох клієнтів. Основні кінцеві точки, як-от /users
, використовує кожен клієнт, але деякі кінцеві точки покладаються на індивідуальне налаштування. Тому може бути, що користувач A хоче спеціальну кінцеву точку, /groups
і жоден інший клієнт не матиме цієї функції. Як і сторонне позначення , кожен клієнт також використовував би свою власну схему баз даних через ці додаткові можливості.
Я особисто використовую NestJs (Експрес під капотом). Таким чином, в app.module
даний час реєструються всі мої основні модулі (з власними кінцевими точками тощо)
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module'; // core module
@Module({
imports: [UsersModule]
})
export class AppModule {}
Я думаю, що ця проблема не пов'язана з NestJs, так як би ви впоралися з цим теоретично?
Мені в основному потрібна інфраструктура, яка здатна забезпечити базову систему. Більше немає основних кінцевих точок, тому що кожне розширення є унікальним і /users
можливі кілька реалізацій. При розробці нової функції до основної програми не слід торкатися. Розширення повинні інтегруватися самі або повинні бути інтегровані при запуску. Основна система постачається без кінцевих точок, але буде виведена з цих зовнішніх файлів.
Деякі ідеї приходять мені в голову
Перший підхід:
Кожне розширення являє собою новий сховище. Визначте шлях до власної зовнішньої папки, де містяться всі проекти, що розширюються. Цей спеціальний каталог міститиме папку groups
зgroups.module
import { Module } from '@nestjs/common';
import { GroupsController } from './groups.controller';
@Module({
controllers: [GroupsController],
})
export class GroupsModule {}
Мій API міг переглядати цей каталог і намагатися імпортувати кожен файл модуля.
плюси:
- Спеціальний код зберігається подалі від основного сховища
мінуси:
NestJs використовує Typescript, тому я повинен спершу скомпілювати код. Як я можу керувати збіркою API та збірок за допомогою спеціальних програм? (Plug and play system)
Спеціальні розширення дуже вільні, оскільки вони просто містять деякі файли машинописів. Через те, що вони не мають доступу до каталогу node_modules API, мій редактор покаже мені помилки, оскільки він не може вирішити залежність від зовнішніх пакетів.
Деякі розширення можуть отримати дані з іншого розширення. Можливо, службі груп потрібно отримати доступ до служби користувачів. Тут може скластись складність.
Другий підхід: зберігайте кожне розширення всередині підпапки src-папки API. Але додайте цю підпапку у файл .gitignore. Тепер ви можете зберігати розширення всередині API.
плюси:
Ваш редактор здатний вирішити залежності
Перед розгортанням коду ви можете запустити команду build і матимете єдиний дистрибутив
Ви можете легко отримати доступ до інших служб (
/groups
потрібно знайти користувача за ідентифікатором)
мінуси:
- Під час розробки вам потрібно скопіювати файли репозиторію всередині цієї папки. Після чого щось змінити, вам доведеться скопіювати ці файли назад і замінити файли сховища оновленими.
Третій підхід:
Всередині зовнішньої спеціальної папки всі розширення є повноцінними автономними API. Ваш основний API просто надасть інформацію про аутентифікацію та може діяти як проксі для перенаправлення вхідних запитів на цільовий API.
плюси:
- Нові розширення можна легко розробити та протестувати
мінуси:
Розгортання буде складним. У вас буде основний API та n API розширень, які починають власний процес і слухають порт.
Система проксі може бути складною. Якщо клієнт вимагає,
/users
щоб проксі-сервер повинен знати, яке розширення API прослуховує для цієї кінцевої точки, викликає цей API і пересилає цю відповідь клієнту.Для захисту API розширень (автентифікацією керує основний API) проксі-сервер повинен поділитися секретом з цими API. Тож API розширення передаватиме вхідні запити лише у тому випадку, якщо ця відповідна таємниця надана від проксі.
Четвертий підхід:
Мікросервіси можуть допомогти. Я взяв посібник звідси https://docs.nestjs.com/microservices/basics
Я міг би мати мікросервіс для управління користувачами, управління групами тощо і споживати ці послуги, створивши невеликий api / шлюз / проксі, який викликає ці мікросервіси.
плюси:
Нові розширення можна легко розробити та протестувати
Окремі проблеми
мінуси:
Розгортання буде складним. У вас буде основний API і n мікросервісів, які починають свій процес і слухають порт.
Здається, що мені доведеться створити новий інтерфейс шлюзу для кожного клієнта, якщо я хочу його налаштувати. Отже, замість розширення програми, мені доведеться створювати індивідуальний інтерфейс API щоразу. Це не вирішило б проблему.
Для захисту API розширень (автентифікацією керує основний API) проксі-сервер повинен поділитися секретом з цими API. Тож API розширення передаватиме вхідні запити лише у тому випадку, якщо ця відповідна таємниця надана від проксі.