You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.6 KiB
3.6 KiB
| name | overview | todos | |||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 测试要求增强与权限方案优化 | 1. 增强测试要求:代码级100%覆盖(每个类/方法/if-else/case分支)、测试前置流程(修改后必须先测试通过才能继续);2. 权限实时生效方案从"数据库轮询标记"改为"Redis Pub/Sub",利用已有Redis实例零额外中间件 |
|
用户需求
需求1:权限实时生效方案优化
当前方案"数据库轮询标记 + Spring Event"每5秒轮询一次数据库,资源消耗大。需要改为更轻量的方案,利用已有Redis实例实现毫秒级权限变更通知,零额外中间件、零数据库压力。
需求2:测试要求增强
- 100%代码级覆盖:每个类、方法、包括方法里if-else、case分支都必须测试到
- 测试前置流程:每次代码修改后,必须先进行测试,测试通过后才能进行下一步操作
方案概述
一、权限实时生效:Redis Pub/Sub 替代数据库轮询
原理:权限变更时通过 Redis PUBLISH 命令发布消息,各服务节点通过 MessageListener 订阅频道,收到消息后刷新本地权限缓存。
优势对比:
| 对比项 | 数据库轮询(原方案) | Redis Pub/Sub(新方案) |
|---|---|---|
| 数据库压力 | 每5秒N次SQL | 0(不碰数据库) |
| 延迟 | 最大5秒 | 毫秒级(内存操作) |
| 资源消耗 | 定时线程+DB连接 | 复用已有Redis连接,几乎零额外开销 |
| 多节点支持 | 需每节点轮询 | 天然支持(每节点各自订阅) |
| 降级策略 | 无 | Redis断连时,权限缓存TTL(2小时)到期后自然刷新 |
实现要点:
- 频道命名:
permission:changed - 消息内容:版本号(Long),用于判断是否需要刷新
- 发布时机:角色权限变更、用户角色分配变更
- 订阅方:各服务实例启动时注册
RedisMessageListenerContainer - 降级保障:Redis连接断开时不影响业务,缓存TTL到期后自动刷新
二、测试要求增强
- 单元测试覆盖率从70%提升至100%(行覆盖+分支覆盖)
- 新增JaCoCo分支覆盖指标要求
- 新增"9.6 测试前置流程"章节,定义代码修改→测试→下一步的强制流程
- 在7.8代码审查要求中增加测试覆盖率检查项
修改范围
3个文档,共约12处修改点:
- docs/08-项目技术要求.md(9处)
- 3.1 权限变更实时通知:方案描述+代码示例
- 3.3 跨实例通信描述
- 5.3 缓存策略表
- 7.8 代码审查要求
- 8.4 缓存管理策略表
- 9.1 单元测试:覆盖率和分支要求
- 9.2 集成测试:权限生效延迟描述
- 新增9.6 测试前置流程
- 10.3 配置项:删除轮询间隔,新增Redis频道配置
- docs/03-业务流转逻辑.md(1处)
- 2.3 权限实时生效流程中的描述
- docs/01-模块划分.md(1处)
- 2.4 权限实时生效机制中的描述