Sto creando un'API per più clienti. Gli endpoint di base come /users
vengono utilizzati da ogni cliente, ma alcuni endpoint si basano sulla personalizzazione individuale. Quindi potrebbe essere che l' utente A desideri un endpoint speciale /groups
e nessun altro cliente avrà quella funzionalità. Proprio come un sidenote , ogni cliente userebbe anche il proprio schema di database a causa di quelle funzionalità extra.
Personalmente uso NestJs (Express sotto il cofano). Quindi app.module
attualmente registra tutti i miei moduli core (con i loro endpoint ecc.)
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module'; // core module
@Module({
imports: [UsersModule]
})
export class AppModule {}
Penso che questo problema non sia correlato a NestJs, quindi come lo gestiresti in teoria?
Fondamentalmente ho bisogno di un'infrastruttura in grado di fornire un sistema di base. Non ci sono più endpoint principali perché ogni estensione è unica e /users
potrebbero essere possibili più implementazioni. Quando si sviluppa una nuova funzionalità, l'applicazione principale non deve essere toccata. Le estensioni dovrebbero integrarsi o dovrebbero essere integrate all'avvio. Il sistema principale viene fornito senza endpoint ma verrà esteso da quei file esterni.
Alcune idee mi vengono in mente
Primo approccio:
Ogni estensione rappresenta un nuovo repository. Definire un percorso per una cartella esterna personalizzata contenente tutti i progetti di estensione. Questa directory personalizzata conterrebbe una cartella groups
con agroups.module
import { Module } from '@nestjs/common';
import { GroupsController } from './groups.controller';
@Module({
controllers: [GroupsController],
})
export class GroupsModule {}
La mia API potrebbe scorrere attraverso quella directory e provare a importare ciascun file del modulo.
professionisti:
- Il codice personalizzato è tenuto lontano dal repository principale
contro:
NestJs usa Typescript, quindi devo prima compilare il codice. Come gestirò la build dell'API e le build dalle app personalizzate? (Sistema plug and play)
Le estensioni personalizzate sono molto lente perché contengono solo alcuni file dattiloscritti. A causa del fatto che non hanno accesso alla directory node_modules dell'API, il mio editor mi mostrerà errori perché non è in grado di risolvere le dipendenze dei pacchetti esterni.
Alcune estensioni potrebbero recuperare dati da un'altra estensione. Forse il servizio gruppi deve accedere al servizio utenti. Le cose potrebbero diventare complicate qui.
Secondo approccio: mantenere ogni estensione all'interno di una sottocartella della cartella src dell'API. Ma aggiungi questa sottocartella al file .gitignore. Ora puoi mantenere le tue estensioni all'interno dell'API.
professionisti:
Il tuo editor è in grado di risolvere le dipendenze
Prima di distribuire il codice è possibile eseguire il comando build e disporre di un'unica distribuzione
Puoi accedere facilmente ad altri servizi (devi
/groups
trovare un utente per ID)
contro:
- Durante lo sviluppo è necessario copiare i file del repository all'interno di quella sottocartella. Dopo aver modificato qualcosa, è necessario copiare nuovamente questi file e sovrascrivere i file del repository con quelli aggiornati.
Terzo approccio:
All'interno di una cartella personalizzata esterna, tutte le estensioni sono API standalone complete. L'API principale fornirebbe semplicemente le informazioni di autenticazione e potrebbe fungere da proxy per reindirizzare le richieste in arrivo all'API di destinazione.
professionisti:
- Le nuove estensioni possono essere sviluppate e testate facilmente
contro:
La distribuzione sarà complicata. Avrai un'API principale e n API di estensione che iniziano il loro processo e ascoltano una porta.
Il sistema proxy potrebbe essere complicato. Se il client richiede
/users
al proxy di sapere quale API dell'estensione è in ascolto per quell'endpoint, richiama tale API e inoltra la risposta al client.Per proteggere le API di estensione (l'autenticazione è gestita dall'API principale) il proxy deve condividere un segreto con tali API. Quindi l'API di estensione passerà le richieste in arrivo solo se quel proxy corrispondente viene fornito dal proxy.
Quarto approccio:
I microservizi potrebbero aiutare. Ho preso una guida da qui https://docs.nestjs.com/microservices/basics
Potrei avere un microservizio per la gestione degli utenti, la gestione dei gruppi ecc. E consumare quei servizi creando un piccolo API / gateway / proxy che chiama quei microservizi.
professionisti:
Le nuove estensioni possono essere sviluppate e testate facilmente
Preoccupazioni separate
contro:
La distribuzione sarà complicata. Avrai un'API principale e n microservizi che iniziano il loro processo e ascoltano una porta.
Sembra che dovrei creare un nuovo gateway API per ogni cliente se voglio averlo personalizzabile. Quindi, invece di estendere un'applicazione, dovrei creare ogni volta un'API di comsuming personalizzata. Ciò non risolverebbe il problema.
Per proteggere le API di estensione (l'autenticazione è gestita dall'API principale) il proxy deve condividere un segreto con tali API. Quindi l'API di estensione passerà le richieste in arrivo solo se quel proxy corrispondente viene fornito dal proxy.