<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          老大說(shuō),我們SpringBoot部署Jar文件太“肥”了,能“減肥”一下嗎?

          共 17874字,需瀏覽 36分鐘

           ·

          2021-04-12 11:16

          不點(diǎn)藍(lán)字,我們哪來(lái)故事?

          每天 11 點(diǎn)更新文章,餓了點(diǎn)外賣,點(diǎn)擊 ??《無(wú)門檻外賣優(yōu)惠券,每天免費(fèi)領(lǐng)!》

          來(lái)源:gitee.com/xautlx/package-optimize-demo


          正文如下:


          本文截取代碼片段來(lái)自于對(duì)應(yīng)的完整示例源碼工程:



          相關(guān)代碼和配置均實(shí)際執(zhí)行測(cè)試過(guò),如在驗(yàn)證過(guò)程發(fā)現(xiàn)有任何問題可Issue反饋以便及時(shí)更正,感謝支持!


          # 概要說(shuō)明


          隨著Spring Boot的流行,大家體驗(yàn)到只需構(gòu)建輸出一個(gè)jar文件,然后只需一個(gè)java -jar命令就能部署運(yùn)行應(yīng)用的爽快。常見一些單體應(yīng)用隨著項(xiàng)目規(guī)模的擴(kuò)展單個(gè)jar文件的大小越來(lái)越大,動(dòng)輒兩三百M(fèi)B。如果再引入微服務(wù)架構(gòu),動(dòng)輒一二十個(gè)微服務(wù),所有模塊jar加起來(lái)整個(gè)系統(tǒng)光部署文件就一兩個(gè)GB。


          一個(gè)系統(tǒng)一旦上線運(yùn)行,無(wú)論新需求迭代還是Bug修復(fù),免不了需要做部署更新,尤其對(duì)于一些交付類型項(xiàng)目,首次部署或異地更新, 動(dòng)不動(dòng)就需要傳輸幾百M(fèi)B或幾個(gè)GB的部署文件,確實(shí)是一個(gè)讓人頭疼的問題。


          可以想象一下,線上系統(tǒng)發(fā)現(xiàn)一個(gè)緊急嚴(yán)重Bug捅到了主管那里,交代馬上緊急修復(fù)解決,研發(fā)同事火速分析排查分分鐘搞定提交代碼并完成構(gòu)建打包并交付給運(yùn)維。過(guò)一會(huì)領(lǐng)導(dǎo)著急上火來(lái)過(guò)問問題更新解決了嗎?運(yùn)維只能很尷尬的回答:還沒呢,部署包文件比較大,正在上傳有點(diǎn)慢...


          一聽領(lǐng)導(dǎo)就火了,就改了幾行代碼,部署更新為啥要上傳幾百M(fèi)B的文件呢?難道沒有辦法優(yōu)化一下嗎?


          遇到這樣的情況,建議你往下看,或許能找到你想要的答案。


          本文內(nèi)容包括:


          • 如何把一兩百M(fèi)B的單一Spring Boot jar文件,分離為依賴組件lib目錄和一個(gè)業(yè)務(wù)jar來(lái)進(jìn)行部署,優(yōu)化單個(gè)jar文件大小到一兩百KB。。
          • 如何把一二十個(gè)微服務(wù)高度重疊的依賴組件合并到單一lib目錄和多個(gè)一兩百KB的業(yè)務(wù)jar來(lái)進(jìn)行部署,優(yōu)化整個(gè)項(xiàng)目部署文件大小從一兩個(gè)GB大小到兩三百M(fèi)B。


          本文內(nèi)容不包括:


          • 不包括進(jìn)行Spring Boot配置文件分離相關(guān),一般簡(jiǎn)單采用通過(guò)指定active profile從外部yaml配置文件覆蓋jar文件中配置即可或是采用Nacos等配置服務(wù)模式。
          • 不包括Maven最佳實(shí)踐用法,列入樣例工程中出于演示方便的考慮比如把一些本應(yīng)放到各個(gè)Boot模塊特定的配置聲明直接放到頂層的parent中定義,請(qǐng)注意按實(shí)際情況優(yōu)化調(diào)整使用。
          • 不包括可執(zhí)行jar的運(yùn)行模式支持參考,文中實(shí)現(xiàn)方式主要面向java -jar運(yùn)行模式。


          # 瘦身打怪升級(jí)過(guò)程


          Level 0:常規(guī)的Fat Jar構(gòu)建


          參考項(xiàng)目目錄:package-optimize-level0


          主要配置:

          <build>    <finalName>${project.artifactId}</finalName>    <!--    特別注意:    項(xiàng)目?jī)H僅是為了演示配置方便,直接在parent的build部分做了插件配置和運(yùn)行定義。    但是實(shí)際項(xiàng)目中需要把這些定義只放到spring boot模塊項(xiàng)目(可優(yōu)化使用pluginManagement形式),避免干擾其他util、common等模塊項(xiàng)目    -->    <plugins>        <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>        </plugin>    </plugins></build>

          配置輸出:

          cd package-optimize-level0mvn 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

          重點(diǎn)說(shuō)明:


          • (當(dāng)前演示應(yīng)用僅依賴了spring-boot-starter-web極少組件,所有構(gòu)建輸出只有十來(lái)MB)實(shí)際情況單一構(gòu)建根據(jù)項(xiàng)目依賴組件量輸出jar一般在幾十MB到一兩百M(fèi)B甚至更大。
          • 假如有十來(lái)個(gè)微服務(wù)需要部署,那就意味著需要傳輸一兩個(gè)GB的文件,耗時(shí)可想而知。就算是單一更新個(gè)別微服務(wù)也需要傳輸一兩百M(fèi)B。


          Level 1:常見的依賴jar分離構(gòu)建方式


          參考項(xiàng)目目錄:package-optimize-level1


          關(guān)解決問題:


          • 降低單個(gè)微服務(wù)jar的文件大小,以便部署過(guò)程秒傳文件。


          主要配置:


          重點(diǎn)配置說(shuō)明請(qǐng)?jiān)斠娙缦伦⑨屨f(shuō)明:

          <build>    <finalName>${project.artifactId}</finalName>    <!--    特別注意:    項(xiàng)目?jī)H僅是為了演示配置方便,直接在parent的build部分做了插件配置和運(yùn)行定義。    但是實(shí)際項(xiàng)目中需要把這些定義只放到spring boot模塊項(xiàng)目(可優(yōu)化使用pluginManagement形式),避免干擾其他util、common等模塊項(xiàng)目    -->    <plugins>        <!-- 拷貝項(xiàng)目所有依賴jar文件到構(gòu)建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構(gòu)建 -->        <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>            <configuration>                <includes>                    <!-- 不存在的include引用,相當(dāng)于排除所有maven依賴jar,沒有任何三方j(luò)ar文件打入輸出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>

          配置輸出:

          cd package-optimize-level1mvn 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

          實(shí)現(xiàn)效果:

          • 單一構(gòu)建根據(jù)項(xiàng)目依賴組件量輸出jar一般僅有一兩百KB,基本可以做到秒傳。
          • 這個(gè)是網(wǎng)上可見最常見的優(yōu)化方案,還值得繼續(xù)深入:假如有十來(lái)個(gè)微服務(wù),每個(gè)服務(wù)一個(gè)jar和一個(gè)lib目錄文件,首次部署也差不多需要傳輸一兩個(gè)GB文件。

          Level 2:合并所有模塊依賴jar到同一個(gè)lib目錄


          參考項(xiàng)目目錄:package-optimize-level2


          解決問題:


          • 合并所有模塊依賴jar到同一個(gè)lib目錄,一般由于各模塊項(xiàng)目依賴jar重疊程度很高,合并所有服務(wù)部署文件總計(jì)大小基本也就兩三百M(fèi)B
          • 但是如果采用-Djava.ext.dirs=lib加載所有jar到每個(gè)JVM,一來(lái)每個(gè)JVM都完整加載了所有jar耗費(fèi)資源,二來(lái)各微服務(wù)組件版本不同會(huì)出現(xiàn)版本沖突問題


          主要配置:


          重點(diǎn)配置說(shuō)明請(qǐng)?jiān)斠娙缦伦⑨屨f(shuō)明:

          <build>    <finalName>${project.artifactId}</finalName>    <!--    特別注意:    項(xiàng)目?jī)H僅是為了演示配置方便,直接在parent的build部分做了插件配置和運(yùn)行定義。    但是實(shí)際項(xiàng)目中需要把這些定義只放到spring boot模塊項(xiàng)目(可優(yōu)化使用pluginManagement形式),避免干擾其他util、common等模塊項(xiàng)目    -->    <plugins>        <!-- 基于maven-jar-plugin插件實(shí)現(xiàn)把依賴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>        <!-- 拷貝項(xiàng)目所有依賴jar文件到構(gòu)建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>                        <!--                        各子模塊按照實(shí)際層級(jí)定義各模塊對(duì)應(yīng)的屬性值,檢查所有微服務(wù)模塊依賴jar文件合并復(fù)制到同一個(gè)目錄                        詳見各子模塊中 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構(gòu)建 -->        <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>            <configuration>                <includes>                    <!-- 不存在的include引用,相當(dāng)于排除所有maven依賴jar,沒有任何三方j(luò)ar文件打入輸出jar -->                    <include>                        <groupId>null</groupId>                        <artifactId>null</artifactId>                    </include>                </includes>                <layout>ZIP</layout>                <!--                基于maven-jar-plugin輸出微服務(wù)jar文件進(jìn)行二次spring boot重新打包文件的輸出目錄                所有微服務(wù)構(gòu)建輸出jar文件統(tǒng)一輸出到與lib同一個(gè)目錄,便于共同引用同一個(gè)lib目錄                詳見各子模塊中boot-jar-output屬性定義                -->                <!--  -->                <outputDirectory>${boot-jar-output}</outputDirectory>            </configuration>            <executions>                <execution>                    <goals>                        <goal>repackage</goal>                    </goals>                </execution>            </executions>        </plugin>    </plugins></build>

          所有l(wèi)ib目錄文件及各微服務(wù)構(gòu)建jar聚合到devops公共目錄。


          微服務(wù)jar文件中的META-INFO/MANIFEST文件中會(huì)生成根據(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-level2mvn clean install
          ls -lh devops/total 912drwxr-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

          實(shí)現(xiàn)效果:


          • 啟動(dòng)過(guò)程不再需要 -Djava.ext.dirs=lib 參數(shù)定義。
          • 所有微服務(wù)jar引用所有項(xiàng)目合并依賴組件的公共目錄,部署文件總計(jì)大小一般在兩三百M(fèi)B。
          • 通過(guò)定制每個(gè)微服務(wù)jar文件中的META-INFO/MANIFEST文件中的Class-Path明確指明依賴版本組件類,解決各微服務(wù)不同組件版本沖突問題。

          Level 3:支持system引入的非官方的三方依賴組件


          參考項(xiàng)目目錄:package-optimize-level3


          解決問題:


          • 有些非官方三方的諸如sdk jar,一種做法是提交到Maven本地私服中去引用,那和普通依賴jar處理相同;但是在沒有maven私服的情況下,常見的簡(jiǎn)化做法都是直接在項(xiàng)目中放置依賴jar然后在pom中以system scope方式定義。
          • 對(duì)于在pom中是以systemPath方式引入的,maven-jar-plugin組件沒有直接參數(shù)聲明包含指定scope的組件, 如果不做特殊處理META-INFO/MANIFEST中不會(huì)出現(xiàn)這些scope定義的組件,導(dǎo)致運(yùn)行時(shí)類找不到。


          主要配置:


          重點(diǎn)配置說(shuō)明請(qǐng)?jiān)斠娙缦伦⑨屨f(shuō)明:

          <build>    <finalName>${project.artifactId}</finalName>    <!--    特別注意:    項(xiàng)目?jī)H僅是為了演示配置方便,直接在parent的build部分做了插件配置和運(yùn)行定義。    但是實(shí)際項(xiàng)目中需要把這些定義只放到spring boot模塊項(xiàng)目(可優(yōu)化使用pluginManagement形式),避免干擾其他util、common等模塊項(xiàng)目    -->    <plugins>        <!-- 基于maven-jar-plugin插件實(shí)現(xiàn)把依賴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組件沒有直接參數(shù)聲明包含指定scope的組件                        通過(guò)使用額外定義 Class-Path 值來(lái)追加指定依賴組件列表,在子模塊按實(shí)際情況指定 jar-manifestEntries-classpath 值即可                        例如(注意前面?zhèn)€點(diǎn)字符及各空格分隔符):. 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>        <!-- 拷貝項(xiàng)目所有依賴jar文件到構(gòu)建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>                        <!--                        各子模塊按照實(shí)際層級(jí)定義各模塊對(duì)應(yīng)的屬性值,檢查所有微服務(wù)模塊依賴jar文件合并復(fù)制到同一個(gè)目錄                        詳見各子模塊中 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構(gòu)建 -->        <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>            <configuration>                <includes>                    <!-- 不存在的include引用,相當(dāng)于排除所有maven依賴jar,沒有任何三方j(luò)ar文件打入輸出jar -->                    <include>                        <groupId>null</groupId>                        <artifactId>null</artifactId>                    </include>                </includes>                <layout>ZIP</layout>                <!--                基于maven-jar-plugin輸出微服務(wù)jar文件進(jìn)行二次spring boot重新打包文件的輸出目錄                所有微服務(wù)構(gòu)建輸出jar文件統(tǒng)一輸出到與lib同一個(gè)目錄,便于共同引用同一個(gè)lib目錄                詳見各子模塊中boot-jar-output屬性定義                -->                <!--  -->                <outputDirectory>${boot-jar-output}</outputDirectory>            </configuration>            <executions>                <execution>                    <goals>                        <goal>repackage</goal>                    </goals>                </execution>            </executions>        </plugin>    </plugins></build>
          子模塊主要配置:
          <properties>        <!-- 按各模塊實(shí)際目錄層次定義相對(duì)數(shù)據(jù),使所有服務(wù)模塊輸出資源匯聚到相同目錄 -->        <boot-jar-output>../devops</boot-jar-output>        <!--        有些供應(yīng)商的sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin組件沒有直接參數(shù)聲明包含指定scope的組件        通過(guò)使用額外定義 Class-Path 值來(lái)追加指定依賴組件列表,按實(shí)際情況指定 jar-manifestEntries-classpath 值即可        例如(注意前面?zhèn)€點(diǎn)字符及各空格分隔符,lib后面部分是 artifactId-version.jar 格式而不是實(shí)際文件名):. 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>        <!-- 以相對(duì)路徑方式定義非官方三方依賴組件 -->        <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>
          微服務(wù)輸出jar文件中的META-INFO/MANIFEST文件中會(huì)生成根據(jù)模塊依賴組件
          列表的Class-Path屬性, 最前面會(huì)追加 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.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-level3mvn clean install
          ls -lh devops/total 912drwxr-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.jar

          最終實(shí)現(xiàn)效果


          • 所有服務(wù)的依賴組件合并到一個(gè)目錄,總計(jì)大小在兩三百M(fèi)B,首次部署傳輸效率明顯提速。
          • 各微服務(wù)jar一兩百KB大小,日常緊急修復(fù)Bug更新個(gè)別jar基本就是瞬間秒傳。
          • 各微服務(wù)jar中各自定義依賴指定版本組件列表,不會(huì)出現(xiàn)組件不同版本加載沖突問題。
          • 非官方的三方依賴組件也能正常引用處理。

          # 特別提示


          上述通過(guò)部署組件分離處理后,日常更新只需要傳輸一兩百KB的業(yè)務(wù)jar文件即可。但是如果某個(gè)項(xiàng)目的maven依賴組件做了變更配置,則需要注意把變更的jar文件要同步到公共的lib目錄。


          最小化變更jar文件的小技巧:可以把構(gòu)建部署資源目錄提交到GIT庫(kù),以后每次版本發(fā)布同時(shí)commit到GIT庫(kù), 通過(guò)提交視圖可以清晰的識(shí)別出lib目錄下和業(yè)務(wù)jar本次版本發(fā)布的變更文件清單,包括微服務(wù)jar和依賴jar變更文件,以此最小化傳輸文件。

          往期推薦

          事務(wù)注解 @Transactional 失效的3種場(chǎng)景及解決辦法

          干掉 Swagger (絲襪哥),試試這個(gè)新工具!

          快來(lái)?yè)尲t包!

          好家伙!30 行代碼實(shí)現(xiàn)螞蟻森林自動(dòng)收能量,低調(diào)別讓好友知道!文末送書~

          下方二維碼關(guān)注我

          技術(shù)草根堅(jiān)持分享 編程,算法,架構(gòu)

          看完文章,餓了點(diǎn)外賣,點(diǎn)擊 ??《無(wú)門檻外賣優(yōu)惠券,每天免費(fèi)領(lǐng)!》

          朋友,助攻一把!點(diǎn)個(gè)在看
          瀏覽 64
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  好吊视频一区二区三区 | 日韩精品一区二区三区四区 | 91琪琪| 五月丁香婷婷亚洲 | 开心久久五月天 |