SpringBoot 部署 Jar 文件瘦身优化指南 _第1页
SpringBoot 部署 Jar 文件瘦身优化指南 _第2页
SpringBoot 部署 Jar 文件瘦身优化指南 _第3页
SpringBoot 部署 Jar 文件瘦身优化指南 _第4页
SpringBoot 部署 Jar 文件瘦身优化指南 _第5页
已阅读5页,还剩14页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SpringBoot部署Jar文件,瘦身优化指南!概要说明瘦身打怪升级过程Level0:常规的FatJar构建Level1:常见的依赖jar分离构建方式Level2:合并所有模块依赖jar到同一个lib目录Level3:支持system引入的非官方的三方依赖组件最终实现效果特别提示大家好,我是架构师!本文截取代码片段来自于对应的完整示例源码工程:/xautlx/package-optimize-demo相关代码和配置均实际执行测试过(基于OpenJDK8环境,其余JDK未做验证,如-Djava.ext.dirs=lib等参数和JDK版本有关,注意对应调整),如在验证过程发现有任何问题可Issue反馈以便及时更正,感谢支持!概要说明随着SpringBoot的流行,大家体验到只需构建输出一个jar文件,然后只需一个java-jar命令就能部署运行应用的爽快。常见一些单体应用随着项目规模的扩展单个jar文件的大小越来越大,动辄两三百MB。如果再引入微服务架构,动辄一二十个微服务,所有模块jar加起来整个系统光部署文件就一两个GB。一个系统一旦上线运行,无论新需求迭代还是Bug修复,免不了需要做部署更新,尤其对于一些交付类型项目,首次部署或异地更新,动不动就需要传输几百MB或几个GB的部署文件,确实是一个让人头疼的问题。可以想象一下,线上系统发现一个紧急严重Bug捅到了主管那里,交代马上紧急修复解决,研发同事火速分析排查分分钟搞定提交代码并完成构建打包并交付给运维。过一会领导着急上火来过问问题更新解决了吗?运维只能很尴尬的回答:还没呢,部署包文件比较大,正在上传有点慢...一听领导就火了,就改了几行代码,部署更新为啥要上传几百MB的文件呢?难道没有办法优化一下吗?遇到这样的情况,建议你往下看,或许能找到你想要的答案。本文内容包括:如何把一两百MB的单一SpringBootjar文件,分离为依赖组件lib目录和一个业务jar来进行部署,优化单个jar文件大小到一两百KB。。如何把一二十个微服务高度重叠的依赖组件合并到单一lib目录和多个一两百KB的业务jar来进行部署,优化整个项目部署文件大小从一两个GB大小到两三百MB。本文内容不包括:不包括进行SpringBoot配置文件分离相关,一般简单采用通过指定activeprofile从外部yaml配置文件覆盖jar文件中配置即可或是采用Nacos等配置服务模式。不包括Maven最佳实践用法,列入样例工程中出于演示方便的考虑比如把一些本应放到各个Boot模块特定的配置声明直接放到顶层的parent中定义,请注意按实际情况优化调整使用。不包括可执行jar的运行模式支持参考,文中实现方式主要面向java-jar运行模式。瘦身打怪升级过程Level0:常规的FatJar构建参考项目目录:package-optimize-level0主要配置:<build>

<finalName>${project.artifactId}finalName>

<plugins>

<plugin>

<groupId>org.springframework.bootgroupId>

<artifactId>spring-boot-maven-pluginartifactId>

plugin>

plugins>

build>配置输出: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重点说明:(当前演示应用仅依赖了spring-boot-starter-web极少组件,所有构建输出只有十来MB)实际情况单一构建根据项目依赖组件量输出jar一般在几十MB到一两百MB甚至更大。假如有十来个微服务需要部署,那就意味着需要传输一两个GB的文件,耗时可想而知。就算是单一更新个别微服务也需要传输一两百MB。Level1:常见的依赖jar分离构建方式参考项目目录:package-optimize-level1关解决问题:降低单个微服务jar的文件大小,以便部署过程秒传文件。搜索公众号顶级架构师回复关键字“offer”,获取一份惊喜礼包。主要配置:重点配置说明请详见如下注释说明:<build>

<finalName>${project.artifactId}finalName>

<plugins>

<plugin>

<groupId>org.apache.maven.pluginsgroupId>

<artifactId>maven-dependency-pluginartifactId>

<executions>

<execution>

<id>copy-dependenciesid>

<phase>packagephase>

<goals>

<goal>copy-dependenciesgoal>

goals>

<configuration>

<outputDirectory>${project.build.directory}/liboutputDirectory>

<excludeTransitive>falseexcludeTransitive>

<stripVersion>falsestripVersion>

<silent>truesilent>

configuration>

execution>

executions>

plugin>

<plugin>

<groupId>org.springframework.bootgroupId>

<artifactId>spring-boot-maven-pluginartifactId>

<configuration>

<includes>

<include>

<groupId>nullgroupId>

<artifactId>nullartifactId>

include>

includes>

<layout>ZIPlayout>

configuration>

<executions>

<execution>

<goals>

<goal>repackagegoal>

goals>

execution>

executions>

plugin>

plugins>

build>配置输出: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实现效果:单一构建根据项目依赖组件量输出jar一般仅有一两百KB,基本可以做到秒传。这个是网上可见最常见的优化方案,还值得继续深入:假如有十来个微服务,每个服务一个jar和一个lib目录文件,首次部署也差不多需要传输一两个GB文件。Level2:合并所有模块依赖jar到同一个lib目录参考项目目录:package-optimize-level2解决问题:合并所有模块依赖jar到同一个lib目录,一般由于各模块项目依赖jar重叠程度很高,合并所有服务部署文件总计大小基本也就两三百MB但是如果采用-Djava.ext.dirs=lib加载所有jar到每个JVM,一来每个JVM都完整加载了所有jar耗费资源,二来各微服务组件版本不同会出现版本冲突问题主要配置:重点配置说明请详见如下注释说明:<build>

<finalName>${project.artifactId}finalName>

<plugins>

<plugin>

<groupId>org.apache.maven.pluginsgroupId>

<artifactId>maven-jar-pluginartifactId>

<configuration>

<archive>

<manifest>

<addClasspath>trueaddClasspath>

<classpathPrefix>lib/classpathPrefix>

<useUniqueVersions>falseuseUniqueVersions>

manifest>

archive>

configuration>

plugin>

<plugin>

<groupId>org.apache.maven.pluginsgroupId>

<artifactId>maven-dependency-pluginartifactId>

<executions>

<execution>

<id>copy-dependenciesid>

<phase>packagephase>

<goals>

<goal>copy-dependenciesgoal>

goals>

<configuration>

<outputDirectory>${boot-jar-output}/liboutputDirectory>

<excludeTransitive>falseexcludeTransitive>

<stripVersion>falsestripVersion>

<silent>falsesilent>

configuration>

execution>

executions>

plugin>

<plugin>

<groupId>org.springframework.bootgroupId>

<artifactId>spring-boot-maven-pluginartifactId>

<configuration>

<includes>

<include>

<groupId>nullgroupId>

<artifactId>nullartifactId>

include>

includes>

<layout>ZIPlayout>

<outputDirectory>${boot-jar-output}outputDirectory>

configuration>

<executions>

<execution>

<goals>

<goal>repackagegoal>

goals>

execution>

executions>

plugin>

plugins>

build>所有lib目录文件及各微服务构建jar聚合到devops公共目录。微服务jar文件中的META-INFO/MANIFEST文件中会生成根据模块依赖组件列表的Class-Path属性,从而避免了不同版本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.jar实现效果:启动过程不再需要-Djava.ext.dirs=lib参数定义。所有微服务jar引用所有项目合并依赖组件的公共目录,部署文件总计大小一般在两三百MB。通过定制每个微服务jar文件中的META-INFO/MANIFEST文件中的Class-Path明确指明依赖版本组件类,解决各微服务不同组件版本冲突问题。Level3:支持system引入的非官方的三方依赖组件参考项目目录:package-optimize-level3解决问题:有些非官方三方的诸如sdkjar,一种做法是提交到Maven本地私服中去引用,那和普通依赖jar处理相同;但是在没有maven私服的情况下,常见的简化做法都是直接在项目中放置依赖jar然后在pom中以systemscope方式定义。对于在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件,如果不做特殊处理META-INFO/MANIFEST中不会出现这些scope定义的组件,导致运行时类找不到。主要配置:重点配置说明请详见如下注释说明:搜索公众号后端架构师回复关键字“架构整洁”,获取一份惊喜礼包。<build>

<finalName>${project.artifactId}finalName>

<plugins>

<plugin>

<groupId>org.apache.maven.pluginsgroupId>

<artifactId>maven-jar-pluginartifactId>

<configuration>

<archive>

<manifest>

<addClasspath>trueaddClasspath>

<classpathPrefix>lib/classpathPrefix>

<useUniqueVersions>falseuseUniqueVersions>

manifest>

<manifestEntries>

<Class-Path>${jar-manifestEntries-classpath}Class-Path>

manifestEntries>

archive>

configuration>

plugin>

<plugin>

<groupId>org.apache.maven.pluginsgroupId>

<artifactId>maven-dependency-pluginartifactId>

<executions>

<execution>

<id>copy-dependenciesid>

<phase>packagephase>

<goals>

<goal>copy-dependenciesgoal>

goals>

<configuration>

<outputDirectory>${boot-jar-output}/liboutputDirectory>

<excludeTransitive>falseexcludeTransitive>

<stripVersion>falsestripVersion>

<silent>falsesilent>

configuration>

execution>

executions>

plugin>

<plugin>

<groupId>org.springframework.bootgroupId>

<artifactId>spring-boot-maven-pluginartifactId>

<configuration>

<includes>

<include>

<groupId>nullgroupId>

<artifactId>nullartifactId>

include>

includes>

<layout>ZIPlayout>

<outputDirectory>${boot-jar-output}outputDirectory>

configuration>

<executions>

<execution>

<goals>

<goal>repackagegoal>

goals>

execution>

executions>

plugin>

plugins>

build>子模块主要配置:

<properties>

<boot-jar-output>../devopsboot-jar-output>

<jar-manifestEntries-classpath>.

lib/hik-sdk-1.0.0.jarjar-manifestEntries-classpath>

properties>

<dependencies>

<dependency>

<groupId>com.hikgroupId>

<artifactId>hik-sdkartifactId>

<version>1.0.0version>

<scope>systemscope>

<systemPath>${project.basedir}/lib/hik-sdk-1.0.0.jarsystemPath>

dependency>

<dependency>

<groupId>org.springframework.bootgroupId>

<artifactId>spring-boot-starter-webartifactId>

dependency>

dependencies>微服务输出jar文件中的META-INFO/MANIFEST文件中会生成根据模块依赖组件列表的Class-Path属性,最前面会追加jar-manifestEntries-classpath属性定义值: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.2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论