P2-并入清单核对.md 7.62 KB

P2 并入清单核对:跨模块调用有没有"断了"的

结论先行:895 处活跃 <dubbo:reference> 里,只有 6 处的实现方不在并入清单内, 而且集中在 2 个接口上。其余 889 处要么就地解析,要么已经在搬。

生成方式:<code>tools/dubbo_dependency_scan.py</code>, 明细见 <code>dubbo-dependency-report.md</code> 与 dubbo-references.csv。

0. 为什么必须查这个

合成单 Jar 之后 Dubbo 注册中心没了,所有 <dubbo:reference> 会被翻成 @Resource 字段。 如果某个 reference 的实现类所在模块没有并进 reactor,那么老代码里那个字段 永远没有对应 Bean——编译能过、启动能过,一调用就是 NoSuchBeanDefinitionException。 这是典型的"上线才发现"故障,所以要在动手前把清单核到位。

1. 核对结果

分类 处数 含义
提供方在并入清单内 869 正常工作
提供方不在并入清单内 6 ⚠️ 见 §2,必须处理
有实现类、但老系统从没在 provider XML 里声明 8 见 §3,合并会自动修好,需验证
完全找不到实现方 12 见 §4,全部由即将下线的 portal 消费,不影响单 Jar

口径说明(三个容易把数字算错的地方,脚本里都已修):

  1. provider XML 的 interface=" com.zteits..." 引号内带前导空格 —— 不 strip 会 让大批"其实有提供方"的接口误判成"找不到实现方"(实测从 27 处降到 20 处)
  2. 大量 <dubbo:reference> 是被 <!-- --> 包起来的历史残留(如 dubbo-order-consumer.xml 第 63、74 行整条注释掉),不去注释会凭空多出假引用
  3. 老仓库的 @Service("...") 值填的是实现类 FQN、不是接口 FQN, 所以不能拿注解值去匹配接口;实现类要靠 implements 兜底识别

2. ⚠️ 必须处理的 6 处(提供方不在并入清单)

2.1 SendMessageService(企业微信发消息)—— 4 处,优先级最高

项 值
接口 com.zteits.clouds.api.service.wxcp.SendMessageService
实现类 zteits-wxcp-portal/.../wxcp/service/impl/SendMessageServiceImpl.java
暴露处 zteits-wxcp-portal/.../dubbo/dubbo-wx-pc-provider.xml:21
消费方 zteits-bill、zteits-order、zteits-park、zteits-pay(全是核心模块)

问题:实现类躺在一个 portal 模块里,而方案对 portal 的处理是 "不整体搬迁、Controller 按业务域拆进各模块"。也就是说按原计划搬迁,这 4 个调用会全部断掉。

处置:把 SendMessageServiceImpl 作为随迁例外,落到 parking-module-system(或 parking-module-infra)的 api/ 包,类名保留、逻辑不动。 不要试图"顺手重写"——它是对接企业微信的,报文格式要原样。

2.2 DfGroundLockMsgPushService(地锁消息推送)—— 2 处

项 值
接口 com.zteits.clouds.api.service.datacollect.DfGroundLockMsgPushService
实现类 zteits-glock-collection/.../glockcollect/biz/DfGroundLockMsgPushServiceImpl.java
暴露处 zteits-glock-collection/.../dubbo/dubbo-glock-provider.xml:25
消费方 zteits-bcp-portal(要下线,忽略)、zteits-order(核心模块,必须处理)

问题:zteits-glock-collection 整个模块不在本次并入范围(方案里它属于二期)。 但 zteits-order 有一处活跃调用。

处置:先确认 zteits-order 里那处调用在业务上是否还在用(地锁是历史业务, 很可能已经是死代码)。若还在用 → 随迁这 1 个 impl;若已不用 → 删掉字段与引用, 比"为了一个死调用拖进一整个模块"划算。

3. 有实现类但老系统没声明(8 处)—— 合并会自动修好,但要验证

这些接口在老的 Dubbo 世界里根本没人暴露:<dubbo:reference> 指向一个不存在的 provider,老系统靠 check="false" 起得来,真调用时才失败 —— 属于存量潜伏缺陷。

合成单体后按类型注入,实现类只要在同一个 ApplicationContext 里就会被解析到, 等于合并顺手修好了它。

消费方 接口 实现类模块 备注
zteits-order ...park.carchargeaudit.query.XcCarChargeAuditQueryService zteits-park ⚠️ 唯一涉及核心模块的一处,且确认在被调用
zteits-bcp-portal 同上 zteits-park portal,随下线消失
zteits-bcp-portal ...park.carchargeaudit.oper.XcCarChargeAuditOperService zteits-park 同上
zteits-bcp-portal ...clouds.CloudsParDurationService zteits-pay 同上
zteits-bcp-portal ...order.OrderParkBjxcService zteits-order 同上
zteits-bcp-portal ...pay.CustPersonCreditService zteits-pay 同上
zteits-pay-portal ...pay.CustPersonCreditService zteits-pay 同上
zteits-minipay-portal ...pay.InvoiceHelperService zteits-pay 同上

唯一要跟的是第一行:zteits-order 的 XcCarChargeAuditService:67 与 HivDataCommService:104 都注入了它,XcCarChargeAuditService:67 确有调用。 验证方法:单元/联调时确认 XcCarChargeAuditQueryServiceImpl (@Service("com.zteits.park.biz.carchargeaudit.query.XcCarChargeAuditQueryServiceImpl")) 被扫进容器且按类型能唯一解析。

⚠️ 反过来也要警惕:"合并顺手修好"是双刃剑。老系统里这 8 处调用一直是失败的, 说明业务上可能从没真正跑通过。合并后它们会突然开始真正执行 —— 如果实现里有副作用(写库、发消息),这是行为变化,要在回归里专门过一遍。

4. 找不到实现方的 12 处 —— 不影响单 Jar

12 处的消费方全部是即将下线的 portal:

消费方 处数
zteits-bcp-portal 6
zteits-gcp-portal 4
zteits-pay-portal 1
zteits-business-portal 1

这些 portal 按方案只在"迁一个前端页面时搬一个接口",且 zteits-gcp-portal 已确认废弃 (其路由被政务 PTMS 取代)。所以这 12 处不构成单 Jar 的启动或运行风险, 但核对前端页面清单时要留意:如果有页面依赖这几个接口,说明该页面在老的 Dubbo 体系里本来就是坏的,迁页面时要顺带确认它到底该调哪个新接口。

未实现的接口清单:InOutParkStatisticService、ParkDurationStatisticService、 ParkingReportService、ParkTransactionService、OrderExamineService、IParkService、 TdCCustBusinessMsgQueryService、ParkOrderService、ThirdPlatformApiService。

5. 下一步

事项 状态
六库重名表结构比对 ✅ 已完成,见 <code>../sql/legacy-db-actual.md</code>(19 组重名,12 组结构不一致)
表清单与归属 ✅ 见 <code>../sql/table-inventory.md</code>
迁移源实例 ✅ 张北 renniting-prod-net(模块×库命中矩阵 87~100%)
zt_pay 是否存在 ✅ 不存在该问题:pay 域的表物理上在 zt_order 里
Dubbo 依赖对账 ✅ 本文档
⚠️ zteits-business 11 张表(在另一实例 zt_business) ⏸ 待定:随迁还是砍掉
⚠️ zt_order 里 2018 年订单归档是否搬 ⏸ 待定:影响迁移体量(该库 88 GB 多为归档)
SendMessageService 随迁 待 P2 动手时执行
DfGroundLockMsgPushService 定性 待确认调用是否已是死代码