複数のお客様向けのAPIを作成しています。のようなコアエンドポイント/users
はすべてのお客様が使用しますが、一部のエンドポイントは個別のカスタマイズに依存しています。したがって、ユーザーAが特別なエンドポイントを必要/groups
としており、他の顧客がその機能を持たない可能性があります。補足として、これらの追加機能のために、各顧客は自分のデータベーススキーマも使用します。
私は個人的にNestJ(内部ではExpress)を使用しています。したがって、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ビルドとカスタムアプリからのビルドをどのように管理しますか?(プラグアンドプレイシステム)
カスタム拡張機能には、いくつかのtypescriptファイルが含まれているだけなので、非常に緩いです。APIのnode_modulesディレクトリにアクセスできないため、外部パッケージの依存関係を解決できないため、エディターにエラーが表示されます。
一部の拡張機能は、別の拡張機能からデータをフェッチする場合があります。おそらく、グループサービスがユーザーサービスにアクセスする必要があります。物事はここでトリッキーになるかもしれません。
2番目のアプローチ: 各拡張機能をAPIのsrcフォルダーのサブフォルダー内に保持します。ただし、このサブフォルダーを.gitignoreファイルに追加します。これで、拡張機能をAPI内に保持できます。
長所:
エディターは依存関係を解決できます
コードをデプロイする前に、ビルドコマンドを実行すると、単一のディストリビューションが作成されます
他のサービスに簡単にアクセスできます(
/groups
IDでユーザーを検索する必要があります)
短所:
- 開発時には、そのサブフォルダ内にリポジトリファイルをコピーする必要があります。何かを変更した後、これらのファイルをコピーして、リポジトリファイルを更新したファイルで上書きする必要があります。
3番目のアプローチ:
外部カスタムフォルダー内では、すべての拡張機能が完全に独立したスタンドアロンAPIです。あなたのメインAPIは認証を提供するだけで、着信リクエストをターゲットAPIにリダイレクトするプロキシとして機能することができます。
長所:
- 新しい拡張機能を簡単に開発およびテストできます
短所:
展開は注意が必要です。メインAPIとn個の拡張APIが独自のプロセスを開始し、ポートをリッスンします。
プロキシシステムは注意が必要です。クライアントが
/users
プロキシにリクエストする場合、プロキシはそのエンドポイントをリッスンする拡張機能APIを認識する必要があります。そのAPIを呼び出し、その応答をクライアントに転送します。拡張APIを保護するには(認証はメインAPIによって処理されます)、プロキシはこれらのAPIとシークレットを共有する必要があります。そのため、拡張APIは、一致するシークレットがプロキシから提供された場合にのみ、着信リクエストを渡します。
4番目のアプローチ:
マイクロサービスが役立つかもしれません。私はここからガイドを取りましたhttps://docs.nestjs.com/microservices/basics
ユーザー管理、グループ管理などのためのマイクロサービスを用意し、それらのマイクロサービスを呼び出す小さなapi /ゲートウェイ/プロキシを作成することで、これらのサービスを利用できます。
長所:
新しい拡張機能を簡単に開発およびテストできます
分離された懸念
短所:
展開は注意が必要です。メインAPIとn個のマイクロサービスが独自のプロセスを開始し、ポートをリッスンします。
カスタマイズ可能にしたい場合は、顧客ごとに新しいゲートウェイAPIを作成する必要があるようです。したがって、アプリケーションを拡張する代わりに、毎回カスタマイズされたコンシューミングAPIを作成する必要があります。それは問題を解決しません。
拡張APIを保護するには(認証はメインAPIによって処理されます)、プロキシはこれらのAPIとシークレットを共有する必要があります。そのため、拡張APIは、一致するシークレットがプロキシから提供された場合にのみ、着信リクエストを渡します。