Skip to content

Latest commit

 

History

History
135 lines (101 loc) · 8.11 KB

升级指南.md

File metadata and controls

135 lines (101 loc) · 8.11 KB

开发线认证修复:2.9.3-SNAPSHOT

从维护线回流认证修复,保留 dev 原有第三方平台版本。Current 继续消费 2.9.0.1-rc3,不能混用本开发快照。后续正式发布须成对选择不可变新版本,禁止覆盖已有 2.9.2。

  • common 使用 JDK 集合类及 jjwt-jackson 运行依赖,两种签名格式均需通过运行包验证。
  • boot 访问认证仅接受 access,refresh 仅用于刷新接口。报表/WebSocket 调用方应持有 access 并正常刷新。
  • 旧无 jti JWT 及其刷新祖先需重新登录,切换 v2 访问缓存命名空间;同一应用认证实例协调切换,无需清空 Redis。
  • 保留重复会话拒绝及撤销;回滚不得恢复已确认错误的认证路径。
  • 使用 JDK17,先安装 common 与两个独立 BOM,再测试、编译、安装 boot;使用独立 Maven 仓和空闲 Redis 测试端口隔离业务服务。
  • 在 boot 执行 python3 script/verify-jwt-runtime/verify.py /path/to/eap-server.jar --java-home /path/to/jdk17。仅使用包内依赖,两种格式各 10,000 次校验算法、jti 和唯一性,不能以静默回退作为兼容验证成功。
  • 下游消费前验证远端解析、依赖树及登录/刷新/登出。不包含生产发布或业务数据迁移授权。

EAP 升级指南

适用:eap-common、eap-boot 及所有基于 EAP BOM / Starter 的下游应用。 原则:版本与默认行为优先跟随 Spring Boot 官方 BOM;会破坏存量行为的兼容能力一律做成具名开关、默认关闭。

一、版本矩阵(2.9.2)

组件 版本 说明
JDK 17 编译与运行均要求 17(本机默认常为 21/25,编译前先核对 mvn -version)
Spring Boot 3.5.16 BOM 基线
Spring Framework 6.2.19 由 Boot BOM 管理
Spring Data 2025.0.13(Redis 4.1.x) 由 Boot BOM 管理
Spring AMQP 3.2.12 可信包默认收紧自 3.2.11 起
Spring Cloud 2025.0.1 eap-cloud-dependencies
Spring Cloud Alibaba 2025.0.0.0 内置 nacos-client 3.0.3,兼容 nacos-server 2.x,服务端无需升级
MyBatis-Plus 3.5.16 经 mybatis-plus-bom 统一管理
jsqlparser 5.2(默认)/ 4.9(应用可选) 停在 4.9 见 §4.3
POI 5.4.0;poi-ooxml-schemas 4.1.2 见 §4.2
revision 2.9.2 eap-common / eap-boot / eap-dependencies / eap-cloud-dependencies 四处同步

兼容跨度:2.9.x 为 JDK 17 + Spring Boot 3.5.16 基线。从 2.8.x(Boot 3.4.x/3.5.x)升级属 minor 升级, 无包名与自动配置机制断裂;从 Boot 2.x 升级需先完成 JDK 17 与 javax → jakarta 迁移。

二、升级步骤

  1. 环境:export JAVA_HOME=$(/usr/libexec/java_home -v 17),确认 mvn -version 为 17。
  2. 升级并安装 eap-common(必须走 flatten):
    cd eap-common && mvn -DskipTests install

    不要加 -Dflatten.skip=true:安装到本地仓库的 pom 会残留 ${revision} 占位符, 导致 eap-boot 解析 eap-boot-common:${revision} 失败。

  3. 验证 eap-boot:
    cd ../eap-boot
    mvn -q -U -DskipTests -Dflatten.skip=true compile
    mvn -q -Dflatten.skip=true test
  4. 下游应用:将 eap.version(或 eap-boot.version)改为 2.9.2;BOM 导入结构无需调整。
  5. 全量 mvn clean compile -DskipTests + 关键链路回归后再上线。

三、2.9.2 升级特性

  1. RabbitMQ 转换器
    • EapRabbitMQAutoConfiguration#createMessageConverter 增加 @ConditionalOnMissingBean(MessageConverter.class): 应用未自定义时行为不变;已自定义时默认 Bean 自动退让,保证 ObjectProvider#getIfUnique() 能选到唯一候选。
    • 新增 org.openea.eap.framework.mq.rabbitmq.core.TrustedRootJackson2JavaTypeMapper:一个根包覆盖其下所有子包, 替代“逐包枚举、新增消息包就复发”的写法。
  2. POI 死坐标修正:poi-ooxml-schemas 由 ${poi.version}=5.4.0 改为独立属性 4.1.2(该构件 POI 5.x 起已停发, 最后一个真实版本是 4.1.2);poi/poi-ooxml 仍保持 5.4.0(easyexcel 4.0.3 需要 POI 5.x)。
  3. 版本一致性:eap-dependencies、eap-cloud-dependencies 为 standalone pom,不继承根 ${revision}, 本版同步升到 2.9.2;否则 mvn 读取 POM 阶段即报 Non-resolvable import POM。
  4. 评估文档:新增 doc/2.9.2-升级下游回迁评估.md,记录下游升级改动的回迁结论与后续方案。

2.9.2 无破坏性 API 变更:新增类为纯新增,BOM 变更向后兼容,接收方可先升版本再按 §四 逐项核对。

四、下游注意事项(Checklist)

4.1 RabbitMQ(Boot 3.5.16 后必查)

Spring AMQP ≥ 3.2.11 把无参 Jackson2JsonMessageConverter 的默认可信包由 * 收紧为 [java.util, java.lang]。 收发自定义消息类型的应用必须自定义受信转换器:

@Bean
@Primary // 多候选时保证 getIfUnique() 能选中,否则监听容器会静默退回 SimpleMessageConverter
public Jackson2JsonMessageConverter rabbitMessageConverter() {
    Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
    converter.setJavaTypeMapper(new TrustedRootJackson2JavaTypeMapper("org.openea.eap"));
    return converter;
}
  • 生产端 RabbitTemplate 与消费端 @RabbitListener 共用同一转换器,保证 __TypeId__ 对称读写。
  • 历史消息若缺 __TypeId__,重放前必须补齐。

4.2 POI / easypoi

BOM 只修复“坐标不存在”的解析失败;仍使用 easypoi 4.x 的应用需继续在应用侧钉 POI 4.x(属应用依赖选择,不是 BOM 缺陷)。

4.3 jsqlparser 停在 4.9(动态 SQL 直接使用 4.x API 时)

  1. 应用根 POM 钉 com.github.jsqlparser:jsqlparser:4.9;mybatis-plus-jsqlparser-4.9 无需声明版本(BOM 已管理)。
  2. 排除 eap-spring-boot-starter-mybatis 传递的 mybatis-plus-jsqlparser(按 5.x 编译,与 4.9 混用会在分页/多租户拦截器运行期 NoSuchMethodError)。
  3. 启动模块显式引入 mybatis-plus-jsqlparser-4.9。
  • 注意:ParenthesedSelect 需取 getSelect() 再判断 PlainSelect,直接 instanceof 会静默不裁剪。

4.4 MySQL / Connector-J

  • 驱动跟随 Boot BOM(9.x),不要降级,也不要再使用 mysql:mysql-connector-java 旧坐标。
  • Connector/J ≥ 8.0.23 起 DATETIME 的 getObject() 返回 LocalDateTime,存量 (Date) 强转会抛 ClassCastException: 用官方参数 treatMysqlDatetimeAsTimestamp=true 兼容,或把代码改造为 java.time。

4.5 自动配置覆盖

不要以同 FQCN 整体拷贝 starter 类(如 EapWebAutoConfiguration)做定制,应改为注册增量 HttpMessageConverter Bean。 整类拷贝会随上游签名变更静默漂移(例如 ApiErrorLogApi → ApiErrorLogCommonApi)。

4.6 已知未修(后续版本处理)

Redis Stream pending 无限重投:消费异常不 ack,RedisPendingMessageResendJob 把 pending 复制成新记录, 业务持续失败时每 5 分钟复制一次。2.9.2 期间需在业务消费者做幂等短路;框架侧治理方案见评估文档 §5.1。

4.7 JWT jti 兼容说明(Unreleased)

  • JWT 新旧签发路径新增随机 jti,现有 generateJwtToken 方法签名以及 username、sub 等既有 claims 不变。
  • 已签发的旧 token 仍按原方式校验;旧消费者会忽略不认识的 jti,无需同步改造。
  • 兼容期可通过 JwtUtil.isJwtWithoutId 识别无 jti 的历史 JWT,并执行更严格的持久化校验;UUID 等 不透明 token 不会被误判,不影响非 JWT 模式的缓存性能。
  • jti 只负责令牌唯一性,不替代业务身份:平台内部仍使用 userId,外部系统关联仍使用 userKey。

4.8 代码规范

生产代码不要使用 assertj 工具类(org.assertj.core.util.*),改用 JDK 集合或 hutool。

五、参考

  • doc/2.9.2-升级下游回迁评估.md:下游升级改动回迁结论、jsqlparser 配方、后续治理方案。
  • AGENTS.md:协作约定与构建/验证命令。
  • README.md:模块结构与部署边界。