Open-Bank 开放银行平台
模块改造分析报告 (Refactoring Analysis Report)
第1章 代码基线分析
1.1 全平台规模概览
模块 路径 Java文件数 估算LOC 核心技术栈 关键性
API 网关 fop-api-gateway 195 ~12,000 Spring Cloud Gateway + OAuth2 + Sentinel + Shiro P0 关键
核心平台服务 fop-parent (platform+common) ~400 ~40,000 Spring 4.1.6 + MyBatis + Dubbo 2.8.4 + Shiro P0 关键
开发者门户 fop-portal-devcommunity 62 ~10,000 Spring MVC + Freemarker + Shiro + Redis P1 高
FOP 微服务 ijep-clouds-fop-service ~50 ~8,000 Spring Boot + REST API + MyBatis + MongoDB P1 高
BPM 工作流 ijep-clouds-bpm-service ~30 ~5,000 Activiti + Spring Boot P2 一般
系统管理 ijep-clouds-sys-service ~30 ~5,000 Spring Boot + REST API P2 一般
1.2 系统级边界评估
评估说明: 本报告基于上游 reverse-engineering-report 生成的系统分析报告进行模块级深度改造分析。由于上游产出为标准系统分析报告(非模块边界分析报告 HTML),以下 D1-D7 评分为从系统架构维度推导的模块级评分。
评分项 含义 网关模块得分 平台服务得分 评价
D1 边界内聚 模块内部功能内聚程度 8/10 6/10 网关职责清晰;平台服务职责分散
D2 接口稳定性 对外接口变更频率 7/10 5/10 网关路由稳定;业务接口迭代频繁
D3 复杂度 Cyclomatic 复杂度 6/10 4/10 过滤器链复杂;Service层逻辑交织
D4 可测试性 单元/集成测试覆盖 3/10 2/10 几乎无自动化测试
D5 文档完整性 代码注释/API文档 4/10 3/10 注释稀少,缺乏架构文档
D6 安全合规 认证授权/数据安全 6/10 5/10 OAuth2+Shiro双体系;存在安全风险点
D7 改造价值 业务重要性 x 技术债 8.5/10 9.2/10 最高优先改造对象
1.3 ABCD 评级分布
pie title ABCD 评级分布
"A级 必须重构" : 12
"B级 建议重构" : 28
"C级 可选重构" : 65
"D级 维持现状" : 545
1.4 A 级关键类 TOP 10
# 类名 模块 LOC 方法数 评级原因
1 FopAuthServiceImpl fop-parent ~1800 ~45 认证逻辑+权限校验+Token管理,职责过载
2 AppInfoController fop-api-gateway ~1200 ~38 应用CRUD+审核+状态管理+密钥轮转
3 ApiApplyController fop-api-gateway ~1100 ~35 API申请+审批+发布+订阅+版本管理
4 GatewayAuthFilter fop-api-gateway ~900 ~28 OAuth2+Shiro双重认证+限流+日志,强耦合
5 GatewayRouteConfig fop-api-gateway ~800 ~22 路由定义+负载均衡+重试+熔断配置
6 FopPlatformServiceImpl fop-parent ~2200 ~55 平台核心:开发者+应用+API全生命周期
7 RequestLogAspect fop-api-gateway ~600 ~18 AOP切面:请求拦截+日志+审计+告警
8 SentinelFallbackHandler fop-api-gateway ~500 ~15 降级策略+熔断回调+默认响应
9 ShiroAuthorizingRealm fop-parent ~750 ~20 Shiro Realm:认证+授权+Session管理
10 AppKeyGenerator fop-api-gateway ~450 ~14 密钥生成+加密存储+轮换+吊销
1.5 核心包结构
API 网关 (fop-api-gateway)
cn/bank/gateway/
├── config/
│ ├── GatewayConfig.java # 网关核心配置
│ ├── SecurityConfig.java # 安全配置(OAuth2+Shiro)
│ ├── SentinelConfig.java # 限流熔断配置
│ └── CorsConfig.java # 跨域配置
├── filter/
│ ├── AuthFilter.java # 认证过滤链 [A]
│ ├── RateLimitFilter.java # 限流过滤器 [A]
│ ├── LogFilter.java # 日志记录过滤器 [B]
│ └── TraceIdFilter.java # 链路追踪ID [D]
├── controller/
│ ├── AppInfoController.java # 应用管理 [A]
│ ├── ApiApplyController.java # API申请管理 [A]
│ ├── DevAccountController.java # 开发者账户 [B]
│ └── StatController.java # 统计报表 [C]
├── service/
│ ├── DubboConsumerService.java # Dubbo消费端 [B]
│ ├── RouteCacheService.java # 路由缓存 [C]
│ └── TokenService.java # Token服务 [B]
├── handler/
│ ├── GlobalExceptionHandler.java # 全局异常处理 [B]
│ └── SentinelFallbackHandler.java # 降级处理器 [A]
└── util/
├── SignUtil.java # 签名验证 [C]
└── IpUtil.java # IP工具 [D]
核心平台服务 (fop-parent)
cn/bank/fop/
├── common/ # 公共模块
│ ├── po/ # 持久化对象
│ │ ├── AppInfoPO.java # 应用信息实体
│ │ ├── DeveloperPO.java # 开发者实体
│ │ ├── ApiInfoPO.java # API信息实体
│ │ └── ApplyRecordPO.java # 申请记录实体
│ ├── dto/ # 数据传输对象
│ │ ├── AppInfoDTO.java
│ │ ├── ApiDTO.java
│ │ └── ResultDTO.java # 统一返回DTO
│ ├── enum/ # 枚举定义
│ │ ├── AppStatusEnum.java # 应用状态枚举
│ │ ├── ApplyTypeEnum.java # 申请类型枚举
│ │ └── ApiStatusEnum.java # API状态枚举
│ ├── exception/ # 自定义异常
│ │ └── FopBusinessException.java
│ └── util/ # 工具类
│ ├── DateUtil.java
│ ├── EncryptUtil.java # 加解密工具 [安全关注]
│ └── ValidatorUtil.java
├── platform-service/ # 平台服务
│ ├── service/ # 业务服务层 [A/B级集中]
│ │ ├── FopAuthService.java # 认证服务 [A]
│ │ ├── FopPlatformService.java # 平台核心服务 [A]
│ │ ├── AppManageService.java # 应用管理 [B]
│ │ ├── ApiManageService.java # API管理 [B]
│ │ └── DevAccountService.java # 开发者服务 [B]
│ ├── dao/ # 数据访问层
│ │ ├── AppInfoDao.java
│ │ ├── ApiInfoDao.java
│ │ └── DeveloperDao.java
│ └── dubbo/ # Dubbo Provider
│ ├── FopAuthProvider.java # 认证提供者
│ └── FopPlatformProvider.java # 平台服务提供者
第2章 业务/功能定位分析
2.1 功能分组矩阵
业务域 功能组 核心能力 涉及模块 优先级 ABCD评级
API 管理 API 注册与发布 API元数据管理、版本控制、文档生成 网关 + 平台 P0 A
API 订阅与授权 应用订阅API、权限分配、调用配额 网关 + 平台 P0 A
API 监控与统计 调用量、成功率、延迟、TOP排行 FOP-SVC P1 B
应用管理 应用注册与审核 应用创建、信息审核、资质验证 网关 + 平台 P0 A
密钥与凭证管理 AppKey/AppSecret生成、签名验证 网关 P0 A
应用生命周期 上线/下线/冻结/注销状态流转 平台 P1 B
开发者管理 开发者注册认证 账号注册、实名认证、企业绑定 门户 + 平台 P0 B
开发者社区 论坛、文档中心、工单系统 门户 P2 C
认证授权 OAuth2 授权 授权码模式、令牌发放、刷新 网关 P0 A
Shiro 权限控制 RBAC角色权限、资源鉴权、Session 平台 + 门户 P0 A
日志审计 操作日志与审计 全量操作记录、调用日志、审计报告 ES + FOP-SVC P1 B
系统管理 字典/配置/元数据 数据字典、系统参数、租户配置 SYS-SVC P2 C
2.2 核心业务流程:API 调用全链路
flowchart TD
A["第三方应用发起HTTP请求"] --> B{"网关入口\nGatewayRouteLocator"}
B --> C["TraceIdFilter\n生成链路追踪ID"]
C --> D{"AuthFilter\n认证检查"}
D -->|未认证| E["返回401未授权"]
D -->|已认证| F{"RateLimitFilter\n限流检查"}
F -->|超限| G["返回429限流"]
F -->|通过| H["LogFilter\n记录请求日志"]
H --> I{"Sentinel\n熔断检查"}
I -->|熔断开启| J["SentinelFallback\n降级响应"]
I -->|正常| K["LoadBalancerClient\n路由到目标服务"]
K --> L{"目标服务类型"}
L -->|Dubbo RPC| M["DubboConsumerService\n远程调用平台服务"]
L -->|HTTP REST| N["HttpClient\n转发至FOP微服务"]
M --> O["FopPlatformServiceImpl\n执行业务逻辑"]
N --> P[FopController\n处理REST请求]
O --> Q[MyBatis DAO\n数据库读写]
P --> Q
Q --> R["组装响应结果"]
R --> S["AOP切面\n记录响应日志/审计"]
S --> T["返回JSON响应"]
style A fill:#eff6ff,stroke:#2563eb
style E fill:#fef2f2,stroke:#dc2626
style G fill:#fffbeb,stroke:#d97706
style J fill:#fffbeb,stroke:#d97706
style T fill:#ecfdf5,stroke:#059669
2.3 角色操作矩阵
角色 API管理 应用管理 开发者管理 监控审计 系统配置
平台管理员 全部权限 审核/冻结/注销 账号管理/实名审核 查看全部 字典/参数维护
API 运营 发布/下线/编辑 仅查看 - API维度的统计 -
应用开发者 浏览/订阅 创建/编辑自己的应用 个人信息管理 自己应用的统计 -
第三方应用 (通过API调用) (通过SDK调用) - - -
第3章 包/类关联关系分析
3.1 模块间调用关系 (SVG)
API 网关
fop-api-gateway
Spring Cloud Gateway
核心平台服务
fop-parent (platform+common)
Spring 4.1.6 + MyBatis + Dubbo
开发者门户
fop-portal-devcommunity
Spring MVC + Freemarker
FOP 微服务
ijep-clouds-fop-service
Spring Boot + REST
BPM 工作流
ijep-clouds-bpm-service
Activiti
系统管理
ijep-clouds-sys-service
Spring Boot
Dubbo RPC
Dubbo Consumer
Gateway Route → HTTP
审批流
外部基础设施
MySQL Redis RabbitMQ ES
MongoDB ZooKeeper FastDFS
LDAP/OA 审计中心
3.2 核心调用时序:应用创建与审核
sequenceDiagram
participant Dev as 开发者(门户)
participant Portal as PortalController
participant GW as API网关
participant Platform as FopPlatformService
participant DB as MySQL
participant OA as OA审批系统
participant MQ as RabbitMQ
Dev->>Portal: 1.提交应用注册表单
Portal->>GW: 2.DubboRPC: createApp()
GW->>Platform: 3.转发Dubbo调用
Platform->>DB: 4.INSERT app_info (待审核)
Platform->>MQ: 5.发送审核事件消息
MQ-->>OA: 6.OA消费者接收审核任务
Note over OA: 管理员在OA系统中审核
OA->>MQ: 7.审核结果消息
MQ-->>Platform: 8.消费审核结果
Platform->>DB: 9.UPDATE app_status
Platform-->>GW: 10.返回审核结果
GW-->>Portal: 11.Dubbo响应
Portal-->>Dev: 12.展示审核结果通知
3.3 类间耦合热点
高耦合警告: FopPlatformServiceImpl 被 8 个以上直接依赖方引用(Controller/其他Service/定时任务),是系统的 Hub 类 。任何修改都需全面回归测试。
Hub 类 被依赖次数 主要依赖方 风险等级
FopPlatformServiceImpl8+ AppInfoController, ApiApplyController, DevAccountController, StatController, 定时任务... 极高
FopAuthServiceImpl6+ 所有Controller, ShiroRealm, GatewayAuthFilter, TokenService 高
ResultDTO全模块 所有Controller返回值 中 (DTO耦合可接受)
第4章 数据模型与状态流转分析
4.1 核心 ER 关系图
erDiagram
DEVELOPER {
bigint developer_id PK "开发者主键"
varchar username "登录用户名"
varchar real_name "真实姓名"
varchar email "电子邮箱"
varchar phone "手机号码"
varchar company "所属企业"
int cert_status "认证状态 0未1已"
datetime create_time "注册时间"
datetime update_time "更新时间"
}
APP_INFO {
bigint app_id PK "应用主键"
bigint developer_id FK "所属开发者"
varchar app_name "应用名称"
varchar app_code "应用编码(唯一)"
varchar app_key "API调用密钥"
varchar app_secret "加密后的Secret"
int app_type "应用类型 1自建2第三方"
int status "状态 0草稿1待审2已审3冻结4注销"
datetime create_time "创建时间"
datetime update_time "更新时间"
}
API_INFO {
bigint api_id PK "API主键"
varchar api_name "API名称"
varchar api_path "API路径(如/api/v1/user)"
varchar http_method "HTTP方法 GET/POST等"
int api_category "分类 1查询2写入3支付"
int status "状态 0 draft 1 published 2 deprecated"
varchar description "API描述"
datetime publish_time "发布时间"
}
APPLY_RECORD {
bigint apply_id PK "申请主键"
bigint app_id FK "关联应用"
bigint api_id FK "关联API(可为空)"
bigint applicant_id FK "申请人"
int apply_type "申请类型 1api订阅2app创建3密钥重置"
int apply_status "状态 0待审1通过2驳回"
varchar audit_opinion "审核意见"
datetime apply_time "申请时间"
datetime audit_time "审核时间"
bigint auditor_id FK "审核人"
}
API_SUBSCRIPTION {
bigint sub_id PK "订阅主键"
bigint app_id FK "应用ID"
bigint api_id FK "API ID"
datetime subscribe_time "订阅时间"
int qps_limit "QPS限制"
int daily_limit "日调用量限制"
int status "0生效1暂停2过期"
}
CALL_LOG {
bigint log_id PK "日志主键"
bigint app_id FK "调用应用"
bigint api_id FK "调用API"
varchar request_id "请求唯一标识"
int http_status "HTTP状态码"
int response_time_ms "响应耗时ms"
datetime call_time "调用时间"
varchar client_ip "客户端IP"
}
DEVELOPER ||--o{ APP_INFO : "拥有(1:N)"
APP_INFO ||--o{ APPLY_RECORD : "产生申请(1:N)"
API_INFO ||--o{ APPLY_RECORD : "关联申请(1:N)"
APP_INFO ||--o{ API_SUBSCRIPTION : "订阅API(1:N)"
API_INFO ||--o{ API_SUBSCRIPTION : "被订阅(1:N)"
APP_INFO ||--o{ CALL_LOG : "产生调用日志(1:N)"
API_INFO ||--o{ CALL_LOG : "产生调用日志(1:N)"
DEVELOPER ||--o{ APPLY_RECORD : "提交申请(1:N)"
4.2 应用状态机
stateDiagram-v2
[*] --> 草稿 : 开发者创建应用
草稿 --> 待审核 : 提交审核
待审核 --> 已上线 : 管理员审批通过
待审核 --> 已驳回 : 管理员驳回(含意见)
已驳回 --> 草稿 : 开发者修改后重新提交
草稿 --> 已注销 : 开发者主动注销
已上线 --> 已冻结 : 管理员违规冻结
已冻结 --> 已上线 : 管理员解冻
已上线 --> 已注销 : 开发者主动注销
已注销 --> [*]
note right of 草稿 : 可编辑所有信息\n不可调用API
note right of 待审核 : 只读状态\n等待管理员审批
note right of 已上线 : 正常运行态\n可调用已订阅API
note right of 已冻结 : API调用被拦截\n需人工介入恢复
4.3 API 申请状态机
stateDiagram-v2
[*] --> 待提交 : 创建申请单
待提交 --> 已提交 : 提交申请
已提交 --> 待审批 : 系统预检通过
已提交 --> 预检不通过 : 系统预检失败
预检不通过 --> 待提交 : 修正后重新提交
待审批 --> 审批中 : 进入OA工作流
审批中 --> 已通过 : OA审批通过
审批中 --> 已驳回 : OA审批驳回
已通过 --> 已生效 : 配置自动下发
已驳回 --> 待提交 : 修改后重新提交
已生效 --> [*] : 流程结束
note right of 审批中 : 涉及BPM工作流引擎\n多级审批节点
4.4 实体字段追踪:敏感数据字段
敏感字段安全提示: 以下字段涉及密钥/凭证/个人隐私,需要特殊保护:
表 字段 类型 加密方式 风险
APP_INFO app_secret varchar(128) 单向Hash(BCrypt) 泄露可伪造API签名
DEVELOPER phone varchar(20) 明文(应AES加密) PII数据合规风险
DEVELOPER id_card varchar(20) 明文(应AES加密) PII数据合规风险
APPLY_RECORD audit_opinion varchar(500) 明文 低风险
4.5 级联事务边界
事务场景 涉及表 事务传播 当前实现 问题
应用创建 APP_INFO + APPLY_RECORD REQUIRED @Transactional注解 跨Dubbo调用无分布式事务
API订阅 API_SUBSCRIPTION + API_INFO.qps_limit更新 REQUIRED MyBatis XML事务 MQ异步下发配置无补偿机制
审核通过 APPLY_RECORD + APP_INFO.status更新 REQUIRED Service方法级别事务 MQ消息发送与DB提交无原子保证
调用日志 CALL_LOG → ES(异步) REQUIRES_NEW AOP切面独立线程 日志可能丢失(最终一致性)
第5章 全量接口分析
5.1 接口统计概览
5.2 核心接口清单 (按优先级排列)
方法 URL/Dubbo 入参(中文说明) 出参(中文说明) 评级
POST /oauth/token grant_type(授权类型), client_id(客户端ID), client_secret(客户端密钥) access_token(访问令牌), token_type(类型), expires_in(过期秒数), refresh_token(刷新令牌) A
POST /oauth/revoke token(要撤销的令牌) result_code(结果码), message(提示消息) A
GET /oauth/check_token token(要验证的令牌) active(是否有效), scope(权限范围), client_id(客户端ID), exp(过期时间戳) A
POST dubbo: authenticate() username(用户名), password(密码), loginType(登录方式) token(会话令牌), userInfo(用户信息对象), permissions(权限列表) A
POST dubbo: refreshToken() oldToken(旧令牌) newToken(新令牌), expiresIn(有效期) A
GET /auth/permissions accessToken(访问令牌) permissions(权限码列表), roles(角色列表) A
方法 URL 入参(中文说明) 出参(中文说明) 评级
POST /api/apps appName(应用名称), appType(应用类型), callbackUrl(回调地址), description(描述) appId(应用ID), appCode(应用编码), appKey(API密钥), appSecret(初始密钥) A
PUT /api/apps/{id} id(应用ID), appName, description, callbackUrl(更新的字段) result_code, message A
GET /api/apps/{id} id(应用ID路径参数) appInfo(完整应用信息对象, 含状态/密钥信息/订阅列表) A
GET /api/apps status(状态筛选), keyword(名称搜索), pageNo(页码), pageSize(每页条数) list(应用列表数组), totalCount(总条数), pageNum(当前页) A
POST /api/apps/{id}/submit id(应用ID) result_code, message, applyId(申请单ID) A
POST /api/apps/{id}/reset-key id(应用ID) newAppKey(新的AppKey), newAppSecret(新的Secret, 仅显示一次) B
POST /api/apps/{id}/freeze id(应用ID), reason(冻结原因) result_code, message B
DELETE /api/apps/{id} id(应用ID) result_code, message B
方法 URL 入参(中文说明) 出参(中文说明) 评级
POST /api/apis apiName(API名称), apiPath(API路径), httpMethod(HTTP方法), category(分类), description(描述) apiId(API ID), version(版本号) A
PUT /api/apis/{id} id(API ID), 更新的字段 result_code, message B
GET /api/apis/{id} id(API ID) apiInfo(完整API信息, 含版本历史/订阅数/调用统计) B
GET /api/apis category(分类筛选), keyword(搜索), status(状态), pageNo, pageSize list(列表), totalCount B
POST /api/apis/{id}/publish id(API ID), version(版本号) result_code, publishTime B
POST /api/apis/{id}/deprecate id(API ID), reason(弃用原因) result_code, message C
GET /api/apis/{id}/docs id(API ID) docContent(API文档内容Markdown格式), examples(调用示例) C
方法 URL 入参(中文说明) 出参(中文说明) 评级
POST /dev/register username(用户名), password(密码), email(邮箱), phone(手机号), company(企业名称) developerId(开发者ID), result_code B
POST /dev/certify developerId, realName(真实姓名), idCard(身份证号), idCardFront(正面照URL), idCardBack(背面照URL) result_code, auditStatus(审核状态) B
GET /dev/profile (使用认证Token) profile(开发者资料对象, 含认证状态/应用数) C
PUT /dev/profile email, phone, company(可更新字段) result_code C
GET /dev/apps status(筛选), pageNo, pageSize list(自己创建的应用列表) C
方法 URL 入参(中文说明) 出参(中文说明) 评级
GET /stats/calls/overview dateRange(日期范围, 如2026-01-01~2026-06-13), appId(可选, 某个应用) totalCalls(总调用量), successRate(成功率), avgResponseTime(平均延迟ms), errorCount(错误数) B
GET /stats/calls/trend dateRange, granularity(粒度 hour/day/month), appId trendData(趋势数据数组, 含时间点和指标值) B
GET /stats/calls/top dateRange, topN(TOP数量, 默认10), sortBy(排序维度 calls/errors/time) topList(TOP排行列表) C
GET /stats/apps/rank dateRange, topN rankList(应用活跃度排行榜) C
GET /stats/alerts status(未读/已读), level(警告/严重), dateRange alertList(告警列表, 含触发条件/当前值/阈值) C
完整接口清单: 以上为核心接口摘要。包含入参出参中文说明、ABCD评级和优先级的完整全量接口清单请查看
全量接口清单附件 。
第6章 外部依赖边界分析
6.1 外部系统依赖全景
Redis
RabbitMQ
MongoDB
Elasticsearch
ZooKeeper
外部组件 依赖方式 涉及模块 使用场景 耦合深度 替换难度
MySQL DataSource + MyBatis SqlSession 平台/FOP-SVC/SYS 全部持久化操作 深 高(需改DAO层)
Redis StringRedisTemplate 网关/平台/门户 Session共享/限流计数/路由缓存/分布式锁 中 中(有抽象层)
RabbitMQ RabbitTemplate + @RabbitListener 平台/FOP-SVC 审核事件/配置下发/日志归档 中 中(消息标准化)
Elasticsearch RestHighLevelClient FOP-SVC 日志检索/调用链查询/API文档索引 浅 低(独立模块)
MongoDB MongoTemplate FOP-SVC 原始日志存储/文件元数据 浅 低(独立模块)
ZooKeeper Dubbo Registry 全部模块 服务注册发现/配置中心 深 高(框架内置)
FastDFS FastDFSClient 门户/FOP-SVC 身份证照/应用图标/文档存储 浅 低(可换OSS)
LDAP/OA HTTP Client / LDAP SDK 平台 统一认证/审批工作流集成 中 中(适配器模式)
6.3 共享实体跨模块依赖
跨模块共享实体风险: 以下 PO/DTO 对象在多个模块间传递,修改字段影响面广:
共享实体 所在模块 被以下模块引用 影响面
AppInfoPOfop-common 网关(Controller+Service) + 平台(DAO+Service) + FOP-SVC(只读) + 门户(只读) 4个模块
DeveloperPOfop-common 平台(Service+DAO) + 门户(Controller+Service) + 网关(AuthFilter读取) 3个模块
ResultDTOfop-common 全部模块(统一返回包装) 全局
ApiInfoPOfop-common 平台 + 网关 + FOP-SVC 3个模块
ApplyRecordPOfop-common 平台 + 门户 2个模块
6.4 可拆分边界评估
候选拆分边界 可行性 拆分收益 拆分成本/风险 建议
网关 ↔ 平台 (Dubbo RPC) 可行 独立部署/扩容 Dubbo接口契约变更影响大 推荐 : 先稳定接口再拆分
认证服务独立 (Auth) 高度可行 认证逻辑集中/多端复用 Shiro Session迁移成本高 强烈推荐 : 最高ROI
日志服务独立 (ELK) 已完成 ES独立查询不影响主流程 已有物理隔离 维持现状
文件服务独立 (FastDFS→OSS) 可行 上云迁移便利 需处理存量文件迁移 计划中(P2)
第7章 框架耦合热点分析
7.1 框架依赖分布
pie title 框架耦合占比(按代码行)
"Spring Framework" : 30
"MyBatis" : 18
"Dubbo" : 15
"Shiro" : 12
"Spring Cloud Gateway" : 10
"Sentinel" : 5
"Fastjson" : 5
"其他" : 5
7.2 关键框架耦合详情
框架 版本 耦合点数量 典型耦合位置 迁移难点 迁移成本
Spring 4.1.6 4.1.6.RELEASE 400+ IOC/AOP/MVC/TX 全栈使用 JDK版本要求(1.7→1.8+)、API变更 极高
Dubbo 2.8.4 2.8.4 35+ @Service/@Reference 注解、RegistryConfig 协议兼容、序列化方式 高
Shiro 1.3.2 1.3.2 20+ AuthorizingRealm、filterChainDefinition、SessionManager 与Spring Security重叠、Session机制冲突 高
MyBatis 3.x 40+ SqlSessionFactory、Mapper接口、XML映射 SQL迁移、动态SQL重写 中
Fastjson 1.2.83 1.2.83 25+ JSON.parseObject/toJSONString 全局序列化 TypeReference安全模式、AutoType白名单 中
Spring Cloud Gateway 2021.x 15+ GlobalFilter、RouteLocator、LoadBalancer WebFlux响应式编程模型 中
Freemarker 2.3.x 10+ 门户模板渲染(.ftl文件) 可替换为Vue/Thymeleaf 低
7.3 迁移成本矩阵 (SVG)
框架迁移成本矩阵
影响面广 ——————————————→ 影响面窄
迁移成本低↑ 迁移成本高↓
Spring 4→3
Dubbo 2→3
Shiro→Sec
MyBatis
Fastjson
Gateway
Freemarker
FastDFS→OSS
Sentinel
7.4 双认证体系问题
重大架构隐患: 系统同时使用了
OAuth2 (Spring Security OAuth) 和
Apache Shiro 两套认证授权框架,导致:
认证逻辑分散在两个体系中,Token格式不统一(JWT vs Shiro Session)
权限校验重复(OAuth2 scope + Shiro permission),增加运维复杂度
Session管理混乱(Redis存储Shiro Session + OAuth2 TokenStore)
两套框架的安全补丁都需要跟进,攻击面翻倍
建议方案: 统一为单一认证体系。推荐保留 OAuth2/JWT 作为标准协议,将 Shiro 的 RBAC 权限模型迁移到 Spring Security 的 @PreAuthorize / PermissionEvaluator 中。此改造属于 P0 最高优先级 。
第8章 技术债务分析
8.1 技术债务概览
8.2 安全漏洞 (P0 级别)
安全漏洞必须在重构前修复 ,否则任何架构升级都会放大攻击面。
# 文件 问题描述 证据 修复方案
1 fop-parent/.../dao/xxxDao.xml ${} 字符串拼接代替 #{} ${param} 在 WHERE 子句中改为 #{param} 参数绑定
2 fop-parent/.../service/xxxServiceImpl.java 动态SQL拼接未使用MyBatis <if> "WHERE "+sql 字符串拼接使用MyBatis <where>/<if>
3 fop-portal/.../controller/xxxController.java LIKE 查询未转义特殊字符 %"+keyword+"% 使用 CONCAT('%',#{kw},'%')
# 文件 问题代码 风险 修复方案
1 fop-parent/.../util/JsonUtil.java JSON.parseObject(str, Object.class) AutoType开启时可执行任意代码 使用 TypeReference<T> 或 setAutoType(false)
2 fop-parent/.../dto/xxxDTO.java @JSONField 无 type 过滤恶意构造的JSON可注入任意类型 配置 ParserConfig.getGlobalInstance().setAutoTypeCheckHandler()
3 fop-api-gateway/.../filter/xxFilter.java 请求体直接 parseObject 到 Map 嵌套对象反序列化风险 使用 JSONObject 安全解析
4 fop-api-gateway/.../handler/xxxHandler.java toJSONString 无 SerializerFeature.IgnoreNonFieldGetter getter副作用可能泄漏信息 添加安全特性配置
# 文件 问题 证据 修复
1 application.yml (多个模块) 数据库密码/Redis密码明文存储 password: root123 迁移到配置中心加密存储或环境变量
2 ShiroAuthorizingRealm.java 密码比对使用简单MD5 Md5Hash(password) 升级为 BCrypt/PBKDF2
3 EncryptUtil.java 硬编码 AES 密钥 private static final KEY = "bankkey123" KMS 动态密钥管理
8.3 异常处理缺陷
# 类.方法() 问题 评级
1 FopAuthServiceImpl.authenticate()catch(Exception e){} 认证异常被完全吞掉,无日志无告警A
2 GatewayAuthFilter.filter()catch(Throwable t){continue; 认证异常静默放行A
3 DubboConsumerService.call()catch(RpcException e){return null;} RPC失败返回null可能导致NPEB
4 FopPlatformServiceImpl.createApp()catch块仅 log.error 无抛出/返回,调用方误以为成功 B
5 AppKeyGenerator.generate()catch异常后返回固定备用密钥,安全性降级 B
6-15 各 DAO/Util 类 空 catch 或仅 e.printStackTrace(),共约10处 C
8.4 硬编码值
硬编码值总计 23 处 ,主要分布在:配置类中的魔法数字(8处)、URL/IP 地址(5处)、超时时间(4处)、业务状态码(3处)、密钥相关(3处)。
# 文件 硬编码内容 应改为
1 EncryptUtil.java"bankkey123" AES密钥KMS或@Value注入
2 application.ymlpassword: root123 加密配置中心
3 SentinelConfig.java10000 超时ms魔法数字@Value("${sentinel.timeout}")
4 GatewayRouteConfig.javalb://platform-service 硬编码服务名配置中心动态加载
5 FopAuthServiceImpl.java3600 Token过期秒数@Value("${auth.token.expire}")
6-10 各类 Service/Controller 业务状态码 0/1/2/3 魔法数字 枚举常量 AppStatusEnum
其余 13 处硬编码见详细扫描附录...
8.5 God Class 与反模式
类 问题类型 具体表现 评级
FopPlatformServiceImplGod Class ~2200行, ~55方法, 承担开发者管理+应用管理+API管理+审核+统计5类职责 A
FopAuthServiceImplGod Class ~1800行, ~45方法, 混合了OAuth2认证+Shiro授权+Token管理+Session管理 A
AppInfoController胖 Controller ~1200行, ~38方法, 包含业务逻辑不应出现在Controller中 A
GatewayAuthFilter上帝过滤器 ~900行, 认证+鉴权+限流+日志+告警全部在一个filter中 A
ResultDTO贫血模型滥用 全局返回对象承担了成功/失败/分页/异常/文件下载等多种场景 B
ShiroAuthorizingRealm紧耦合 直接依赖具体的 Service 实现,无法单元测试 B
各 DAO 实现类 重复代码 CRUD模板代码大量重复,未使用通用BaseMapper C
8.6 全局性债务
全局风险 R1-R6:
ID 风险项 严重度 影响范围 缓解措施
R1 零自动化测试覆盖 严重 全平台 重构前补充核心流程单元测试(目标60%覆盖)
R2 双认证体系(OAuth2+Shiro) 严重 认证/授权 统一为OAuth2/JWT + Spring Security
R3 Spring 4.1.6 EOL (2019年终止) 严重 全平台 升级 Spring Boot 2.7+/3.x
R4 敏感信息明文/弱加密 严重 安全 密码BCrypt+KMS密钥+PII加密
R5 无分布式事务保障 高 跨服务写操作 引入Seata或Saga模式
R6 MQ消息无幂等/补偿机制 高 异步流程 消息去重表+重试+死信队列
第9章 重构策略与优先级
9.1 逐类重构建议 (按优先级排序)
P0 — 必须立即处理
类名 评级 当前问题 重构建议 优先级
FopAuthServiceImplA God Class: OAuth2+Shiro认证+授权+Token混合,1800行/45方法 拆分为 AuthService(Token管理) + PermissionService(权限) + ExternalAuthProvider(LDAP适配),统一为JWT协议 P0
GatewayAuthFilterA 上帝过滤器: 认证+限流+日志+告警全部混在一起,900行 拆分为 AuthFilter → RateLimitFilter → AuditFilter 责任链模式 P0
ShiroAuthorizingRealmA Shiro认证授权核心,与Spring Security OAuth重叠 逐步废弃Shiro,迁移至Spring Security JWT认证 + @PreAuthorize鉴权 P0
EncryptUtilA 硬编码AES密钥,弱加密算法 接入KMS密钥管理服务,升级AES-256-GCM P0
application.ymlA 数据库密码/Redis密码明文存储 迁移至配置中心(Nacos/Apollo)加密存储 P0
P1 — 本阶段重点改造
类名 评级 当前问题 重构建议 优先级
FopPlatformServiceImplA 最大God Class: 2200行/55方法/5类职责 纵向拆分为 AppManagementService / ApiManagementService / AuditService / StatisticsService P1
AppInfoControllerA 胖Controller: 1200行/38方法,含业务逻辑 业务逻辑下沉至Service层,Controller只做参数校验+调用Service+返回 P1
ApiApplyControllerA 胖Controller: 1100行/35方法 同上,Controller瘦身 P1
DubboConsumerServiceB RPC调用封装不足,异常处理缺失 统一RPC调用模板:重试+超时+熔断+降级+日志 P1
JsonUtil(Fastjson)B AutoType安全隐患 全局配置安全模式:ParserConfig.setSafeMode(true) 或迁移Jackson P1
各DAO XMLB ${} SQL注入风险 全面审查改为#{}, 使用MyBatis动态SQL标签 P1
P2 — 顺带处理
类名 评级 当前问题 重构建议 优先级
GatewayRouteConfigB 硬编码路由规则,不支持动态调整 路由配置从DB/Nacos动态加载 P2
SentinelConfigB 限流规则硬编码 规则迁入Sentinel Dashboard/Nacos P2
DevAccountControllerB 部分业务逻辑未分离 Service层抽取 P2
StatControllerC 统计逻辑较散 统一统计服务层 P2
各DAO实现C CRUD模板代码重复 引入MyBatis-Plus或自定义BaseMapper P2
P3 — 框架迁移时顺带
类/组件 评级 当前状态 重构建议 优先级
Freemarker 模板(.ftl) C 门户页面渲染 Spring Boot升级时迁移Thymeleaf或前后端分离(Vue) P3
IpUtil / DateUtil / ValidatorUtil D 工具类基本健康 保持现状,必要时用Hutool/Apache Commons替代 P3
TraceIdFilter D 轻量级链路追踪 保持现状,后续可集成SkyWalking P3
9.2 测试补充策略
9.2.1 测试基线
维度 当前状态 目标 差距
单元测试覆盖率 ~0% (几乎没有) 核心模块 >= 60% -60%
集成测试 手动测试为主 核心流程 100% 自动化 需从零建设
接口契约测试 无 关键 Dubbo/REST 接口 100% 需引入 Pact/Mockito
安全测试 无自动化 OWASP Top 10 覆盖 引入 OWASP ZAP CI
9.2.2 优先测试 Case (按 P0-P3 分级)
优先级 目标类 测试范围 关键 Case 示例
P0 FopAuthServiceImpl 认证全流程 正确密码认证成功 / 错误密码返回特定错误码 / Token过期自动刷新 / 并发登出互踢 / SQL注入防护
P0 GatewayAuthFilter 过滤链逻辑 无Token返回401 / 有效Token放行 / Token篡改拒绝 / 限流触发429 / 异常情况不绕行
P0 FopPlatformServiceImpl.createApp() 应用创建流程 正常创建成功 / 重复应用名拒绝 / 开发者不存在异常 / 审核消息正确发送
P1 DubboConsumerService RPC调用可靠性 正常调用 / 超时重试 / 服务宕机降级 / 序列化兼容
P1 AppInfoController 接口入参校验 必填参数缺失 / 类型非法 / XSS输入 / 超长输入截断
P1 EncryptUtil 加解密正确性 相同明文不同密文(IV随机) / 密文可正确解密 / 空输入异常处理
P2 各 DAO 层 SQL 正确性 CRUD 操作 / 事务回滚 / 边界条件(NULL/空串/超大值)
P2 StatController 统计数据准确性 时间范围边界 / 多应用聚合 / 缓存一致性
P3 工具类(Util) 基础功能 边界值 / 异常输入 / 性能基线
9.2.3 准出标准
标准项 准出门槛 检验方式
P0 用例通过率 100% JUnit 5 + CI Pipeline
核心流程回归 API调用全链路(认证→路由→业务→响应)无阻断 E2E 自动化测试
状态机校验 应用状态机(草稿→待审→上线→冻结→注销)转换全部正确 状态机模型验证测试
金额/计量一致性 N/A (本系统无金额字段) -
安全扫描 0 个 Critical/High 漏洞 SonarQube + OWASP ZAP
性能基线 P99延迟不超过重构前 120% JMeter 压测对比
9.3 重构执行顺序与依赖路径
flowchart TD
subgraph Phase1["Phase 1: 安全加固 (P0)"]
A1["1.1 敏感配置加密迁移"] --> A2["1.2 Fastjson安全模式配置"]
A2 --> A3["1.3 SQL注入修复(全部${}→#{})"]
A3 --> A4["1.4 加密工具升级(KMS+BCrypt)"]
end
subgraph Phase2["Phase 2: 认证统一 (P0-P1)"]
B1["2.1 新建JwtAuthService(并行开发)"]
B2["2.2 拆分GatewayAuthFilter为责任链"]
B1 --> B3["2.3 双轨运行(新旧并存)"]
A4 --> B1
A2 --> B1
B3 --> B4["2.4 废除Shiro, 切换至Spring Security"]
B2 --> B4
end
subgraph Phase3["Phase 3: 服务拆分 (P1-P2)"]
C1["3.1 FopPlatformService纵向拆分"]
C2["3.2 Controller瘦身(业务逻辑下沉)"]
C3["3.3 DAO层公共提取(BaseMapper)"]
B4 --> C1
C1 --> C2
C2 --> C3
end
subgraph Phase4["Phase 4: 治理完善 (P2-P3)"]
D1["4.1 路由/限流规则动态化"]
D2["4.2 测试覆盖率达标(60%)"]
D3["4.3 框架版本升级(Spring Boot 2.7+)"]
C3 --> D1
D1 --> D2
D2 --> D3
end
Phase1 --> Phase2 --> Phase3 --> Phase4
style Phase1 fill:#fef2f2,stroke:#dc2626
style Phase2 fill:#fffbeb,stroke:#d97706
style Phase3 fill:#eff6ff,stroke:#2563eb
style Phase4 fill:#ecfdf5,stroke:#059669
关键依赖说明
步骤 前置依赖 影响范围 风险兜底
Phase 1 安全加固 无(可立即启动) 全模块配置文件和工具类 每个改动独立提交,可随时回滚
Phase 2.1 JwtAuthService Phase 1 完成(加密/KMS就绪) 新增模块,不影响现有认证 双轨运行期间新旧并存,一键回切
Phase 2.4 废除Shiro Phase 2.1+2.2+2.3 全部完成 所有使用Shiro的模块(平台+门户+网关) 灰度切换(按用户比例),保留Shiro配置2周观察期
Phase 3.1 平台服务拆分 Phase 2 认证体系稳定后 fop-parent 核心业务层,影响全部Dubbo接口 保持Dubbo接口契约不变,仅拆分内部实现
Phase 4.3 Spring升级 Phase 1-3 全部完成且稳定运行1月+ 全平台,最大的破坏性变更 新分支并行开发,蓝绿部署切换
第10章 关联文档
术语表
术语 全称 说明
Dubbo Distributed RPC Framework 阿里巴巴开源的高性能RPC框架,用于服务间远程调用
PO Persistent Object 持久化对象,对应数据库表的Java实体类
DTO Data Transfer Object 数据传输对象,用于层间数据传递
God Class - 违反单一职责原则的超大类,承担过多功能
Hub Class - 被大量其他类依赖的中心类,修改影响面极大
ABCD Rating - 本报告定义的四级重构价值评级(A必须/B建议/C可选/D维持)
LOC Lines of Code 代码行数(不含空白和注释)
NFR Non-Functional Requirement 非功能性需求(性能/安全/可维护性等)
QPS Queries Per Second 每秒查询率,API调用频率限制单位
EOL End of Life 软件/框架官方终止支持的日期