網(wǎng)站資源做外鏈seo教程搜索引擎優(yōu)化入門與進(jìn)階
公司微服務(wù)細(xì)分太多,最近跟我提說需要將幾個(gè)微服務(wù)合為單體,經(jīng)過幾天的查閱,決定用二次打包的方式進(jìn)行合并,然后部署的時(shí)候在nginx改下合并的微服務(wù)轉(zhuǎn)發(fā)路勁即可,不需要前端修改路勁了。
方案
采用二次打包的方式進(jìn)行合并,利用maven-dependency-plugin解壓插件先將各微服務(wù)的jar包解壓再用maven-assembly-plugin進(jìn)行合并打包為一個(gè)jar包。
合并前問題處理
1、由于包合并時(shí),相同的類會(huì)進(jìn)行覆蓋,會(huì)導(dǎo)致找不到類等,所以存在相同包下的相同類名作用不一致的話,需要調(diào)整下各服務(wù)的包名、類
2、類注冊(cè)的bean的name相同時(shí),會(huì)導(dǎo)致注冊(cè)bean失敗,所以需要調(diào)整各服務(wù)有相同bean的name,特別是@FeignClient的contextId,因?yàn)槭且詂ontextId作為bean的name。
3、重復(fù)掃描導(dǎo)致重復(fù)注冊(cè)等,如@EnableJpaAuditing,重復(fù)掃描,導(dǎo)致重復(fù)注冊(cè)jpaAuditingHandler,所以在有用到@EnableJpaAuditing的類上也加上@ConditionalOnMissingBean(name="jpaAuditingHandler")條件,已經(jīng)注冊(cè)過的,就不需要再注冊(cè)了
4、因?yàn)槊總€(gè)微服務(wù)都有yml配置文件,所以需要寫個(gè)合并適配器,將每個(gè)微服務(wù)的yml合并一起,后續(xù)會(huì)另外開篇文件細(xì)說yml的合并。
合并步驟和代碼
1、pom文件添加需要合并的微服務(wù)依賴
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><module1.version>6.1.0</module1.version><module2.version>6.1.0</module2.version><module3.version>6.1.0</module3.version> </properties> <dependencies> //需要整合的微服務(wù)包,type、scope需填寫正確,其中g(shù)roupId、artifactId、version按需填寫即可<dependency><groupId>com.lfq.module1</groupId><artifactId>module1</artifactId><version>${module1.version}</version><type>jar</type><scope>provided</scope></dependency><dependency><groupId>com.lf1.module2</groupId><artifactId>module2</artifactId><version>${module2.version}</version><type>jar</type><scope>provided</scope></dependency><dependency><groupId>com.lf1.module3</groupId><artifactId>module3</artifactId><version>${module3.version}</version><type>jar</type><scope>provided</scope></dependency> </dependencies> |
2、pom文件添加解壓插件,將微服務(wù)解壓到指定目錄下
<!-- 將指定執(zhí)行包解包到指定目錄下 --> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>unpack-classes</id><phase>package</phase><goals><goal>unpack</goal></goals><configuration><artifactItems><artifactItem><groupId>com.lfq.module1</groupId><artifactId>module1</artifactId><outputDirectory>${project.build.directory}/work/addpack/module1</outputDirectory></artifactItem><artifactItem><groupId>com.lfq.module2</groupId><artifactId>module2</artifactId><outputDirectory>${project.build.directory}/work/addpack/module2</outputDirectory></artifactItem><artifactItem><groupId>com.lfq.module3</groupId><artifactId>module3</artifactId><outputDirectory>${project.build.directory}/work/addpack/module3</outputDirectory></artifactItem></artifactItems></configuration></execution></executions> </plugin> |
3、pom文件添加合并打包插件,將解壓目錄下的文件和本工程代碼合并打包
<!-- 將解開的執(zhí)行包與本工程代碼合并打包 --> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><configuration><recompressZippedFiles>false</recompressZippedFiles></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals><configuration><archive> <!-- 標(biāo)紅部分是合并后的執(zhí)行包的啟動(dòng)類MANIFEST.MF文件,我這里選module1解壓下的文件,按需配啟動(dòng)類 --><manifestFile>${project.build.directory}/work/addpack/module1/META-INF/MANIFEST.MF</manifestFile></archive><descriptors><descriptor>assembly.xml</descriptor> <!-- 加載指定的assembly配置文件 --></descriptors></configuration></execution></executions> <!-- 標(biāo)紅部分是合并yml處理的包,如果需要合并yml文件,需自定義適配器對(duì)yml進(jìn)行合并處理,再將依賴包添加進(jìn)來 --> <!-- <dependencies><dependency><groupId>com.fql.merge</groupId><artifactId>mergeHandle</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies> --> </plugin> |
4、添加assembly.xml文件描述合并打包
<assembly> <!-- id自定義 --><id>lfq</id><formats><!-- 打?yàn)閖ar包 --><format>jar</format></formats><includeBaseDirectory>false</includeBaseDirectory><fileSets><!-- 先將本工程內(nèi)容輸出 --><fileSet><directory>${project.build.directory}/classes</directory><outputDirectory>BOOT-INF/classes</outputDirectory></fileSet><!-- 輸出解壓目錄下的內(nèi)容 --><fileSet><directory>${project.build.directory}/work/addpack/module1</directory><outputDirectory>.</outputDirectory> <!-- 這里是module1下的DbDataController類不需要輸出參與合并打包,即打包后的jar包沒有DbDataController類,按需配置 --><excludes><exclude>**/DbDataController.class</exclude></excludes></fileSet><fileSet><directory>${project.build.directory}/work/addpack/module2</directory><outputDirectory>.</outputDirectory> <!-- 這里是module2下的application.yml不需要輸出參與合并打包,按需配置 --><excludes><exclude>**/application.yml</exclude></excludes></fileSet><fileSet><directory>${project.build.directory}/work/addpack/module3</directory><outputDirectory>.</outputDirectory></fileSet></fileSets><!--標(biāo)紅部分是對(duì)yml文件合并處理,如果沒有實(shí)現(xiàn),可去掉 --> <containerDescriptorHandlers><containerDescriptorHandler><handlerName>yml-merge</handlerName><configuration><filePattern>.*/application.yml</filePattern><outputPath>BOOT-INF/classes/application.yml</outputPath></configuration></containerDescriptorHandler></containerDescriptorHandlers><!-- 本工程依賴 --><dependencySets><dependencySet><unpack>false</unpack><useProjectArtifact>false</useProjectArtifact><outputDirectory>BOOT-INF/lib</outputDirectory></dependencySet></dependencySets> </assembly> |
后續(xù)執(zhí)行clean install 即可得到一個(gè)jar包。