Spring 使用兼并之路(一):摸石头过河
作者:京东。科技。李君。
公司。最近一年在推动降本增效,在竭尽各种手法之后,发现运用太多,每个运用都做跨机房容灾布置,则最少需求 4 台机器(称为容器更适宜)。那么,将附近运用做一个兼并,削减保护项目,进步机器利用率便是一个可选计划。
。
通过前后三次不同的折腾,最终探究出来一个可行计划。记载一下,共享出来,期望对有相关需求的研制童鞋有所协助。下面依照四种九天的计划,别离做介绍。别的,为了便利做演示,专门整了两个演示项目:
。
•diguage/merge-demo-boot — 兼并项目,下面简称为 boot。
•diguage/merge-demo-web — 被兼并项目,下面简称为 web。
。
一、Jar 包引证。
。
这个方法,九天是给人形象最简略的方法。细心考虑一下,从保护性的视点来看,这个方法反而是最费事的方法,理由如下:
。
1.web 项目每次更新,都需求从头打包发布新版; boot 项目也需求跟着更新发布。拉一次屎,脱两次裤子。事实费事。
2.还需求考虑 web 项目的加载问题,相似下面要描绘的,是否共用容器:共用容器 — 这是最容器想到的方法。可是这种方法,需求处理 Bean 抵触的问题。不共用容器 — 这种方法需求处理 web 容器怎么加载的问题。默许应该是无法辨认。
3.。
依据这些考虑,这种方法直接被抛弃了。
。
二、库房兼并,抱歉一套容器。
。
这是第一次测验运用的计划。也是遇到问题最多的计划。
。
1.将两个库房做兼并。
1.将 web 库房的地址装备到 boot 项目里: git remo。te。ad。d web gitgithub.com:diguage/merge-demo-web.git;
2.在 boot 项目里,切出来一个分支: git switch -c web;
3.将 web 分支的提交清空: git update-ref -d HEAD,然后做一次提交;
4.将 web 项目的代码克隆到 web 分支上: git pull --rebase --allow-unrelated-hist。or。ies web master;留意,这儿需求加 --allow-unrelated-histories。 参数。,以答应不相干的库房进行兼并。
5.从 boot 项目的 master 分支上,切出来一个兼并分支: git switch -c merge;
6.将 web 项目向 boot 项目兼并: git merge --allow-unrelated-histories web;留意,这儿需求加 --allow-unrelated-histories 参数,以答应不相干的库房进行兼并。
7.处理代码抵触,完结兼并即可。
2.装备文件的兼并于归整。为了避免同名装备文件抵触,需求把 web 项目的装备文件调整到一个文件夹下,这儿设定为 web 目录。然后,需求把 web 项目的装备文件,让 boot 能够加载到。这个调整相对简略,只需求一个注解即可 ImportResource({"classpath:web/spring-cfg.xml"})。
3.调整完装备文件,接着遇到的问题便是上面说到的 Bean 抵触的问题。因为两个项目都拜访相同的数据库, Dao 及 Serv。ic。e 层许多许多类都是同名的。别的,在 web 项目里,Dao 是依据 iBATIS 开发的,而在 boot 项目里,DAO 是依据 MyBATIS 开发的。所以,只能给 web 项目的相关代码做重命名(谨慎一点是给 Spring Bean 的 beanName 做重命名操作)。这又带来了新问题:本来的项目里,注入方法是依据称号注入的,就需求改动许多的代码,给相关的 Bean 变量做重命名操作。这无形中增加了许多的复杂度和不确定性。
。
通过不断折腾,这种方法被逼抛弃。
。
三、库房兼并,Spring Boot 父子容器。
。
在通过上述方法折腾后,就想到了别的一个计划:能够考虑运用父子容器的方法来搞。接着就查到了这篇文章: Context Hierarchy with the Spring Boot Fluent Builder A。PI。。感觉这种方法挺不错,就测验了一下。
。
1.代码兼并及文件调整,跟上述过程相似,这个后边就不再赘述。
2.依照文章中的介绍,运用父子容器的方法来加载两个项目。代码如下:
3.原以为,这种方法归于父子两个容器,即便有同名的 Bean 应该也没有影响。可是,通过实践才发现,上面这个猜想是过错的。Spring Boot 在耳濡目染的时分,它背面做了检查,假如两个容器有同名的 Bean,它也会报错。也会带来像上述方法那样的许多重命名。折腾一两天,最终仍是抛弃了这种寄予厚望的方法。
p。ac。kage com.diguage.demo.boot;import org.springframework.boot.WebApplica。ti。onType;import org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.context.annotation.ComponentS。can。;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.ImportResource;/** * author D瓜哥 · https://www.diguage.com */public class DemoBootApplication { public static void main(String[] args) { new SpringApplicationBuilder() .parent(BootConfig.class).web(WebApplicationType.NONE) .child(WebConfig.class) // 假如有第三个项目,能够作为子容器的兄弟容器加载。 // .sibling(SiblingConfig.class) .run(args); } Configuration ImportResource({"classpath:spring-cfg.xml"}) ComponentScan(basePackages = "com.diguage.demo.boot") public static class BootConfig { } Configuration ImportResource({"classpath:web/spring-cfg.xml"}) public static class WebConfig { }}。
。 | Spring Boot 背面是否做了检查,这个是依据报错。信息。的猜想,没有翻看代码,所以这个猜想有必定的不确定性。有时机翻一下代码,检查一下详细原因。 |
革新没有成功,且听下回分解……。
下文:Spring 运用兼并之路(二):山穷水尽,山穷水尽。
审阅修改 黄宇。
内容来源:https://postapi.nlsngoisaoviet.com/app/app-1/cách hack kim cương free fire,https://chatbotjud-hml.saude.mg.gov.br/app-1/vai-de-bet-entrar
(责任编辑:最新热点)