首页 > 其他分享 >Spring 应用合并之路(一):摸石头过河

Spring 应用合并之路(一):摸石头过河

时间:2024-10-28 11:19:54浏览次数:5  
标签:容器 git 过河 web Spring 项目 boot 石头 合并

作者:京东科技 李君

公司最近一年在推进降本增效,在用尽各种手段之后,发现应用太多,每个应用都做跨机房容灾部署,则最少需要 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 remote add web [email protected]: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-histories 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 及 Service 层很多很多类都是同名的。另外,在 web 项目里,Dao 是基于 iBATIS 开发的,而在 boot 项目里,DAO 是基于 MyBATIS 开发的。所以,只能给 web 项目的相关代码做重命名(严谨一点是给 Spring Bean 的 beanName 做重命名操作)。这又带来了新问题:原来的项目里,注入方式是根据名称注入的,就需要改动大量的代码,给相关的 Bean 变量做重命名操作。这无形中增加了很多的复杂度和不确定性。

 

经过不断折腾,这种方式被迫放弃。

 

三、仓库合并,Spring Boot 父子容器

 

在经过上述方式折腾后,就想到了另外一个方案:可以考虑使用父子容器的方式来搞。接着就查到了这篇文章: Context Hierarchy with the Spring Boot Fluent Builder API。感觉这种方式挺不错,就尝试了一下。

 

1.代码合并及文件调整,跟上述步骤类似,这个后面就不再赘述。 2.按照文章中的介绍,使用父子容器的方式来加载两个项目。代码如下: 3.原以为,这种方式属于父子两个容器,即使有同名的 Bean 应该也没有影响。但是,经过实践才发现,上面这个猜测是错误的。Spring Boot 在启动的时候,它背后做了检查,如果两个容器有同名的 Bean,它也会报错。也会带来像上述方式那样的大量重命名。折腾一两天,最后还是放弃了这种寄予厚望的方式。
package com.diguage.demo.boot;

import org.springframework.boot.WebApplicationType;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
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 应用合并之路(二):峰回路转,柳暗花明

标签:容器,git,过河,web,Spring,项目,boot,石头,合并
From: https://www.cnblogs.com/Jcloud/p/18510094

相关文章

  • springboot项目log
    目录logbackinfo和error独立文件yaml配置logback-spring.xmllogbackspring默认日志info和error独立文件yaml配置#日志文件配置logging:file:name:${user.home}/logs/${spring.application.name}.log#日志文件名,全路径level:#配置自己写的MyBatisMa......
  • springboot琴行培训机构管理系统-计算机毕业设计源码49732
    目 录摘要1绪论1.1研究背景1.2 研究意义1.3论文结构与章节安排2 系统分析2.1可行性分析2.2系统流程分析2.2.1数据新增流程2.2.2 数据删除流程2.3 系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4本章小结3系统总体设计3.1系......
  • 【Java】【SpringBoot】i18n国际化
    前提SpingBoot项目已添加Web依赖步骤打开资源管理器(resources)新建i18n文件夹。右击,创建资源包。当然,后续也可以添加语言包注:名称一定要messages向资源包添加学习区域设置对应配置文件语言信息中文简体(messages_zh_cn.properties)sys.config.newParameters=新增参......
  • JAVA开源项目 基于Vue和SpringBoot甘肃非物质文化网站
    本文项目编号T042,文末自助获取源码\color{red}{T042,文末自助获取源码}......
  • JAVA开源项目 基于Vue和SpringBoot网上购物商城
    本文项目编号T041,文末自助获取源码\color{red}{T041,文末自助获取源码}......
  • 基于Springboot+Vue的候鸟监测数据管理系统 (含源码数据库)
    1.开发环境开发系统:Windows10/11架构模式:MVC/前后端分离JDK版本:JavaJDK1.8开发工具:IDEA数据库版本:mysql5.7或8.0数据库可视化工具:navicat服务器:SpringBoot自带apachetomcat主要技术:Java,Springboot,mybatis,mysql,vue2.视频演示地址3.功能这个系......
  • 基于Springboot+Vue的企业绩效考核管理系统 (含源码数据库)
    1.开发环境开发系统:Windows10/11架构模式:MVC/前后端分离JDK版本:JavaJDK1.8开发工具:IDEA数据库版本:mysql5.7或8.0数据库可视化工具:navicat服务器:SpringBoot自带apachetomcat主要技术:Java,Springboot,mybatis,mysql,vue2.视频演示地址3.功能该系统......
  • 基于SpringBoot的中药材进存销管理系统设计与实现
    摘要  中药材进存销管理系统是为了满足中药材生产和销售企业的高效管理需求,涵盖了药材采购、库存管理和销售跟踪等主要功能。本系统采用SpringBoot框架进行开发,结合了前端和数据库设计,构建了一个实用的中药材管理平台,为企业提供数据化、智能化的解决方案,助力中药材产业......
  • 基于SpringBoot的流浪动物管理系统设计与实现
    摘要  随着流浪动物数量的增加,如何有效管理这些动物成为社会关注的重要问题。基于SpringBoot框架的流浪动物管理系统,旨在通过信息化手段提高流浪动物的管理效率,帮助管理人员记录、追踪、安置和处理流浪动物的信息。该系统集成了用户管理、动物信息管理、领养管理、公告......
  • 【拯救大学生毕业设计】基于SpringBoot的在线拍卖系统(附源码)
    每日更新附赠源码的毕设资料,源码下载是免费的,可以把文章分享给有需要的同学哦!!!摘  要随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类......