服务依赖与边界 — 总览
从服务边界视角梳理现金贷 12 服务(含外部节点)的依赖拓扑。每服务单独成文见
01–12,方法/进展/验收见 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 概括。mdut、DXA为外部触达/用户服务节点。crs、agg 无连线(空壳)。
N×N 依赖矩阵
行=发起方,列=被依赖方。单元含义:F=Feign,E=事件,H=HTTP;后缀 ✓活跃 / ◐部分 / ✗死。外部节点合并在右侧列。
| 源\目标 | bns | fcs | pfs | fds | ims | pmt | comet | 外部 |
|---|---|---|---|---|---|---|---|---|
| bns | — | F◐ | F✓ | F✓ | F◐ | F✓ | — | OBS H✓ |
| fcs | F✗ | — | F✓ | F✓ | F✗ · E✓ | E✓ | — | bridge F◐ · tank-agg F✓ · mdut E✓ |
| pfs | — | — | — | — | — | — | — | — |
| fds | — | — | — | — | — | — | — | bas F✗ → DXA H✓ · OBS H✓ · 大数据 H✓ |
| ims | H✓ | — | — | — | — | F✓ · E✓ | — | 通道 H◐ · 大数据 H✓ · mdut E✓ |
| pmt | — | E✓ | — | — | F✓ · E✓ | — | — | 通道 H✓ · NIBSS SOAP双向 · OBS H✓ · 邮件 SMTP · 大数据 H✓ · mdut E✓ |
| comet | — | — | — | — | — | — | — | — |
| base | — | — | — | — | — | — | F✓ | — |
| 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/paystackCallBack 等 | HTTP | 支付通道 Paystack(代扣/还款回调) | IPaystackservice |
| fcs | /fcs/platformpay/paymentNotify 等 | HTTP | 放款中台/代付平台(Plutus) | IPlatFormPayService |
| fcs | /fcs/plutus/virtualSubAccountPayEnvents 等 | HTTP | 虚拟子账户系统 | IPlutusservice |
| pmt | /pmt/outCallbackPayment/*、/innerPayment/vpRepayCallBack | HTTP | 支付通道/虚拟子账户(通道异步回调) | IOutCallbackPaymentService |
| ims | /inner/v1/paystackEnvents、/flutterwaveEnvents、/zestpayRedirect 等 | HTTP | 支付通道(绑卡回调/跳转) | IInnerService / IInnerWebService |
| fds | /public/black/grey/sync、blackGreySyncSinkInput | HTTP + 事件 | 外部风控/名单系统(推送) | IBlackGreyListService / ReceiveBlackGreyService |
| pfs | pfs-web 约 48 个 admin/product 端点 | HTTP | 产品/运营管理台(前端) | pfs-web/controller |
同时修正一条仓库内但被两轮扫描漏掉的边:ims → bns(绑卡结果通知,HTTP
BindCardResultNotify.notify→ bns/inner/bindCardCallBack)。它在 imsoutgoing/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 → fcsIFcsPlutusClient(空接口,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 通道通知)在仓库内未找到消费端,标注「消费端不在本仓库」。