web-dev-qa-db-ja.com

モジュラー/拡張可能なSpring Bootアプリケーションを構築する方法は?

Spring boot/Batchアプリケーションを開発しています。

私がやりたいのは、仕事ごとに別々のモジュールを用意することです。異なるタスク(Spring Batch Job)には異なるドメインがあるため、これは合理的な決定です。

私が最初に考えたのは、Mavenをすべてのジョブのモジュールにすることです。次に、Mavenの依存関係をメインプロジェクトに追加して実行するだけです。

このソリューションの問題は、一部のプロジェクトがコンパイルされないか、ユニットテストに失敗した場合、アプリケーション全体もスタックすることです。

理想的には、他のモジュールが独自のCI/CDプロセスを続行できるのに対して、失敗したモジュールはアプリケーションにロードされないようにしたいと思います。

どうすればそれを達成できますか? Java 9このモジューラリティはこの使用例に使用できますか?

ありがとう

2
yaseco

モジュールのライフサイクルが異なる場合、つまり、モジュールが常に同時にリリースされるわけではない場合、またはバグ修正や機能リリースが個別にある場合は、それぞれについて個別のリポジトリを検討する必要があります。基本的に、CI/CDパイプラインがそれぞれに個別にあります。これは、個々のモジュールが互いをブロックすることを回避できる唯一の健全な方法です。

つまり、モジュールに必要なインターフェースを定義する「api」モジュールが1つあることになります(それが何であっても)。このAPIは最小限に抑え、比較的安定した状態に保つ必要があります。これはすべてのモジュールが依存する必要があるだからです。

次に、実際のapplicationが作成されますすべてのモジュールによって異なります。 「プラグイン」の要件が静的である場合、つまり、オンザフライでのリロードや、同じモジュールの複数のバージョンを同時に必要としない場合は、単純なServiceLoaderを使用してください。アプリケーションに、それを介して各モジュールを単にインスタンス化/開始させる。このためのCI/CDパイプラインは、モジュールの新しいバージョン/リリースが利用可能になったときにトリガーされる必要があります。

動的ロード要件がある場合は、OSGiのようなものを使用する必要があります。ただし、すべてが動的であるため、サービスやクラスなどのものがいつでも消える可能性があり、かなり煩わしく安全にコーディングするのが難しいため、非常に複雑になる可能性があります。構造は依然として本質的に同じままです。

注:すべてが1つのチームの手に委ねられている場合は、1つのリポジトリーを用意しようと思います。すべてが同じ場所にあるため、(コンパイル)問題があれば修正するのが簡単になり、個別のリポジトリCI/CDパイプラインやバージョン管理の問題に対処する必要がなくなります。

1