框架从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配置

开启虚拟线程提升性能(可写在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之后的版本)