服务依赖与边界 — 总览

服务边界视角梳理现金贷 12 服务(含外部节点)的依赖拓扑。每服务单独成文见 0112,方法/进展/验收见 README
13-业务时序 互补:13 从业务流看接口,本篇从服务边界看依赖。

各服务文件统一结构:出向依赖(我依赖谁)= 仓库内服务 + 外部三方;入向被依赖(谁依赖我)= 仓库内调用方 + 外部/缺失方入口;末尾边界洞察。即「方向(出/入)× 对象(仓库内/外部)」两维对称,边类型(Feign/事件/HTTP/路由)作为每张表里的一列

关键结论

  • 依赖有三种边,缺一漏链路:Feign 同步 RPC(查询/校验)、异步事件(资金主链路 fcs↔pmt)、非 Feign HTTP(pmt/ims 调支付通道、fds 调 DXA)。只看 Feign 会漏掉放款/还款资金派发。
  • 两个枢纽fcs(账务核心,被 bns 多接口调 + 收 pmt 资金回流)与 pmt(全系统资金出口,被 bns/ims/fcs 调,独占全部支付通道 HTTP 出口)。改动影响面最大。
  • bridge(Transsnet)实际只剩一处活跃:fcs 接 4 个 Feign(风控/优惠券/大数据/发布),但只有 IPublishClient.saveEventLog(放款/还款上报事件日志)在用;风控决策/大数据 BVN/额度/营销/互斥/优惠券全部注释或空壳。判断/核验断裂的真实归属是 res(风控决策)/ 大数据 / crs(KYC核验),不是 bridge。bns 不接 bridge。
  • bas-service 身份已定:内部**用户/组织(员工目录)**服务,fds 用于案件调查员与部门分配,非 C 端登录认证;原 Feign 已注释停用,改由 DXA(dexintec)HTTP 替代。
  • crs、agg 是空壳:无任何出入向依赖边,主链路未接入。
  • 外部回调入向是隐性依赖面:支付通道/中台平台/虚拟子账户系统直接回调进 fcs/pmt/ims(见「外部/缺失方入向」)。这类边纯逆映射看不到——出向(pmt→通道)与回调入向(通道→fcs/pmt/ims)配对才是完整的「请求-回调」资金回路。

图例

符号含义
实线 -->① Feign 同步 RPC
虚线 -.->② 异步事件(Stream/Kafka)
点线 ..>(标 HTTP)③ 非 Feign HTTP(OkHttp/RestTemplate)
粗线 ==>外部/缺失方入向(调用方不在 12 仓库内,被调面扫描得)
✓ 活跃调用方实际调用、实现体非空、未注释
◐ 部分同一客户端部分方法活跃、部分注释
✗ 死整体注释 / 空接口 / return null 空壳

全局依赖图

flowchart LR
  subgraph 入口网关
    GW[bns-gateway 业务网关]
    MGW[middle-gateway 中台网关]
  end
  subgraph 业务编排
    BNS[bns 业务编排]
  end
  subgraph 核心域
    FCS[fcs 账务]
    PFS[pfs 产品工厂]
    FDS[fds 反欺诈/案件]
  end
  subgraph 资金通道域
    IMS[ims 绑卡中台]
    PMT[pmt 支付中台]
  end
  subgraph 基础
    COMET[comet 序列号]
    BASE[(base 共享库)]
  end
  subgraph 空壳[未接入]
    CRS[crs 征信/KYC]
    AGG[agg 风控变量]
  end
  subgraph 外部节点
    BRIDGE[[bridge Transsnet]]
    TANK[[tank-agg 邀请返现]]
    BAS[[bas 用户/组织 经DXA]]
    CHAN[[支付通道 Paystack/Monnify/...]]
    BIGDATA[[大数据 BigData]]
    MDUT[[mdut 触达]]
    PLAT[[中台平台/虚拟子账户]]
    OBS[[华为云 OBS 对象存储]]
    NIBSS[[NIBSS 银行间结算 SOAP]]
    MKT[[mkt 营销中台/优惠券]]
  end

  %% 入口
  GW --> BNS
  MGW -.HTTP路由.-> IMS
  MGW -.HTTP路由.-> PMT
  MGW -.优惠券路由.-> MKT

  %% ① Feign
  BNS -->|6接口活跃·Plutus空壳✗| FCS
  BNS -->|冻结校验| FDS
  BNS -->|routeRedirect✓·bankBvnMatch✗| IMS
  BNS -->|查产品| PFS
  BNS -->|查BVN| PMT
  FCS -->|销账/产品| PFS
  FCS -->|冻结查询| FDS
  FCS -. IBankClient✗ .-> BNS
  FCS -. IPlutusClient空接口✗ .-> IMS
  FCS -->|额度/营销/事件日志◐| BRIDGE
  FCS -->|邀请返现✓·业务不做| TANK
  IMS -->|9通道client| PMT
  PMT -->|IImsCustClient查卡/代扣| IMS
  FDS -. IBasUserClient注释✗ .-> BAS
  BASE -->|序列号| COMET

  %% ② 事件
  FCS -.放款/还款/退款.-> PMT
  FCS -.结清上报.-> MDUT
  PMT -.放款回流/还款结果.-> FCS
  PMT -.绑卡查询回调.-> IMS
  PMT -.推送.-> MDUT
  IMS -.绑卡放款/单笔还款.-> PMT
  IMS -.推送.-> MDUT

  %% ③ 非 Feign HTTP(出向)
  PMT ..->|资金出口| CHAN
  PMT ..->|SOAP 账户/贷记/借记| NIBSS
  NIBSS ==SOAP 回调==> PMT
  PMT ..->|KYC/卡信息| BIGDATA
  IMS ..->|绑卡通道交互| CHAN
  IMS ..->|大数据查询| BIGDATA
  IMS ..->|绑卡结果通知| BNS
  BNS ..->|文件上传| OBS
  FDS ..->|案件附件 S3FileUtil| OBS
  PMT ..->|对账/合同凭证 S3FileUtil| OBS
  FDS ..->|用户/部门查询| BAS

  %% 外部/缺失方入向(被调面扫描,逆映射看不到)
  CHAN ==通道回调==> PMT
  CHAN ==通道回调==> IMS
  CHAN ==通道回调==> FCS
  PLAT ==代付/还款回调==> FCS

粗箭头 ==>外部/缺失方入向——调用方不在 12 仓库内(支付通道、中台平台、虚拟子账户系统回调进来),纯逆映射看不到,靠被调面扫描得出。

说明:base 是共享库(IIdgClient 序列号客户端在此),实际由 bns/fcs 等引用方在运行期调 comet,图中以 base→comet 概括。mdutDXA 为外部触达/用户服务节点。crs、agg 无连线(空壳)。

N×N 依赖矩阵

行=发起方,列=被依赖方。单元含义:F=Feign,E=事件,H=HTTP;后缀 ✓活跃 / ◐部分 / ✗死。外部节点合并在右侧列。

源\目标bnsfcspfsfdsimspmtcomet外部
bnsF◐F✓F✓F◐F✓OBS H✓
fcsF✗F✓F✓F✗ · E✓E✓bridge F◐ · tank-agg F✓ · mdut E✓
pfs
fdsbas F✗ → DXA H✓ · OBS H✓ · 大数据 H✓
imsH✓F✓ · E✓通道 H◐ · 大数据 H✓ · mdut E✓
pmtE✓F✓ · E✓通道 H✓ · NIBSS SOAP双向 · OBS H✓ · 邮件 SMTP · 大数据 H✓ · mdut E✓
comet
baseF✓
crs / agg空壳,无出入向依赖边
GW / MGW网关,经路由(非 Feign)转发至下游;GW→bns,MGW→ims/pmt

入向逆映射:被依赖最多的是 fcs(bns F、pmt E)、pmt(bns F、ims F+E、fcs E)、ims(bns F、fcs F✗、pmt F+E)。pfs 仅被 bns/fcs 读(纯被调,无出向)。comet 仅被 base 调。

外部节点清单

节点类型被谁依赖用途状态
bridge-service(Transsnet)外部桥接fcs(Feign)唯一活跃:触达事件日志 saveEventLog(放款/还款);风控决策/大数据 BVN/额度/营销/互斥/优惠券全部注释或空壳。bns 不接 bridge◐ env TANK_BRIDGE_SERVICE
tank-agg-invite-service外部fcs(Feign)邀请返现 paidOffGen✓ 代码活跃,业务定不做
bas-service → DXA(dexintec)外部用户/组织fds案件调查员/部门查询与分配Feign✗ 停用 → DXA HTTP✓
支付通道(Paystack/Monnify/Flutterwave/InterSwitch/Remita/Seerbit/Zestpay/Budpay/Aicapay/Palmpay)外部三方pmt(HTTP 主出口)、ims(绑卡交互)放款/代扣/转账/账户校验/绑卡
大数据 BigData外部三方pmt(HTTP)KYC/卡信息/用户信息查询
mdut 触达外部/下游fcs/pmt/ims(事件)短信/推送触达
华为云 OBS 对象存储外部存储bns(ObsClient)、fds/pmt(Transsnet 共享库 S3FileUtil)客户上传文件、案件附件、交易/合同凭证
NIBSS 银行间结算系统外部金融基础设施pmt(CxfClient SOAP,双向)账户名查询/贷记放款/借记代扣/Mandate 授权/余额;回调 pmt /DXWS
mkt 营销中台(优惠券)外部营销前端经网关路由(blc/middle-gateway)优惠券全套:couponCalc 减免计算/规则/列表/使用/创建/状态(/mkt/coupon/* 11 路由)✓(不在 12 仓库;fcs 侧 couponDerateCalc 注释,见 13-08)

对象存储后端统一为华为云 OBS(早期用 AWS S3,已整体迁移至华为)。接入有两种历史形态:bns 直连华为 OBS SDK(ObsClient);fds/pmt 经 Transsnet 共享库 S3FileUtil(类名与 amazonaws 类型是迁移前残留,底层 endpoint 已切华为,工具在共享库本仓库不可见)。「S3」命名与 amazonaws SDK 未清理是迁移技术债,非真用 AWS。

通用基础设施 / 横切外部依赖(不逐服务记):各服务普遍依赖 Apollo 配置中心(通道 URL/binding 多在此)、Eureka 服务发现、Redis、MySQL、ShardingSphere(分库分表)、XXL-Job(分布式任务调度中心)。运维错误告警经飞书 webhook(open.feishu.cn,ims/fds/pmt 使用);pmt 另经 SMTP(JavaMail)发对账/通知邮件。这些是平台底座/横切能力,不在各服务「外部三方」重复,统一在此说明一次(SMTP 邮件因 pmt 单独使用且发对账业务邮件,亦在 07-pmt 外部三方列出)。

单列进各服务「外部三方」的标准:承载业务数据或业务能力的仓库外节点(业务通道、OBS 业务文件、NIBSS 资金清算);纯平台底座与运维告警归本节。

外部/缺失方入向(逆映射看不到的边)

矩阵与上半部依赖图是「12 仓库彼此」的边(出向逆映射可得)。但有一类入向,调用方不在 12 仓库内——逆映射永远看不到,须从各服务的「被调面」(service-api 端点 + 事件消费端 + 回调入口)反向扫描才能发现。这类边恰恰暴露系统对外部/缺失系统的隐性依赖。

被调服务入口边类型疑似调用方(仓库外)出处
fcs/fcs/paystack/paystackCallBackHTTP支付通道 Paystack(代扣/还款回调)IPaystackservice
fcs/fcs/platformpay/paymentNotifyHTTP放款中台/代付平台(Plutus)IPlatFormPayService
fcs/fcs/plutus/virtualSubAccountPayEnventsHTTP虚拟子账户系统IPlutusservice
pmt/pmt/outCallbackPayment/*/innerPayment/vpRepayCallBackHTTP支付通道/虚拟子账户(通道异步回调)IOutCallbackPaymentService
ims/inner/v1/paystackEnvents/flutterwaveEnvents/zestpayRedirectHTTP支付通道(绑卡回调/跳转)IInnerService / IInnerWebService
fds/public/black/grey/syncblackGreySyncSinkInputHTTP + 事件外部风控/名单系统(推送)IBlackGreyListService / ReceiveBlackGreyService
pfspfs-web 约 48 个 admin/product 端点HTTP产品/运营管理台(前端)pfs-web/controller

同时修正一条仓库内但被两轮扫描漏掉的边:ims → bns(绑卡结果通知,HTTP BindCardResultNotify.notify → bns /inner/bindCardCallBack)。它在 ims outgoing/bussiness/notify/ 下、非 Feign,按 I*Client.java 扫 Feign 漏;靠 bns 的被调入口 bindCardCallBack 反查才补上。教训:入向不能只靠出向逆映射,必须独立扫被调面。

边界洞察

枢纽服务(改动影响面大)

  • fcs:账务核心。入向 = bns 6 个 Feign 接口 + pmt 资金回流事件;出向 = pfs/fds/bridge/tank-agg + 事件派发 pmt/mdut。是 Feign 与事件两张网的交汇点。
  • pmt:资金出口。入向 = bns/ims(Feign)+ fcs/ims(事件);出向 = 全部支付通道与大数据 HTTP。全系统唯一资金通道出口,单点

死依赖(声明但注释/空壳,形同虚设、改造重点)

  • fcs → bns IBankClient(全方法注释,返回空对象)
  • fcs → ims IPlutusClient、bns → fcs IFcsPlutusClient(空接口,extends 被注释)
  • fcs → bridge IRiskClient(风控决策,整文件注释)、ICouponClient(优惠券,整文件注释)
  • fcs → bridge IBigdataClient(接口空壳 0 方法):queryBigdataBvn/applyExclusionRule/getAvailableLimit/getMarketingUrl 调用全在注释块
  • bns → ims bankBvnMatch(注释)
  • fds → bas IBasUserClient/IGroupUserClient(Feign 注释,改 DXA)
  • fcs → pmt PlutusDoRepayBatchChargePublisher(批量还款事件,整类注释)、fcs 内 BeforePaymentPublisher(整类注释,被 BeforePaymentPlutusPublisher 取代)

外部强耦合

  • 判断/核验断裂,但归属不是 bridge:风控决策(res)、大数据 BVN/互斥/变量(大数据/agg)、KYC/人脸核验(crs)当前全注释或空壳——与 13 的「判断/核验断裂」同源。fcs 虽接 bridge 的对应 Feign,但都已注释;bridge 唯一活跃的是触达事件日志(saveEventLog),自建替代时仅此一处需保留。
  • 资金通道集中 pmt:所有支付通道(11 家)HTTP 出口都在 pmt,是资金链单点。

空壳/未接入

  • crs(征信/KYC)、agg(风控变量):无任何 Feign/事件出入向边,主链路未接入。对应 13 的「核验/变量缺口」。

消费端机制说明:事件消费走 Transsnet 自定义 @InputSimpleEvent + @EnableBinding(XxxSink)(Spring Cloud Stream 旧版),topic↔binding 映射多在 Apollo 配置中心,代码内 application.properties 仅见部分。本篇事件边以 publisher 实现体与消费端 Handler 双向确认为准;少数 publisher(pmt→bns 业务通知、ims 通道通知)在仓库内未找到消费端,标注「消费端不在本仓库」。