Configuration principale :
<build> <finalName>${project.artifactId}</finalName> <!-- 特别注意: 项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。 但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目 --> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
Sortie de configuration :
cd package-optimize-level0 mvn clean install ls -lh package-optimize-app1/target/package-optimize-app1.jar -rw-r--r-- 1 lixia wheel 16M Feb 24 21:06 package-optimize-app1/target/package-optimize-app1.jar java -jar package-optimize-app1/target/package-optimize-app1.jar
Notes clés :
(L'application de démonstration actuelle ne repose que sur spring-boot-starter-web, très peu de composants, et toutes les sorties de build sont seulement environ une douzaine de Mo) Dans les situations réelles, le pot de sortie d'une seule version dépend de la quantité de composants dépendants du projet, allant généralement de dizaines de Mo à un ou deux cents Mo ou même plus.
Si vous devez déployer une dizaine de microservices, vous devrez transférer plusieurs Go de fichiers, ce qui prendra beaucoup de temps. Même une seule mise à jour d'un microservice individuel nécessite le transfert de cent à deux cents Mo.
Niveau 1 : Méthode de construction de séparation des jars de dépendances communes
Répertoire du projet de référence : package-optimize-level1
Résolution de problèmes hors :
Réduire la taille du fichier d'un seul jar de microservice pour faciliter le déploiement Le processus de transfert de fichiers prend quelques secondes. Configuration principale :
Pour les instructions de configuration clés, veuillez consulter les notes suivantes pour plus de détails :
<build> <finalName>${project.artifactId}</finalName> <!-- 特别注意: 项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。 但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目 --> <plugins> <!-- 拷贝项目所有依赖jar文件到构建lib目录下 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <excludeTransitive>false</excludeTransitive> <stripVersion>false</stripVersion> <silent>true</silent> </configuration> </execution> </executions> </plugin> <!-- Spring Boot模块jar构建 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includes> <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar --> <include> <groupId>null</groupId> <artifactId>null</artifactId> </include> </includes> <layout>ZIP</layout> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Sortie de configuration :
cd package-optimize-level1 mvn clean install ls -lh package-optimize-app1/target/package-optimize-app1.jar -rw-r--r-- 1 lixia wheel 149K Feb 24 20:56 package-optimize-app1/target/package-optimize-app1.jar java -jar -Djava.ext.dirs=lib package-optimize-app1/target/package-optimize-app1.jar
Effet de réussite :
Une seule version ne génère généralement que des fichiers jar basés sur sur la quantité de composants dépendants du projet. Avec un ou deux cents Ko, il peut être transféré en quelques secondes.
C'est la solution d'optimisation la plus courante vue sur Internet, et elle mérite d'être explorée plus en détail : s'il existe une douzaine de microservices, chaque service possède un fichier jar et un fichier répertoire lib, le premier déploiement nécessitera presque le transfert de un ou deux Go de fichiers.
Niveau 2 : Fusionner tous les fichiers jar dépendants du module dans le même répertoire lib
Répertoire du projet de référence : package-optimize-level2
Résoudre le problème :
Fusionner tous les fichiers jar dépendants du module dans le même lib, généralement parce que chaque projet de module repose sur un degré élevé de fichiers JAR qui se chevauchent, la taille totale de tous les fichiers de déploiement de services combinés est en gros de deux à trois cents Mo
. Cependant, si -Djava.ext.dirs=lib est. utilisé pour charger tous les jars dans chaque JVM, premièrement, chaque JVM charge complètement tous les jars et consomme des ressources. Deuxièmement, différentes versions de chaque composant du microservice provoqueront des conflits de versions. veuillez consulter les notes suivantes pour plus de détails :
<build> <finalName>${project.artifactId}</finalName> <!-- 特别注意: 项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。 但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目 --> <plugins> <!-- 基于maven-jar-plugin插件实现把依赖jar定义写入输出jar的META-INFO/MANIFEST文件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <useUniqueVersions>false</useUniqueVersions> </manifest> </archive> </configuration> </plugin> <!-- 拷贝项目所有依赖jar文件到构建lib目录下 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- 各子模块按照实际层级定义各模块对应的属性值,检查所有微服务模块依赖jar文件合并复制到同一个目录 详见各子模块中 boot-jar-output 属性定义 --> <outputDirectory>${boot-jar-output}/lib</outputDirectory> <excludeTransitive>false</excludeTransitive> <stripVersion>false</stripVersion> <silent>false</silent> </configuration> </execution> </executions> </plugin> <!-- Spring Boot模块jar构建 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includes> <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar --> <include> <groupId>null</groupId> <artifactId>null</artifactId> </include> </includes> <layout>ZIP</layout> <!-- 基于maven-jar-plugin输出微服务jar文件进行二次spring boot重新打包文件的输出目录 所有微服务构建输出jar文件统一输出到与lib同一个目录,便于共同引用同一个lib目录 详见各子模块中boot-jar-output属性定义 --> <!-- --> <outputDirectory>${boot-jar-output}</outputDirectory> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Le fichier META-INFO/MANIFEST dans le fichier jar du microservice générera l'attribut Class-Path basé sur la liste des composants dépendants du module, évitant ainsi différentes versions de jar : Class-Path: lib/spring-boot-starter-web-2.4.3.jar lib/spring-boot-starte
r-2.4.3.jar lib/spring-boot-2.4.3.jar lib/spring-boot-autoconfigure-2.4
.3.jar lib/spring-boot-starter-logging-2.4.3.jar lib/logback-classic-1.
2.3.jar lib/logback-core-1.2.3.jar lib/slf4j-api-1.7.30.jar lib/log4j-t
o-slf4j-2.13.3.jar lib/log4j-api-2.13.3.jar lib/jul-to-slf4j-1.7.30.jar
lib/jakarta.annotation-api-1.3.5.jar lib/spring-core-5.3.4.jar lib/spr
ing-jcl-5.3.4.jar lib/snakeyaml-1.27.jar lib/spring-boot-starter-json-2
.4.3.jar lib/jackson-databind-2.11.4.jar lib/jackson-annotations-2.11.4
.jar lib/jackson-core-2.11.4.jar lib/jackson-datatype-jdk8-2.11.4.jar l
ib/jackson-datatype-jsr310-2.11.4.jar lib/jackson-module-parameter-name
s-2.11.4.jar lib/spring-boot-starter-tomcat-2.4.3.jar lib/tomcat-embed-
core-9.0.43.jar lib/jakarta.el-3.0.3.jar lib/tomcat-embed-websocket-9.0
.43.jar lib/spring-web-5.3.4.jar lib/spring-beans-5.3.4.jar lib/spring-
webmvc-5.3.4.jar lib/spring-aop-5.3.4.jar lib/spring-context-5.3.4.jar
lib/spring-expression-5.3.4.jar
cd package-optimize-level2 mvn clean install ls -lh devops/ total 912 drwxr-xr-x 34 lixia wheel 1.1K Feb 24 22:27 lib -rw-r--r-- 1 lixia wheel 150K Feb 24 22:31 package-optimize-app1.jar -rw-r--r-- 1 lixia wheel 149K Feb 24 22:31 package-optimize-app2.jar -rw-r--r-- 1 lixia wheel 149K Feb 24 22:31 package-optimize-app3.jar java -jar devops/package-optimize-app1.jarEffet de réussite :
Le processus de démarrage ne nécessite plus la définition du paramètre -Djava.ext.dirs=lib.
Tous les fichiers jar du microservice font référence au répertoire commun de tous les composants dépendants fusionnés du projet. La taille totale du fichier de déploiement est généralement de deux à trois cents Mo.
En personnalisant le chemin de classe dans le fichier META-INFO/MANIFEST de chaque fichier jar du microservice pour indiquer clairement la classe de composant de version dépendante, le problème des conflits de versions de composants différents dans chaque microservice peut être résolu.
Répertoire du projet de référence : package-optimize-level3
Certains composants tiers non officiels tels que sdk jar, une façon consiste à le soumettre au serveur privé local Maven pour référence, ce qui est identique au traitement jar dépendant ordinaire, mais en l'absence d'un serveur privé maven, une approche simplifiée courante consiste à placer directement le jar dépendant dans ; le projet, puis utilisez la portée du système dans la définition de la manière pom.
Pour le composant maven-jar-plugin qui est introduit dans le pom via systemPath, le composant maven-jar-plugin n'a pas de paramètres directs pour déclarer les composants contenant la portée spécifiée si aucun traitement spécial n'est effectué, ces portées. Les composants définis n'apparaîtront pas dans META-INFO/MANIFEST , ce qui empêchera la classe d'exécution d'être trouvée.
Veuillez vous référer aux notes suivantes pour les instructions de configuration clés :
<build> <finalName>${project.artifactId}</finalName> <!-- 特别注意: 项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。 但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目 --> <plugins> <!-- 基于maven-jar-plugin插件实现把依赖jar定义写入输出jar的META-INFO/MANIFEST文件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <useUniqueVersions>false</useUniqueVersions> </manifest> <manifestEntries> <!-- 有些非官方三方的诸如sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件 通过使用额外定义 Class-Path 值来追加指定依赖组件列表,在子模块按实际情况指定 jar-manifestEntries-classpath 值即可 例如(注意前面个点字符及各空格分隔符):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar 详见各子模块中 boot-jar-output 属性定义示例 --> <Class-Path>${jar-manifestEntries-classpath}</Class-Path> </manifestEntries> </archive> </configuration> </plugin> <!-- 拷贝项目所有依赖jar文件到构建lib目录下 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- 各子模块按照实际层级定义各模块对应的属性值,检查所有微服务模块依赖jar文件合并复制到同一个目录 详见各子模块中 boot-jar-output 属性定义 --> <outputDirectory>${boot-jar-output}/lib</outputDirectory> <excludeTransitive>false</excludeTransitive> <stripVersion>false</stripVersion> <silent>false</silent> </configuration> </execution> </executions> </plugin> <!-- Spring Boot模块jar构建 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includes> <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar --> <include> <groupId>null</groupId> <artifactId>null</artifactId> </include> </includes> <layout>ZIP</layout> <!-- 基于maven-jar-plugin输出微服务jar文件进行二次spring boot重新打包文件的输出目录 所有微服务构建输出jar文件统一输出到与lib同一个目录,便于共同引用同一个lib目录 详见各子模块中boot-jar-output属性定义 --> <!-- --> <outputDirectory>${boot-jar-output}</outputDirectory> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
<properties> <!-- 按各模块实际目录层次定义相对数据,使所有服务模块输出资源汇聚到相同目录 --> <boot-jar-output>../devops</boot-jar-output> <!-- 有些供应商的sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件 通过使用额外定义 Class-Path 值来追加指定依赖组件列表,按实际情况指定 jar-manifestEntries-classpath 值即可 例如(注意前面个点字符及各空格分隔符,lib后面部分是 artifactId-version.jar 格式而不是实际文件名):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar --> <jar-manifestEntries-classpath>. lib/hik-sdk-1.0.0.jar</jar-manifestEntries-classpath> </properties> <dependencies> <!-- 以相对路径方式定义非官方三方依赖组件 --> <dependency> <groupId>com.hik</groupId> <artifactId>hik-sdk</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/hik-sdk-1.0.0.jar</systemPath> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
Le fichier META-INFO/MANIFEST dans le fichier jar de sortie du microservice générera le module selon le module Pour l'attribut Class-Path de la liste des composants dépendants, la valeur de définition de l'attribut jar-manifestEntries-classpath sera ajoutée au début : Class-Path: . lib/hik-sdk-1.0.0.jar lib/spring-boot-starter-web-2.4.3.ja
r lib/spring-boot-starter-2.4.3.jar lib/spring-boot-2.4.3.jar lib/sprin
g-boot-autoconfigure-2.4.3.jar lib/spring-boot-starter-logging-2.4.3.ja
r lib/logback-classic-1.2.3.jar lib/logback-core-1.2.3.jar lib/slf4j-ap
i-1.7.30.jar lib/log4j-to-slf4j-2.13.3.jar lib/log4j-api-2.13.3.jar lib
/jul-to-slf4j-1.7.30.jar lib/jakarta.annotation-api-1.3.5.jar lib/sprin
g-core-5.3.4.jar lib/spring-jcl-5.3.4.jar lib/snakeyaml-1.27.jar lib/sp
ring-boot-starter-json-2.4.3.jar lib/jackson-databind-2.11.4.jar lib/ja
ckson-annotations-2.11.4.jar lib/jackson-core-2.11.4.jar lib/jackson-da
tatype-jdk8-2.11.4.jar lib/jackson-datatype-jsr310-2.11.4.jar lib/jacks
on-module-parameter-names-2.11.4.jar lib/spring-boot-starter-tomcat-2.4
.3.jar lib/tomcat-embed-core-9.0.43.jar lib/jakarta.el-3.0.3.jar lib/to
mcat-embed-websocket-9.0.43.jar lib/spring-web-5.3.4.jar lib/spring-bea
ns-5.3.4.jar lib/spring-webmvc-5.3.4.jar lib/spring-aop-5.3.4.jar lib/s
pring-context-5.3.4.jar lib/spring-expression-5.3.4.jar
cd package-optimize-level3 mvn clean install ls -lh devops/ total 912 drwxr-xr-x 36 lixia wheel 1.1K Feb 24 23:14 lib -rw-r--r--@ 1 lixia wheel 150K Feb 24 23:14 package-optimize-app1.jar -rw-r--r-- 1 lixia wheel 150K Feb 24 23:14 package-optimize-app2.jar -rw-r--r-- 1 lixia wheel 150K Feb 24 23:14 package-optimize-app3.jar java -jar devops/package-optimize-app1.jarEffet final d'implémentation
Les composants dépendants de tous les services sont fusionnés en un seul. La taille totale du répertoire est de deux à trois cents Mo et l'efficacité de la transmission du premier déploiement est considérablement accélérée.
Chaque pot de microservice a une taille de un à deux cents Ko. Les corrections de bogues d'urgence quotidiennes et les mises à jour des pots individuels sont essentiellement instantanées.
Chaque jar de microservice définit une liste de composants qui dépendent de la version spécifiée, il n'y aura donc pas de conflits de chargement entre les différentes versions des composants.
Les composants dépendants de tiers non officiels peuvent également être référencés et traités normalement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!