临沂品牌网站制作,高端网站定制的方法,百度收录官网,网站开发语公司微服务细分太多#xff0c;最近跟我提说需要将几个微服务合为单体#xff0c;经过几天的查阅#xff0c;决定用二次打包的方式进行合并#xff0c;然后部署的时候在nginx改下合并的微服务转发路劲即可#xff0c;不需要前端修改路劲了。
方案
采用二次打包的方式进行…公司微服务细分太多最近跟我提说需要将几个微服务合为单体经过几天的查阅决定用二次打包的方式进行合并然后部署的时候在nginx改下合并的微服务转发路劲即可不需要前端修改路劲了。
方案
采用二次打包的方式进行合并利用maven-dependency-plugin解压插件先将各微服务的jar包解压再用maven-assembly-plugin进行合并打包为一个jar包。
合并前问题处理
1、由于包合并时相同的类会进行覆盖会导致找不到类等所以存在相同包下的相同类名作用不一致的话需要调整下各服务的包名、类
2、类注册的bean的name相同时会导致注册bean失败所以需要调整各服务有相同bean的name特别是FeignClient的contextId因为是以contextId作为bean的name。
3、重复扫描导致重复注册等如EnableJpaAuditing重复扫描导致重复注册jpaAuditingHandler所以在有用到EnableJpaAuditing的类上也加上ConditionalOnMissingBean(namejpaAuditingHandler)条件已经注册过的就不需要再注册了
4、因为每个微服务都有yml配置文件所以需要写个合并适配器将每个微服务的yml合并一起后续会另外开篇文件细说yml的合并。
合并步骤和代码
1、pom文件添加需要合并的微服务依赖 propertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncodingmodule1.version6.1.0/module1.versionmodule2.version6.1.0/module2.versionmodule3.version6.1.0/module3.version
/properties dependencies
//需要整合的微服务包type、scope需填写正确,其中groupId、artifactId、version按需填写即可dependencygroupIdcom.lfq.module1/groupIdartifactIdmodule1/artifactIdversion${module1.version}/versiontypejar/typescopeprovided/scope/dependencydependencygroupIdcom.lf1.module2/groupIdartifactIdmodule2/artifactIdversion${module2.version}/versiontypejar/typescopeprovided/scope/dependencydependencygroupIdcom.lf1.module3/groupIdartifactIdmodule3/artifactIdversion${module3.version}/versiontypejar/typescopeprovided/scope/dependency
/dependencies2、pom文件添加解压插件将微服务解压到指定目录下 !-- 将指定执行包解包到指定目录下 --
plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-dependency-plugin/artifactIdexecutionsexecutionidunpack-classes/idphasepackage/phasegoalsgoalunpack/goal/goalsconfigurationartifactItemsartifactItemgroupIdcom.lfq.module1/groupIdartifactIdmodule1/artifactIdoutputDirectory${project.build.directory}/work/addpack/module1/outputDirectory/artifactItemartifactItemgroupIdcom.lfq.module2/groupIdartifactIdmodule2/artifactIdoutputDirectory${project.build.directory}/work/addpack/module2/outputDirectory/artifactItemartifactItemgroupIdcom.lfq.module3/groupIdartifactIdmodule3/artifactIdoutputDirectory${project.build.directory}/work/addpack/module3/outputDirectory/artifactItem/artifactItems/configuration/execution/executions
/plugin
3、pom文件添加合并打包插件将解压目录下的文件和本工程代码合并打包 !-- 将解开的执行包与本工程代码合并打包 --
plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-assembly-plugin/artifactIdversion3.3.0/versionconfigurationrecompressZippedFilesfalse/recompressZippedFiles/configurationexecutionsexecutionidmake-assembly/idphasepackage/phasegoalsgoalsingle/goal/goalsconfigurationarchive
!-- 标红部分是合并后的执行包的启动类MANIFEST.MF文件我这里选module1解压下的文件按需配启动类 --manifestFile${project.build.directory}/work/addpack/module1/META-INF/MANIFEST.MF/manifestFile/archivedescriptorsdescriptorassembly.xml/descriptor !-- 加载指定的assembly配置文件 --/descriptors/configuration/execution/executions
!-- 标红部分是合并yml处理的包如果需要合并yml文件需自定义适配器对yml进行合并处理再将依赖包添加进来 --
!-- dependenciesdependencygroupIdcom.fql.merge/groupIdartifactIdmergeHandle/artifactIdversion1.0-SNAPSHOT/version/dependency/dependencies --
/plugin
4、添加assembly.xml文件描述合并打包 assembly
!-- id自定义 --idlfq/idformats!-- 打为jar包 --formatjar/format/formatsincludeBaseDirectoryfalse/includeBaseDirectoryfileSets!-- 先将本工程内容输出 --fileSetdirectory${project.build.directory}/classes/directoryoutputDirectoryBOOT-INF/classes/outputDirectory/fileSet!-- 输出解压目录下的内容 --fileSetdirectory${project.build.directory}/work/addpack/module1/directoryoutputDirectory./outputDirectory
!-- 这里是module1下的DbDataController类不需要输出参与合并打包即打包后的jar包没有DbDataController类按需配置 --excludesexclude**/DbDataController.class/exclude/excludes/fileSetfileSetdirectory${project.build.directory}/work/addpack/module2/directoryoutputDirectory./outputDirectory
!-- 这里是module2下的application.yml不需要输出参与合并打包按需配置 --excludesexclude**/application.yml/exclude/excludes/fileSetfileSetdirectory${project.build.directory}/work/addpack/module3/directoryoutputDirectory./outputDirectory/fileSet/fileSets!--标红部分是对yml文件合并处理如果没有实现可去掉 -- containerDescriptorHandlerscontainerDescriptorHandlerhandlerNameyml-merge/handlerNameconfigurationfilePattern.*/application.yml/filePatternoutputPathBOOT-INF/classes/application.yml/outputPath/configuration/containerDescriptorHandler/containerDescriptorHandlers!-- 本工程依赖 --dependencySetsdependencySetunpackfalse/unpackuseProjectArtifactfalse/useProjectArtifactoutputDirectoryBOOT-INF/lib/outputDirectory/dependencySet/dependencySets
/assembly
后续执行clean install 即可得到一个jar包。