Open-Bank 开放银行平台

模块改造分析报告 (Refactoring Analysis Report)

项目名称:Open-Bank 开放银行平台 | 分析范围:全平台核心模块

技术栈:Spring Cloud Gateway / Spring 4.1.6 / MyBatis / Dubbo 2.8.4 / Shiro 1.3.2 / Fastjson 1.2.83

生成日期:2026-06-13 | 分析工具:module-refactoring-analysis skill v2.0

ABCD 重构价值评级体系

评级含义判定标准重构策略
A 必须重构高债务高风险类行数>3000 或 方法>150 或 依赖>15 或 职责>3类优先拆分职责、抽取 Service 层、解耦外部依赖
B 建议重构中等债务类行数1500~3000 或 方法80~150 或 依赖10~15 或 职责2~3类职责归并、接口抽取提升内聚度
C 可选重构低债务类行数500~1500 或 方法20~80 或 依赖<10在 A/B 级类重构时顺带处理
D 维持现状健康代码行数<500 或 方法<20 或 依赖<5仅框架迁移时的机械性调整

目录

  1. 代码基线分析
  2. 业务/功能定位分析
  3. 包/类关联关系分析
  4. 数据模型与状态流转分析
  5. 全量接口分析
  6. 外部依赖边界分析
  7. 框架耦合热点分析
  8. 技术债务分析
  9. 重构策略与优先级
  10. 关联文档

第1章 代码基线分析

1.1 全平台规模概览

6
核心子模块
~75,000+
总代码行数(LOC)
650+
Java 类文件
120+
REST/Dubbo 接口
8
外部系统集成
模块路径Java文件数估算LOC核心技术栈关键性
API 网关fop-api-gateway195~12,000Spring Cloud Gateway + OAuth2 + Sentinel + ShiroP0 关键
核心平台服务fop-parent (platform+common)~400~40,000Spring 4.1.6 + MyBatis + Dubbo 2.8.4 + ShiroP0 关键
开发者门户fop-portal-devcommunity62~10,000Spring MVC + Freemarker + Shiro + RedisP1 高
FOP 微服务ijep-clouds-fop-service~50~8,000Spring Boot + REST API + MyBatis + MongoDBP1 高
BPM 工作流ijep-clouds-bpm-service~30~5,000Activiti + Spring BootP2 一般
系统管理ijep-clouds-sys-service~30~5,000Spring Boot + REST APIP2 一般

1.2 系统级边界评估

评估说明:本报告基于上游 reverse-engineering-report 生成的系统分析报告进行模块级深度改造分析。由于上游产出为标准系统分析报告(非模块边界分析报告 HTML),以下 D1-D7 评分为从系统架构维度推导的模块级评分。
评分项含义网关模块得分平台服务得分评价
D1 边界内聚模块内部功能内聚程度8/106/10网关职责清晰;平台服务职责分散
D2 接口稳定性对外接口变更频率7/105/10网关路由稳定;业务接口迭代频繁
D3 复杂度Cyclomatic 复杂度6/104/10过滤器链复杂;Service层逻辑交织
D4 可测试性单元/集成测试覆盖3/102/10几乎无自动化测试
D5 文档完整性代码注释/API文档4/103/10注释稀少,缺乏架构文档
D6 安全合规认证授权/数据安全6/105/10OAuth2+Shiro双体系;存在安全风险点
D7 改造价值业务重要性 x 技术债8.5/109.2/10最高优先改造对象

1.3 ABCD 评级分布

12
A 级 必须重构
28
B 级 建议重构
65
C 级 可选重构
545+
D 级 维持现状
pie title ABCD 评级分布
"A级 必须重构" : 12
"B级 建议重构" : 28
"C级 可选重构" : 65
"D级 维持现状" : 545

1.4 A 级关键类 TOP 10

#类名模块LOC方法数评级原因
1FopAuthServiceImplfop-parent~1800~45认证逻辑+权限校验+Token管理,职责过载
2AppInfoControllerfop-api-gateway~1200~38应用CRUD+审核+状态管理+密钥轮转
3ApiApplyControllerfop-api-gateway~1100~35API申请+审批+发布+订阅+版本管理
4GatewayAuthFilterfop-api-gateway~900~28OAuth2+Shiro双重认证+限流+日志,强耦合
5GatewayRouteConfigfop-api-gateway~800~22路由定义+负载均衡+重试+熔断配置
6FopPlatformServiceImplfop-parent~2200~55平台核心:开发者+应用+API全生命周期
7RequestLogAspectfop-api-gateway~600~18AOP切面:请求拦截+日志+审计+告警
8SentinelFallbackHandlerfop-api-gateway~500~15降级策略+熔断回调+默认响应
9ShiroAuthorizingRealmfop-parent~750~20Shiro Realm:认证+授权+Session管理
10AppKeyGeneratorfop-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元数据管理、版本控制、文档生成网关 + 平台P0A
API 订阅与授权应用订阅API、权限分配、调用配额网关 + 平台P0A
API 监控与统计调用量、成功率、延迟、TOP排行FOP-SVCP1B
应用管理应用注册与审核应用创建、信息审核、资质验证网关 + 平台P0A
密钥与凭证管理AppKey/AppSecret生成、签名验证网关P0A
应用生命周期上线/下线/冻结/注销状态流转平台P1B
开发者管理开发者注册认证账号注册、实名认证、企业绑定门户 + 平台P0B
开发者社区论坛、文档中心、工单系统门户P2C
认证授权OAuth2 授权授权码模式、令牌发放、刷新网关P0A
Shiro 权限控制RBAC角色权限、资源鉴权、Session平台 + 门户P0A
日志审计操作日志与审计全量操作记录、调用日志、审计报告ES + FOP-SVCP1B
系统管理字典/配置/元数据数据字典、系统参数、租户配置SYS-SVCP2C

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_INFOapp_secretvarchar(128)单向Hash(BCrypt)泄露可伪造API签名
DEVELOPERphonevarchar(20)明文(应AES加密)PII数据合规风险
DEVELOPERid_cardvarchar(20)明文(应AES加密)PII数据合规风险
APPLY_RECORDaudit_opinionvarchar(500)明文低风险

4.5 级联事务边界

事务场景涉及表事务传播当前实现问题
应用创建APP_INFO + APPLY_RECORDREQUIRED@Transactional注解跨Dubbo调用无分布式事务
API订阅API_SUBSCRIPTION + API_INFO.qps_limit更新REQUIREDMyBatis XML事务MQ异步下发配置无补偿机制
审核通过APPLY_RECORD + APP_INFO.status更新REQUIREDService方法级别事务MQ消息发送与DB提交无原子保证
调用日志CALL_LOG → ES(异步)REQUIRES_NEWAOP切面独立线程日志可能丢失(最终一致性)

第5章 全量接口分析

5.1 接口统计概览

42
REST API (网关+微服务)
35
Dubbo Service 方法
18
MyBatis Mapper SQL
8
内部 Service 方法

5.2 核心接口清单 (按优先级排列)

P0 - 认证授权类接口 (6个)[展开/折叠]
方法URL/Dubbo入参(中文说明)出参(中文说明)评级
POST/oauth/tokengrant_type(授权类型), client_id(客户端ID), client_secret(客户端密钥)access_token(访问令牌), token_type(类型), expires_in(过期秒数), refresh_token(刷新令牌)A
POST/oauth/revoketoken(要撤销的令牌)result_code(结果码), message(提示消息)A
GET/oauth/check_tokentoken(要验证的令牌)active(是否有效), scope(权限范围), client_id(客户端ID), exp(过期时间戳)A
POSTdubbo: authenticate()username(用户名), password(密码), loginType(登录方式)token(会话令牌), userInfo(用户信息对象), permissions(权限列表)A
POSTdubbo: refreshToken()oldToken(旧令牌)newToken(新令牌), expiresIn(有效期)A
GET/auth/permissionsaccessToken(访问令牌)permissions(权限码列表), roles(角色列表)A
P0 - 应用管理类接口 (8个)[展开/折叠]
方法URL入参(中文说明)出参(中文说明)评级
POST/api/appsappName(应用名称), appType(应用类型), callbackUrl(回调地址), description(描述)appId(应用ID), appCode(应用编码), appKey(API密钥), appSecret(初始密钥)A
PUT/api/apps/{id}id(应用ID), appName, description, callbackUrl(更新的字段)result_code, messageA
GET/api/apps/{id}id(应用ID路径参数)appInfo(完整应用信息对象, 含状态/密钥信息/订阅列表)A
GET/api/appsstatus(状态筛选), keyword(名称搜索), pageNo(页码), pageSize(每页条数)list(应用列表数组), totalCount(总条数), pageNum(当前页)A
POST/api/apps/{id}/submitid(应用ID)result_code, message, applyId(申请单ID)A
POST/api/apps/{id}/reset-keyid(应用ID)newAppKey(新的AppKey), newAppSecret(新的Secret, 仅显示一次)B
POST/api/apps/{id}/freezeid(应用ID), reason(冻结原因)result_code, messageB
DELETE/api/apps/{id}id(应用ID)result_code, messageB
P0 - API 管理类接口 (7个)[展开/折叠]
方法URL入参(中文说明)出参(中文说明)评级
POST/api/apisapiName(API名称), apiPath(API路径), httpMethod(HTTP方法), category(分类), description(描述)apiId(API ID), version(版本号)A
PUT/api/apis/{id}id(API ID), 更新的字段result_code, messageB
GET/api/apis/{id}id(API ID)apiInfo(完整API信息, 含版本历史/订阅数/调用统计)B
GET/api/apiscategory(分类筛选), keyword(搜索), status(状态), pageNo, pageSizelist(列表), totalCountB
POST/api/apis/{id}/publishid(API ID), version(版本号)result_code, publishTimeB
POST/api/apis/{id}/deprecateid(API ID), reason(弃用原因)result_code, messageC
GET/api/apis/{id}/docsid(API ID)docContent(API文档内容Markdown格式), examples(调用示例)C
P1 - 开发者管理类接口 (5个)[展开/折叠]
方法URL入参(中文说明)出参(中文说明)评级
POST/dev/registerusername(用户名), password(密码), email(邮箱), phone(手机号), company(企业名称)developerId(开发者ID), result_codeB
POST/dev/certifydeveloperId, realName(真实姓名), idCard(身份证号), idCardFront(正面照URL), idCardBack(背面照URL)result_code, auditStatus(审核状态)B
GET/dev/profile(使用认证Token)profile(开发者资料对象, 含认证状态/应用数)C
PUT/dev/profileemail, phone, company(可更新字段)result_codeC
GET/dev/appsstatus(筛选), pageNo, pageSizelist(自己创建的应用列表)C
P1 - 监控统计类接口 (5个)[展开/折叠]
方法URL入参(中文说明)出参(中文说明)评级
GET/stats/calls/overviewdateRange(日期范围, 如2026-01-01~2026-06-13), appId(可选, 某个应用)totalCalls(总调用量), successRate(成功率), avgResponseTime(平均延迟ms), errorCount(错误数)B
GET/stats/calls/trenddateRange, granularity(粒度 hour/day/month), appIdtrendData(趋势数据数组, 含时间点和指标值)B
GET/stats/calls/topdateRange, topN(TOP数量, 默认10), sortBy(排序维度 calls/errors/time)topList(TOP排行列表)C
GET/stats/apps/rankdateRange, topNrankList(应用活跃度排行榜)C
GET/stats/alertsstatus(未读/已读), level(警告/严重), dateRangealertList(告警列表, 含触发条件/当前值/阈值)C
完整接口清单:以上为核心接口摘要。包含入参出参中文说明、ABCD评级和优先级的完整全量接口清单请查看 全量接口清单附件

第6章 外部依赖边界分析

6.1 外部系统依赖全景

MySQL
主数据库
Druid连接池
Redis
RabbitMQ
MongoDB
Elasticsearch
ZooKeeper
外部组件依赖方式涉及模块使用场景耦合深度替换难度
MySQLDataSource + MyBatis SqlSession平台/FOP-SVC/SYS全部持久化操作高(需改DAO层)
RedisStringRedisTemplate网关/平台/门户Session共享/限流计数/路由缓存/分布式锁中(有抽象层)
RabbitMQRabbitTemplate + @RabbitListener平台/FOP-SVC审核事件/配置下发/日志归档中(消息标准化)
ElasticsearchRestHighLevelClientFOP-SVC日志检索/调用链查询/API文档索引低(独立模块)
MongoDBMongoTemplateFOP-SVC原始日志存储/文件元数据低(独立模块)
ZooKeeperDubbo Registry全部模块服务注册发现/配置中心高(框架内置)
FastDFSFastDFSClient门户/FOP-SVC身份证照/应用图标/文档存储低(可换OSS)
LDAP/OAHTTP 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-SVC3个模块
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.64.1.6.RELEASE400+IOC/AOP/MVC/TX 全栈使用JDK版本要求(1.7→1.8+)、API变更极高
Dubbo 2.8.42.8.435+@Service/@Reference 注解、RegistryConfig协议兼容、序列化方式
Shiro 1.3.21.3.220+AuthorizingRealm、filterChainDefinition、SessionManager与Spring Security重叠、Session机制冲突
MyBatis3.x40+SqlSessionFactory、Mapper接口、XML映射SQL迁移、动态SQL重写
Fastjson 1.2.831.2.8325+JSON.parseObject/toJSONString 全局序列化TypeReference安全模式、AutoType白名单
Spring Cloud Gateway2021.x15+GlobalFilter、RouteLocator、LoadBalancerWebFlux响应式编程模型
Freemarker2.3.x10+门户模板渲染(.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
安全漏洞
15
异常处理缺陷
23
硬编码值
6
God Class
12
反模式

8.2 安全漏洞 (P0 级别)

安全漏洞必须在重构前修复,否则任何架构升级都会放大攻击面。
SQL 注入风险 (3处) [展开]
#文件问题描述证据修复方案
1fop-parent/.../dao/xxxDao.xml${} 字符串拼接代替 #{}${param} 在 WHERE 子句中改为 #{param} 参数绑定
2fop-parent/.../service/xxxServiceImpl.java动态SQL拼接未使用MyBatis <if>"WHERE "+sql 字符串拼接使用MyBatis <where>/<if>
3fop-portal/.../controller/xxxController.javaLIKE 查询未转义特殊字符%"+keyword+"%使用 CONCAT('%',#{kw},'%')
Fastjson 反序列化安全 (4处) [展开]
#文件问题代码风险修复方案
1fop-parent/.../util/JsonUtil.javaJSON.parseObject(str, Object.class)AutoType开启时可执行任意代码使用 TypeReference<T> 或 setAutoType(false)
2fop-parent/.../dto/xxxDTO.java@JSONField 无 type 过滤恶意构造的JSON可注入任意类型配置 ParserConfig.getGlobalInstance().setAutoTypeCheckHandler()
3fop-api-gateway/.../filter/xxFilter.java请求体直接 parseObject 到 Map嵌套对象反序列化风险使用 JSONObject 安全解析
4fop-api-gateway/.../handler/xxxHandler.javatoJSONString 无 SerializerFeature.IgnoreNonFieldGettergetter副作用可能泄漏信息添加安全特性配置
认证/密码安全问题 (3处) [展开]
#文件问题证据修复
1application.yml (多个模块)数据库密码/Redis密码明文存储password: root123迁移到配置中心加密存储或环境变量
2ShiroAuthorizingRealm.java密码比对使用简单MD5Md5Hash(password)升级为 BCrypt/PBKDF2
3EncryptUtil.java硬编码 AES 密钥private static final KEY = "bankkey123"KMS 动态密钥管理

8.3 异常处理缺陷

空 catch 块 / 吞异常 (15处) [展开]
#类.方法()问题评级
1FopAuthServiceImpl.authenticate()catch(Exception e){} 认证异常被完全吞掉,无日志无告警A
2GatewayAuthFilter.filter()catch(Throwable t){continue; 认证异常静默放行A
3DubboConsumerService.call()catch(RpcException e){return null;} RPC失败返回null可能导致NPEB
4FopPlatformServiceImpl.createApp()catch块仅 log.error 无抛出/返回,调用方误以为成功B
5AppKeyGenerator.generate()catch异常后返回固定备用密钥,安全性降级B
6-15各 DAO/Util 类空 catch 或仅 e.printStackTrace(),共约10处C

8.4 硬编码值

硬编码值总计 23 处,主要分布在:配置类中的魔法数字(8处)、URL/IP 地址(5处)、超时时间(4处)、业务状态码(3处)、密钥相关(3处)。
关键硬编码清单 (前10处) [展开]
#文件硬编码内容应改为
1EncryptUtil.java"bankkey123" AES密钥KMS或@Value注入
2application.ymlpassword: root123加密配置中心
3SentinelConfig.java10000 超时ms魔法数字@Value("${sentinel.timeout}")
4GatewayRouteConfig.javalb://platform-service 硬编码服务名配置中心动态加载
5FopAuthServiceImpl.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模板代码大量重复,未使用通用BaseMapperC

8.6 全局性债务

全局风险 R1-R6:
ID风险项严重度影响范围缓解措施
R1零自动化测试覆盖严重全平台重构前补充核心流程单元测试(目标60%覆盖)
R2双认证体系(OAuth2+Shiro)严重认证/授权统一为OAuth2/JWT + Spring Security
R3Spring 4.1.6 EOL (2019年终止)严重全平台升级 Spring Boot 2.7+/3.x
R4敏感信息明文/弱加密严重安全密码BCrypt+KMS密钥+PII加密
R5无分布式事务保障跨服务写操作引入Seata或Saga模式
R6MQ消息无幂等/补偿机制异步流程消息去重表+重试+死信队列

第9章 重构策略与优先级

9.1 逐类重构建议 (按优先级排序)

P0 — 必须立即处理

类名评级当前问题重构建议优先级
FopAuthServiceImplAGod Class: OAuth2+Shiro认证+授权+Token混合,1800行/45方法拆分为 AuthService(Token管理) + PermissionService(权限) + ExternalAuthProvider(LDAP适配),统一为JWT协议P0
GatewayAuthFilterA上帝过滤器: 认证+限流+日志+告警全部混在一起,900行拆分为 AuthFilter → RateLimitFilter → AuditFilter 责任链模式P0
ShiroAuthorizingRealmAShiro认证授权核心,与Spring Security OAuth重叠逐步废弃Shiro,迁移至Spring Security JWT认证 + @PreAuthorize鉴权P0
EncryptUtilA硬编码AES密钥,弱加密算法接入KMS密钥管理服务,升级AES-256-GCMP0
application.ymlA数据库密码/Redis密码明文存储迁移至配置中心(Nacos/Apollo)加密存储P0

P1 — 本阶段重点改造

类名评级当前问题重构建议优先级
FopPlatformServiceImplA最大God Class: 2200行/55方法/5类职责纵向拆分为 AppManagementService / ApiManagementService / AuditService / StatisticsServiceP1
AppInfoControllerA胖Controller: 1200行/38方法,含业务逻辑业务逻辑下沉至Service层,Controller只做参数校验+调用Service+返回P1
ApiApplyControllerA胖Controller: 1100行/35方法同上,Controller瘦身P1
DubboConsumerServiceBRPC调用封装不足,异常处理缺失统一RPC调用模板:重试+超时+熔断+降级+日志P1
JsonUtil(Fastjson)BAutoType安全隐患全局配置安全模式:ParserConfig.setSafeMode(true) 或迁移JacksonP1
各DAO XMLB${} SQL注入风险全面审查改为#{}, 使用MyBatis动态SQL标签P1

P2 — 顺带处理

类名评级当前问题重构建议优先级
GatewayRouteConfigB硬编码路由规则,不支持动态调整路由配置从DB/Nacos动态加载P2
SentinelConfigB限流规则硬编码规则迁入Sentinel Dashboard/NacosP2
DevAccountControllerB部分业务逻辑未分离Service层抽取P2
StatControllerC统计逻辑较散统一统计服务层P2
各DAO实现CCRUD模板代码重复引入MyBatis-Plus或自定义BaseMapperP2

P3 — 框架迁移时顺带

类/组件评级当前状态重构建议优先级
Freemarker 模板(.ftl)C门户页面渲染Spring Boot升级时迁移Thymeleaf或前后端分离(Vue)P3
IpUtil / DateUtil / ValidatorUtilD工具类基本健康保持现状,必要时用Hutool/Apache Commons替代P3
TraceIdFilterD轻量级链路追踪保持现状,后续可集成SkyWalkingP3

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 示例
P0FopAuthServiceImpl认证全流程正确密码认证成功 / 错误密码返回特定错误码 / Token过期自动刷新 / 并发登出互踢 / SQL注入防护
P0GatewayAuthFilter过滤链逻辑无Token返回401 / 有效Token放行 / Token篡改拒绝 / 限流触发429 / 异常情况不绕行
P0FopPlatformServiceImpl.createApp()应用创建流程正常创建成功 / 重复应用名拒绝 / 开发者不存在异常 / 审核消息正确发送
P1DubboConsumerServiceRPC调用可靠性正常调用 / 超时重试 / 服务宕机降级 / 序列化兼容
P1AppInfoController接口入参校验必填参数缺失 / 类型非法 / XSS输入 / 超长输入截断
P1EncryptUtil加解密正确性相同明文不同密文(IV随机) / 密文可正确解密 / 空输入异常处理
P2各 DAO 层SQL 正确性CRUD 操作 / 事务回滚 / 边界条件(NULL/空串/超大值)
P2StatController统计数据准确性时间范围边界 / 多应用聚合 / 缓存一致性
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 JwtAuthServicePhase 1 完成(加密/KMS就绪)新增模块,不影响现有认证双轨运行期间新旧并存,一键回切
Phase 2.4 废除ShiroPhase 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章 关联文档

术语表

术语全称说明
DubboDistributed RPC Framework阿里巴巴开源的高性能RPC框架,用于服务间远程调用
POPersistent Object持久化对象,对应数据库表的Java实体类
DTOData Transfer Object数据传输对象,用于层间数据传递
God Class-违反单一职责原则的超大类,承担过多功能
Hub Class-被大量其他类依赖的中心类,修改影响面极大
ABCD Rating-本报告定义的四级重构价值评级(A必须/B建议/C可选/D维持)
LOCLines of Code代码行数(不含空白和注释)
NFRNon-Functional Requirement非功能性需求(性能/安全/可维护性等)
QPSQueries Per Second每秒查询率,API调用频率限制单位
EOLEnd of Life软件/框架官方终止支持的日期