SpringBoot 部署 Jar 文件瘦身優(yōu)化指南 _第1頁
SpringBoot 部署 Jar 文件瘦身優(yōu)化指南 _第2頁
SpringBoot 部署 Jar 文件瘦身優(yōu)化指南 _第3頁
SpringBoot 部署 Jar 文件瘦身優(yōu)化指南 _第4頁
SpringBoot 部署 Jar 文件瘦身優(yōu)化指南 _第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

SpringBoot部署Jar文件,瘦身優(yōu)化指南!概要說明瘦身打怪升級過程Level0:常規(guī)的FatJar構(gòu)建Level1:常見的依賴jar分離構(gòu)建方式Level2:合并所有模塊依賴jar到同一個lib目錄Level3:支持system引入的非官方的三方依賴組件最終實現(xiàn)效果特別提示大家好,我是架構(gòu)師!本文截取代碼片段來自于對應(yīng)的完整示例源碼工程:/xautlx/package-optimize-demo相關(guān)代碼和配置均實際執(zhí)行測試過(基于OpenJDK8環(huán)境,其余JDK未做驗證,如-Djava.ext.dirs=lib等參數(shù)和JDK版本有關(guān),注意對應(yīng)調(diào)整),如在驗證過程發(fā)現(xiàn)有任何問題可Issue反饋以便及時更正,感謝支持!概要說明隨著SpringBoot的流行,大家體驗到只需構(gòu)建輸出一個jar文件,然后只需一個java-jar命令就能部署運行應(yīng)用的爽快。常見一些單體應(yīng)用隨著項目規(guī)模的擴展單個jar文件的大小越來越大,動輒兩三百MB。如果再引入微服務(wù)架構(gòu),動輒一二十個微服務(wù),所有模塊jar加起來整個系統(tǒng)光部署文件就一兩個GB。一個系統(tǒng)一旦上線運行,無論新需求迭代還是Bug修復,免不了需要做部署更新,尤其對于一些交付類型項目,首次部署或異地更新,動不動就需要傳輸幾百MB或幾個GB的部署文件,確實是一個讓人頭疼的問題??梢韵胂笠幌?,線上系統(tǒng)發(fā)現(xiàn)一個緊急嚴重Bug捅到了主管那里,交代馬上緊急修復解決,研發(fā)同事火速分析排查分分鐘搞定提交代碼并完成構(gòu)建打包并交付給運維。過一會領(lǐng)導著急上火來過問問題更新解決了嗎?運維只能很尷尬的回答:還沒呢,部署包文件比較大,正在上傳有點慢...一聽領(lǐng)導就火了,就改了幾行代碼,部署更新為啥要上傳幾百MB的文件呢?難道沒有辦法優(yōu)化一下嗎?遇到這樣的情況,建議你往下看,或許能找到你想要的答案。本文內(nèi)容包括:如何把一兩百MB的單一SpringBootjar文件,分離為依賴組件lib目錄和一個業(yè)務(wù)jar來進行部署,優(yōu)化單個jar文件大小到一兩百KB。。如何把一二十個微服務(wù)高度重疊的依賴組件合并到單一lib目錄和多個一兩百KB的業(yè)務(wù)jar來進行部署,優(yōu)化整個項目部署文件大小從一兩個GB大小到兩三百MB。本文內(nèi)容不包括:不包括進行SpringBoot配置文件分離相關(guān),一般簡單采用通過指定activeprofile從外部yaml配置文件覆蓋jar文件中配置即可或是采用Nacos等配置服務(wù)模式。不包括Maven最佳實踐用法,列入樣例工程中出于演示方便的考慮比如把一些本應(yīng)放到各個Boot模塊特定的配置聲明直接放到頂層的parent中定義,請注意按實際情況優(yōu)化調(diào)整使用。不包括可執(zhí)行jar的運行模式支持參考,文中實現(xiàn)方式主要面向java-jar運行模式。瘦身打怪升級過程Level0:常規(guī)的FatJar構(gòu)建參考項目目錄: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重點說明:(當前演示應(yīng)用僅依賴了spring-boot-starter-web極少組件,所有構(gòu)建輸出只有十來MB)實際情況單一構(gòu)建根據(jù)項目依賴組件量輸出jar一般在幾十MB到一兩百MB甚至更大。假如有十來個微服務(wù)需要部署,那就意味著需要傳輸一兩個GB的文件,耗時可想而知。就算是單一更新個別微服務(wù)也需要傳輸一兩百MB。Level1:常見的依賴jar分離構(gòu)建方式參考項目目錄:package-optimize-level1關(guān)解決問題:降低單個微服務(wù)jar的文件大小,以便部署過程秒傳文件。搜索公眾號頂級架構(gòu)師回復關(guān)鍵字“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實現(xiàn)效果:單一構(gòu)建根據(jù)項目依賴組件量輸出jar一般僅有一兩百KB,基本可以做到秒傳。這個是網(wǎng)上可見最常見的優(yōu)化方案,還值得繼續(xù)深入:假如有十來個微服務(wù),每個服務(wù)一個jar和一個lib目錄文件,首次部署也差不多需要傳輸一兩個GB文件。Level2:合并所有模塊依賴jar到同一個lib目錄參考項目目錄:package-optimize-level2解決問題:合并所有模塊依賴jar到同一個lib目錄,一般由于各模塊項目依賴jar重疊程度很高,合并所有服務(wù)部署文件總計大小基本也就兩三百MB但是如果采用-Djava.ext.dirs=lib加載所有jar到每個JVM,一來每個JVM都完整加載了所有jar耗費資源,二來各微服務(wù)組件版本不同會出現(xiàn)版本沖突問題主要配置:重點配置說明請詳見如下注釋說明:<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>所有l(wèi)ib目錄文件及各微服務(wù)構(gòu)建jar聚合到devops公共目錄。微服務(wù)jar文件中的META-INFO/MANIFEST文件中會生成根據(jù)模塊依賴組件列表的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實現(xiàn)效果:啟動過程不再需要-Djava.ext.dirs=lib參數(shù)定義。所有微服務(wù)jar引用所有項目合并依賴組件的公共目錄,部署文件總計大小一般在兩三百MB。通過定制每個微服務(wù)jar文件中的META-INFO/MANIFEST文件中的Class-Path明確指明依賴版本組件類,解決各微服務(wù)不同組件版本沖突問題。Level3:支持system引入的非官方的三方依賴組件參考項目目錄:package-optimize-level3解決問題:有些非官方三方的諸如sdkjar,一種做法是提交到Maven本地私服中去引用,那和普通依賴jar處理相同;但是在沒有maven私服的情況下,常見的簡化做法都是直接在項目中放置依賴jar然后在pom中以systemscope方式定義。對于在pom中是以systemPath方式引入的,maven-jar-plugin組件沒有直接參數(shù)聲明包含指定scope的組件,如果不做特殊處理META-INFO/MANIFEST中不會出現(xiàn)這些scope定義的組件,導致運行時類找不到。主要配置:重點配置說明請詳見如下注釋說明:搜索公眾號后端架構(gòu)師回復關(guān)鍵字“架構(gòu)整潔”,獲取一份驚喜禮包。<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>微服務(wù)輸出jar文件中的META-INFO/MANIFEST文件中會生成根據(jù)模塊依賴組件列表的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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論