web-dev-qa-db-ja.com

親のpomとマイクロサービス

  • マイクロサービスであるいくつかのプロジェクトがあり、すべてのプロジェクトは独立しています(別々のSpring Bootサーバーで実行され、残りのサービスを公開し、別々のDBスキーマを使用しています...)
  • Mavenを使用して依存関係を管理します。

親pomに各マイクロサービスをモジュールとして宣言させるのは良い考えですか?そのため、一般的な依存関係の管理を支援します(libサーブレットのように-api witchはすべてのプロジェクトで使用され、すべての依存関係を削除して、親pomでのみ宣言します)

23
Emilien Brigand

マルチモジュールの親pomの「問題」は、複雑なプロファイルがないと、同じリリースサイクルでモジュールがロックされることです( リリースプラグイン を使用していると仮定します)。

私がMavenを操作する方法は、次のように宣言する親pomを用意することです。

  • 一般的な依存関係(ロギングAPI、JUnitなど)。
  • 一般的なプラグイン。
  • dependencyManagement セクションのすべての依存関係。
  • pluginManagement セクションのすべてのプラグイン。

各モジュールは親pomを親として削除しますが、親はモジュールについて何も知りません。

これの利点は、上記の最後から2つの箇条書き、「管理」セクションにあります。 'management'セクションに含まれるものはすべて、特定の依存関係またはプラグインを使用するモジュールで再宣言する必要があります。

たとえば、親は次のようになります。

<project>

  <groupId>com.example</groupId>
  <artifactId>parent</artifactId>
  <version>1.0.00-SNAPSHOT</version>

  ...

  <dependencies>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.7</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>            

  </dependencies>

  <dependencyManagement>

    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.6</version>
    </dependency>        

    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>2.1</version>
    </dependency>

  </dependencyManagement>

  <plugins>

    <plugin>
      <groupId>org.Apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.1</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>

  <plugins>

  <pluginManagement>

    <plugins>

      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-Assembly-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <appendAssemblyId>false</appendAssemblyId>
          <descriptors>
            <descriptor>src/main/Assembly/assembly.xml</descriptor>
          </descriptors>
        </configuration>
        <executions>
          <execution>
            <id>make-Assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

    </plugins>

  </pluginManagement>

</project>

そして、モジュールは次のようになります。

<project>

  <parent>
    <groupId>com.example</groupId>
    <artifactId>parent</artifactId>
    <version>1.0.00-SNAPSHOT</version>
  </parent>

  <groupId>com.example</groupId>
  <artifactId>module</artifactId>
  <version>1.0.00-SNAPSHOT</version>

  <dependencies>

    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>          
    </dependency>        

  </dependencies>

  <plugins>

    <plugin>
      <groupId>org.Apache.maven.plugins</groupId>
      <artifactId>maven-Assembly-plugin</artifactId>
    </plugin>

  </plugins>

</project>

モジュールは次のようになります。

  • org.slf4j:slf4j-api:1.7.7:compilejunit:junit:4.11:test、およびcommons-lang:commons-lang:2.6:compileに依存します。
  • プラグインがありますorg.Apache.maven.plugins:maven-Assembly-plugin:2.4
12
Nick Holt

親pomの依存関係を避けます。あなたの(独立した)マイクロサービスの1つが他の何かを欲しがるのは厄介です。親に各マイクロサービスを知ってもらうのは奇妙です。

必要に応じて、dependencyManagementを使用して、デフォルトのバージョン/スコープを提案することもできます。親pomは、プラグインやリポジトリなどを定義するのに非常に便利です。

代わりに、依存関係の一般的なセットを特定のアーティファクトにグループ化します。これは、依存関係を持つ単一のpomのみである可能性があります。次に、たとえば「com.example/common-db-dependencies/1.2」に依存して、Hibernate、Apache derby、JPA仕様などのデータベース依存関係の標準セットを含めることができます。 (または使用しているものは何でも)。サービスがJPA/SQLを使用しない場合、その依存関係をすべて一緒に回避できます。

ただし、絡まないでください。それぞれのケースをカバーしようとすると、依存関係の構造を酷使するのは簡単です。したがって、大多数のサービスで実際に使用されるものだけを標準化するようにしてください。

6

ここで、依存関係と依存関係の管理に関する1つの問題があります。マイクロサービスの1つが、何らかの理由で新しいバージョンのcommonにアップグレードしたいとします...親がいるため、アップグレードできません。プラグイン構成のような冗長なものの重複を減らしたいという誘惑を理解しています。マイクロサービスでは、各サービスの独立性についてもっと考える必要があります。

リポジトリやリリース構成などのようないくつかの構成は一般的です。

4
Jigar Shah

マイクロサービスアーキテクチャに関するほとんどの本は、原則として自律性を推奨しています。親pomを使用すると、その原則に違反します。

まず、親pomを使用すると、多言語アプローチを採用して、マイクロサービスをさまざまな言語で作成することができなくなります。

また、特にエンフォーサープラグインが使用されている場合は、親によって指定された依存関係を使用する必要があります。

マイクロサービスは、独立してデプロイできなくなります。

また、あるマイクロサービスでの作業に親の変更が含まれる場合、その作業が他のマイクロサービスを壊す可能性があるというリスクもあります。

0
Johnny Alpha

私は間違いなく親プロジェクトを使用します。

私は何年もの間、両方の構造で作業してきました...マイクロサービスであり、モジュール式であるかどうかにかかわらず、Ant、Maven、Gradleです。

親pomを使用することは、結合されて独立していないマイクロサービスについて話すことを意味しないことを理解する必要があります。

  • それらはまだ独立していて、親pomを使用して結合されていない可能性があります。
  • 親pomを使用している場合でも、リリースをビルドして個別に更新することができます。

「マイクロサービスは依存関係に異なるバージョンを使用する必要があるかもしれません」と聞いたことがありますが、特定のマイクロサービスpomの依存関係をオーバーライドするだけです。

「ここには何がありますか利点そして何が短所 "に焦点を当てる必要があります:

  • 制御と標準化:共通の依存関係を(依存関係管理を使用して)単一のポイントで管理できます。すべてのモジュールに依存関係の変更を簡単に展開できます。はい、異なるサードパーティバージョンが必要になる場合があります。しかし同時に、すべての依存関係の制御を失うことを回避する必要があるため、例外は許可される可能性がありますが、それらは「標準化」とバランスを取る必要があります
  • グループ管理:モジュールを1つだけリリースできますが、モジュールごとにリリースすることなく、複数のモジュールのリリースを簡単に管理することもできますが、開発中のモジュールはこの場合、私はまだ単一のエントリポイントを持っており、すべての一般的な依存関係は親との概要である可能性があります

そしてはるかに:

  • 一般的なサードパーティとプラットフォームの依存関係の管理
  • 一般的なサードパーティとプラットフォームの標準化
  • アプリケーション全体を使用した依存関係エコシステムの完全な制御(マイクロサービスで構造化)
  • 一般的なプラグインの管理と標準化
  • 重複と冗長なロジックを減らします。
  • 構成管理と標準化
  • メンテナンスが簡単、30か所ではなく1か所で交換!!
  • 一般的な変更のテストと展開が簡単になります。

短所はどうですか?特定のマイクロサービスpomの一般的な動作をオーバーライドすることで例外を管理できるため、現時点では何も表示されません。それでも、何でも分離して管理できます(分離してビルド、リリース単独で、単独でデプロイします。)結合されたものはありません

同じリリースサイクルでモジュールをロックします」の意味はまだわかりません。外部SNAPSHOTを使用していない限り、同じ親バージョンを再利用してマイクロサービスを分離してリリースできます。 。

たとえば、モジュール1でParent 1.0を宣言し、親からリリースプロセスを実行せずに単独でリリースすることができます。サブモジュールで直接実行できますが、サブモジュールプロジェクト内で外部SNAPSHOTを宣言する必要はありません(親の有無にかかわらず同じ問題が発生します)

0
ivoruJavaBoy