张帆
张帆
Published on 2025-09-16 / 183 Visits
0
0

imom-framework 3.X框架升级文档

框架从2.X升级至3.X

imom-framework 3.X框架基于JDK21 + SpringBoot3.5.5 + Mybatis-Flex11.1

1. 背景介绍

1.1 项目背景

● 旧框架存在依赖混乱,互相依赖严重,且模块职责不清晰

● 旧框架的依赖由各项目管控,造成个项目依赖版本差异化,不利于统一管控与升级

● 旧框架TTL管控不强,职责不清晰,导致项目使用的TTL复杂,容易出错,排查定位问题难度也高

● 旧框架未使用同一个的仓库管理,项目升级时需要改动多个模块,影响项目升级效率,且容易漏升级

● 旧项目启动时扫描范围过大,加载类过多,易造成服务启动慢,内存占用多

● 项目的工具类使用太随意,比如说使用了kotlin、nacos的工具类

1.2 项目价值

1. 加强框架版本管控能力,简化升版改动的包,优化现有框架包依赖混乱,代码混乱的局面

1.3 关键升级内容

● 统一框架TTL管控

● 统一通用拦截器、提升拦截器性能

● 重新改造common包,增加通用功能

● 调整框架包依赖逻辑

● 去掉无效的框架包,整合框架包

2. 新架构

https://doc.weixin.qq.com/flowchart-addon

 

3. 项目升级指引

3.1 调整POM

参考:http://192.168.175.208/imom/public/imom-demo.git

    父项目继承imom-dependency
    <parent>
        <groupId>com.sie.mbm.mom</groupId>
        <artifactId>imom-dependency</artifactId>
        <version>3.1.0-SNAPSHOT</version>
    </parent>

原则:

● 父项目依赖继承imom-dependency(维护三方包、插件、框架包),项目上依赖的其他项目api版本由项目维护, 后期项目升级是如果要升级框架版本的话可以调整imom-dependency版本

● XXX-api工程只依赖framework-common, 如果出现依赖其他项目api或者mom-sdk的情况,需要优化(新建DTO不要引用其他api DTO)

● XXX-biz工程依赖framework-core, 其他依赖按需引用

3.2 包路径调整

目前需要替换包已经做成了工具方法(在demo仓库),直接运行即可,可以自动替换部分代码,对于工具没有替换的包则要手工调整

仓库:
http://192.168.175.208/imom/public/imom-demo.git
升级工具方法:(需要替换UpdateToolTest类中的path为项目目录)
com.sie.mbm.mom.demo.UpdateToolTest#updateClassPackage

3.3 启动类调整

● 所有包扫描的原则都是按需扫描,不要扫一个大而全的父包

● MapperScan调整到启动类,factoryBean = DbTypeMapperFactoryBean.class用于DME切换为传统数据库

@EnableScheduling
@EnableOpenApi("demo")
//@EnableFeignClients 按需扫描feign包
@SpringBootApplication
// 按需扫描mapper, factoryBean配置DbTypeMapperFactoryBean,用来支持DME切换数据库
@MapperScan(basePackages = {"com.sie.mbm.mom.demoproject.mapper"}, factoryBean = DbTypeMapperFactoryBean.class)
public class DemoProjectBizApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoProjectBizApplication.class, args);
    }
}

3.4 配置调整

● 检查下项目自建的过滤器,目前对idme和华为mbm接口的配置框架通过framework-db已经做了适配,项目不需要再次设值(可搜索DmeProxyConfiguration、MbmProxyConfiguration);对于TTL的设值也是不需要的,例如之前对租户、用户的TTL设置,目前统一调整为框架自动注入的的ThreadContextHolder

● 有些项目内的MapperScan放在配置类上,建议放在启动类上,便于直观查找

● Redis配置调整,SpringBoot3.X 调整了Reids的配置路径,由spring.redis 调整为 spring.data.redis

如:

● Feign配置调整,SpringBoot3.X 调整了Feign的配置路径,由feign.client 调整为 spring.cloud.openfeign.client;删除或关闭feign的压缩配置compression

如:

● 网关配置调整

1、SpringBoot3.X 调整了SpringGateway的配置路径,由spring.cloud.gateway调整为 spring.cloud.gateway.server.webflux

2、新版imom-gateway废弃了一些冗余功能,配置做如下调整

3、增加knife4j配置

  1. 开启虚拟线程提升性能(可写在common.yml)

3.5 代码调整(源代码都已deploy,可以拉源码看注释)

3.5.1 TTL修改

TTL采用此类统一管理ThreadContextHolder,

com.sie.mbm.mom.framework.common.ttl.ThreadContextHolder

ThreadContextHolder目前维护三块

  • UserInfo:用户上下文,用户信息、登录相关信息,支持子线程传递; 特别注意使用UserInfo获取用户信息时,要明确取的是id(sie系统记录的用户id)还是hwUserId(华为的用户id),替换的时候要特别注意

  • TransactionInfo:事务上下文,记录事务信息,不支持子线程传递

  • BusinessInfo:业务功能使用的上下文,不支持子线程传递

如果项目中有自建Filter的情况(例如UserFilter),请酌情去掉多余的上下文设值,如果自建的Filter没有其他功能的话可以直接删掉这个类

3.5.2 登录修改

有很多项目需要用到手工登录,可以去掉项目中的逻辑,框架已经封装了登录方法,参见: com.sie.mbm.mom.framework.common.handler.LoginHandle

3.5.3 Redis缓存工具调整

RedisOperator、RedisHelper可统一调整为使用CacheHelper

3.5.4 MybatisPlus调整

● 项目不依赖MybatisPlus,所有使用到的MybatisPlus项目的类都要调整,没用到的就删掉,启动类也无需排除MybatisPlus自动装配类

● XXXEntity不要继承com.baomidou.mybatisplus.extension.activerecord.Model

3.5.5 Service基类

● 框架增加了com.sie.mbm.mom.framework.core.service.BaseServiceImpl基类,项目可选择继承,该类目前实现了标准字段的创建人和修改人名转换

3.5.6 断言调整

● DmeAssert调整为AssertUtils,即com.sie.mbm.mom.framework.sentinel.utils.DmeAssert调整为com. sie. mbm. mom. framework. common. util. AssertUtil,需要注意AssertUtil修复了DmeAssert作为断言时的不规范处理,AssertUtil断言的是符合条件,不符合的话则抛出异常,这点与DmeAssert判断相反

3.6 工具类使用规约

● 工具类查找顺序: hutool工具 > apache.commons工具 > framework.common工具 > 项目自己的工具类

3.7 避坑

  • 加了@Async的方法不能有返回值,如有一定要返回,要返回一个Future,详情参考Spring官方文档

  • 建议使用较新版本的idea,旧版本的idea可能对jdk21的支持不够全面(推荐2024.1.3之后的版本)

 

 

 

 

 

 


Comment