业务中台(yidun-mplatform-business)
判断「这个客户这个业务还能不能用」,答案只在这里。它是服务生命周期的唯一事实来源。
1. 业务定位
客户开通的每个易盾服务都由四层构成:
- 产品:能力集合(如智能风控、内容安全)。
- 业务:客户在某个产品下的一个服务实例,带
businessCode。 - SKU:具体能力规格,状态决定能力是否可用。
- 套餐:有效期与计费档,绑定在业务上,分主套餐与备用套餐。
策略中心、智能风控判断「服务是否可用」时,读的就是这里的业务与套餐状态。
2. 架构与模块划分
| 模块 | 类型 | 职责 |
|---|---|---|
facade/dubbo-api + dubbo-provider | Dubbo | 业务/产品/套餐对外契约(BusinessInfoFacade 等) |
facade/http-api、facade/http-platform-api | app | 内部 HTTP、开放平台 HTTP |
console/api | app | 控制台入口 |
storage | app | Kafka 消费、事件处理、定时任务 |
scheduler | app | Elastic-Job(如产品演示任务) |
client | jar | 对外发布的本地缓存/事件监听 jar |
contract | jar | 最小契约(枚举/常量) |
service/base、service/business | jar | DAO/Manager、核心业务规则 |
依赖链:common → domain → service/base → service/business → facade/console/storage/scheduler/client。
3. 核心链路
4. 关键数据模型与状态机
| 对象 | 状态 |
|---|---|
业务 BusinessInfo | OPEN(1) / CLOSE(0);关闭原因 NORMAL(-1) / PACKAGE_INVALID(0) 等 |
SKU SkuInfo | NOT_AVAILABLE(500) / ON_TRIAL(800) / TRIAL_EXPIRED(600) / AVAILABLE(900) / END_SERVICE(700) |
套餐 PackageInfo | EFFECT(1) / INVALID(2) / WAITING_EFFECT(3) / CHECKING_EFFECT(4) / CHECK_REFUSE(5) |
核心业务规则集中在 BusinessInfoServiceImpl(约 3400 行):绑定/解绑/切换/延期套餐,以及套餐失效时如何降级到备用套餐。
5. 存储与中间件
| 组件 | 用途 |
|---|---|
| MySQL + MyBatis-Plus | 业务/产品/SKU/套餐绑定关系 |
| Redis | 本地缓存与分布式锁 |
| Kafka | 套餐事件消费、消息投递 |
| 事件中台 | 业务/产品/套餐变更分发 |
6. 设计模式与扩展点
| 扩展点 | 位置 | 说明 |
|---|---|---|
| 操作日志 | @OperateRecord 注解 + IOperateRecord SPI | 按 BusinessDataType 分发记录 |
| 缓存同步 | IEventDataService + 各 *CacheSyncTask | 变更异步推事件中台 |
| 套餐事件处理 | PackageEventMessageConsumer | 新增事件类型扩展处理分支 |
| 对外缓存 | client 模块 BusinessInfoCache | 下游直接依赖 jar 读本地缓存 |
base 层硬约定
新增用 insertBatch、删除用 deleteBatch、修改用 updateBatch,不允许新增其他方法名。操作日志切面依赖这些固定方法名,改名会导致日志漏记。
7. 上下游依赖
| 方向 | 模块 | 说明 |
|---|---|---|
| 上游 | intelligent-risk 管理后台 | 业务/产品/套餐 CRUD |
| 上游 | device-fingerpint | 套餐、产品、转发查询 |
| 上游 | checker-namelist | 业务维度与适用层级 |
| 下游 | mplatform-event | 变更事件分发 |
| 下游 | mplatform-meta | SKU/业务类型/字段/风险标签定义 |
| 下游 | 套餐中台(外部仓库) | 套餐信息与绑定状态回写 |
8. 工程约束与变更红线
- 状态流转必须成对:业务关闭要同时处理套餐绑定状态与套餐中台回写。
- 变更必须发事件:下游读的是本地缓存,不发事件等于配置不生效。
- 删除业务前校验依赖:存在策略、名单引用时禁止删除。
- 套餐切换要考虑时间边界:生效中、待生效、已过期三种状态处理路径不同。
- HTTP 层统一异常与用户信息:
GlobalExceptionHandler、GlobalUserInfoHandler(从 ShenYu 取用户写入modifyBy)。
9. 关键代码索引
| 主题 | 路径 | 说明 |
|---|---|---|
| 业务与套餐核心 | yidun-mplatform-business/service/business/src/main/java/.../BusinessInfoServiceImpl.java | 约 3400 行核心规则 |
| 套餐管理 | yidun-mplatform-business/service/business/src/main/java/.../PackageInfoServiceImpl.java | 查询与到期计算 |
| 事件同步 | yidun-mplatform-business/service/business/src/main/java/.../EventDataServiceImpl.java | 推送事件中台 |
| 套餐事件消费 | yidun-mplatform-business/storage/src/main/java/.../PackageEventMessageConsumer.java | 生效/过期/超额 |
| 操作日志切面 | yidun-mplatform-business/service/business/src/main/java/.../OperateRecordAspect.java | 注解驱动 |
| 对外缓存 | yidun-mplatform-business/client/src/main/java/.../cache/BusinessInfoCache.java | 下游依赖 |
10. 排查要点
| 现象 | 定位 | 结论 |
|---|---|---|
| 客户反馈服务不可用 | 查业务状态 + 套餐状态 + 到期时间 | 套餐过期导致业务被自动关闭 |
| 套餐续费后仍不可用 | 看套餐事件是否消费、业务是否重新开启 | 续费只改套餐,业务需 reEnableWithPackage |
| 下游拿不到最新业务信息 | 看事件是否发出、下游缓存时间 | 未发事件或下游缓存未刷新 |
| 操作日志缺失 | 看是否用了约定的 base 方法名 | 方法名不符导致切面失效 |
| 备用套餐没生效 | 看降级规则与备用套餐状态 | 备用套餐本身不可用 |