Câu hỏi Phụ huynh pom và microservices


  • Chúng tôi có một số dự án là microservices, mọi dự án đều độc lập (chạy trên máy chủ khởi động mùa xuân riêng biệt, phơi bày các dịch vụ còn lại, sử dụng lược đồ DB riêng biệt ...)
  • Chúng tôi sử dụng maven để quản lý các phụ thuộc.

Có một ý tưởng tốt để có một pom cha mẹ tuyên bố mỗi microservices như mô-đun? Và do đó giúp quản lý các phụ thuộc chung (như lib servlet-api witch được sử dụng trong mọi dự án, để loại bỏ nó khỏi tất cả chúng và khai báo nó chỉ trong pom cha)


14
2018-01-09 16:45


gốc


Bạn có thể vui lòng chia sẻ một liên kết về cách thiết lập một dự án với Maven và liên quan đến các dịch vụ nhỏ. Tôi có một máy chủ nguyên khối lò xo dựa trên maven mà tôi định di chuyển từ đó. - technazi
không thực sự là một cách cụ thể để tạo dự án maven với các dịch vụ vi mô. Cuối cùng những gì chúng ta có là dự án maven nhỏ, dự án cần: Đưa ra một API (với REST chẳng hạn), có các dịch vụ riêng của mình (được sử dụng như một lớp giữa các bộ điều khiển và các entitite), có lược đồ DB của riêng mình và không chia sẻ nó. Pom không có pom cha mẹ và không tạo dự án pom chia sẻ mà bạn sẽ sử dụng trong các dịch vụ vi mô khác nhau của bạn bởi vì giả sử nhóm A làm việc trên dịch vụ vi A và nhóm B làm việc trên MS B, nếu MS A và MS B sử dụng một dự án chia sẻ, nếu đội A thay đổi nó, đội B sẽ không biết nó - Emilien Brigand


Các câu trả lời:


'Vấn đề' với một pom cha mẹ đa mô-đun là, mà không có hồ sơ phức tạp, nó khóa các mô-đun trong chu kỳ phát hành tương tự (giả sử bạn đang sử dụng Plugin phát hành, bạn nên như thế nào).

Cách tôi làm việc với Maven là có một pom cha mẹ tuyên bố:

  • phụ thuộc chung (API ghi nhật ký, JUnit, v.v.).
  • các plugin phổ biến.
  • tất cả các phụ thuộc trong dependencyManagement phần.
  • tất cả các plugin trong pluginManagement phần.

Mỗi mô-đun delcares cha mẹ pom là cha mẹ của nó, nhưng cha mẹ không biết gì về các mô-đun.

Lợi ích của việc này xuất phát từ lần cuối hai viên đạn ở trên, phần 'quản lý'. Bất cứ điều gì có trong phần 'quản lý' cần được redeclared trong một mô-đun muốn sử dụng một phụ thuộc cụ thể hoặc plugin.

Ví dụ, cha mẹ có thể trông như thế này:

<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>

Và mô-đun có thể trông giống như sau:

<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>

Mô-đun sẽ:

  • có phụ thuộc vào org.slf4j:slf4j-api:1.7.7:compile, junit:junit:4.11:test và commons-lang:commons-lang:2.6:compile.
  • có plugin org.apache.maven.plugins:maven-assembly-plugin:2.4

10
2018-01-09 17:22



Làm thế nào để bạn giải quyết libs khách hàng cho những dịch vụ nhỏ sau đó? - bobK


Tôi sẽ tránh các phụ thuộc trong pom cha mẹ. Thật khó xử nếu một trong các dịch vụ nhỏ (độc lập) của bạn sẽ muốn một số thứ khác. Thật kỳ lạ khi có cha mẹ biết về từng dịch vụ microservice.

Bạn có thể gắn bó với dependencyManagement để đề xuất các phiên bản / phạm vi mặc định nếu bạn muốn. Một pom cha mẹ là, không ít, rất thuận tiện để xác định bổ sung, kho và các loại tương tự.

Thay vào đó, tôi sẽ nhóm một tập hợp các phụ thuộc chung vào một tạo phẩm cụ thể (s), mà có thể chỉ là một pom duy nhất với các phụ thuộc. Sau đó, bạn có thể phụ thuộc vào, nói "com.example / common-db-dependencies / 1.2" để bao gồm một bộ tiêu chuẩn cơ sở dữ liệu phụ thuộc, như hibernate, apache derby và thông số kỹ thuật JPA. (hoặc bất cứ điều gì bạn đang sử dụng). Một dịch vụ không sử dụng JPA / SQL có thể tránh được sự phụ thuộc đó cùng nhau.

Đừng vướng víu. Thật dễ dàng để làm việc quá mức cấu trúc phụ thuộc nếu bạn đang cố gắng để trang trải mỗi trường hợp. Vì vậy, chỉ cố gắng chuẩn hóa những thứ thực sự được sử dụng bởi phần lớn các dịch vụ.


4
2018-01-10 15:56



cuối cùng chúng tôi đã xóa hoàn toàn pom cha mẹ để có một repo git bằng dịch vụ vi mô. Vì vậy, bây giờ mỗi dịch vụ vi mô có vòng đời của riêng mình và nó khá tuyệt vời :) chúng tôi không có một dự án chung để quản lý các phụ thuộc phổ biến, bởi vì nó có thể có nghĩa là chỉ một trong các dịch vụ vi mô cần lên phiên bản của một lib một lib được sử dụng trong các dịch vụ vi mô khác) mà không ảnh hưởng đến các dịch vụ khác .... - Emilien Brigand


Ở đây có một vấn đề với sự phụ thuộc và quản lý phụ thuộc. Giả sử một trong các dịch vụ vi mô của bạn muốn nâng cấp lên phiên bản phổ biến mới hơn vì một số lý do ... bạn không thể làm điều đó khi bạn có cha mẹ. Tôi hiểu sự cám dỗ của việc giảm sự trùng lặp của những thứ thừa như cấu hình plugin. Trong dịch vụ vi mô, chúng tôi cần suy nghĩ thêm về tính độc lập của từng dịch vụ.

Một số cấu hình như nói kho lưu trữ của bạn hoặc cấu hình phát hành vv có thể là phổ biến.


1
2018-04-23 11:00