Я создаю API для нескольких клиентов. Подобные основные конечные точки /users
используются каждым клиентом, но некоторые конечные точки зависят от индивидуальных настроек. Таким образом, может случиться так, что пользователь А хочет иметь специальную конечную точку, /groups
и никакой другой клиент не будет иметь эту функцию. Так же, как sidenote , каждый клиент также использовал бы свою собственную схему базы данных из-за этих дополнительных функций.
Я лично использую NestJs (экспресс под капотом). Таким образом, в app.module
настоящее время регистрируются все мои основные модули (со своими конечными точками и т. Д.)
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module'; // core module
@Module({
imports: [UsersModule]
})
export class AppModule {}
Я думаю, что эта проблема не связана с NestJ, так как бы вы справились с этим в теории?
Мне в основном нужна инфраструктура, способная обеспечить базовую систему. Больше нет конечных точек ядра, потому что каждое расширение уникально, и возможны множественные /users
реализации. При разработке новой функции основное приложение не должно касаться. Расширения должны интегрироваться сами или интегрироваться при запуске. Базовая система поставляется без конечных точек, но будет расширена из этих внешних файлов.
Некоторые идеи приходят мне в голову
Первый подход:
Каждое расширение представляет новый репозиторий. Определите путь к пользовательской внешней папке, содержащей все проекты расширений. Этот пользовательский каталог будет содержать папку groups
сgroups.module
import { Module } from '@nestjs/common';
import { GroupsController } from './groups.controller';
@Module({
controllers: [GroupsController],
})
export class GroupsModule {}
Мой API мог бы пройти через этот каталог и попытаться импортировать каждый файл модуля.
плюсы:
- Пользовательский код хранится вдали от основного хранилища.
минусы:
NestJs использует Typescript, поэтому я должен сначала скомпилировать код. Как бы я управлял сборкой API и сборками из пользовательских приложений? (Подключи и играй система)
Пользовательские расширения очень свободны, потому что они просто содержат некоторые машинописные файлы. Из-за того, что они не имеют доступа к каталогу API node_modules, мой редактор покажет мне ошибки, потому что он не может разрешить внешние зависимости пакета.
Некоторые расширения могут получать данные из другого расширения. Возможно, службе групп необходимо получить доступ к службе пользователей. Здесь может быть сложно.
Второй подход. Храните каждое расширение в подпапке папки src API. Но добавьте эту подпапку в файл .gitignore. Теперь вы можете хранить свои расширения внутри API.
плюсы:
Ваш редактор может разрешить зависимости
Перед развертыванием вашего кода вы можете запустить команду сборки и будет иметь один дистрибутив
Вы можете легко получить доступ к другим услугам (
/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. Таким образом, API расширения будет передавать входящие запросы, только если соответствующий секретный ключ предоставлен прокси-сервером.