Java:DDD 微服务分层 + API 契约 + Provider 供给分层/API+Provider双模块架构全景深度解析
abc-def-product-center-api
abc-def-product-center-provider
这是标准 DDD 微服务分层 + API 契约 + Provider 供给分层的企业级 SpringBoot 多模块拆分范式,广泛用于配置中心、商品中心、业务中台系统。
一、两个模块字面含义 & 核心定位对照表
表 1:api 模块 vs provider 模块职责边界总览
模块名称 | 全称释义 | 打包类型 | 核心定位 | 设计思想 | 对应架构角色 |
| 产品中心 API 契约层 | jar 包(非可执行) | 契约定义层:只放接口、入参出参 DTO、枚举、常量、Feign 接口、统一返回体 | 面向调用方定义标准契约,不包含任何业务实现代码 | API 契约层 |
| 产品中心服务供给实现层 | SpringBoot 可执行 jar | 服务提供层:业务逻辑、数据库操作、Provider 数据源适配、Controller、启动类、配置文件 | 实现 api 模块定义的所有接口,对外提供服务能力 | Provider 供给层 + 核心业务层 |
二、整体架构五层全景
表 2:完整分层架构流转表
分层层级 | 归属模块 | 包含内容 | 核心技术 | API/Provider 关联作用 |
1. 契约定义层(API) | api 模块 | Feign 远程调用接口、Request/Response DTO、枚举、错误码、分页封装、OpenAPI 注解、统一返回 Result | OpenAPI3、JSR303、Feign 注解 | 上下游交互唯一契约,消费者只依赖此模块 |
2. 网关 / 接入层 | provider 模块 (Controller) | REST 控制器,实现 api 模块里定义的接口、全局拦截器、鉴权、参数校验 | SpringMVC、全局异常处理器 | 接收 http 请求,严格按照 API 契约出入参交互 |
3. 业务核心层 | provider 模块 (service) | 业务编排、配置 CRUD、版本管理、动态推送、环境隔离、事务逻辑 | SpringBoot、事务、事件驱动 | 调用下层 Provider 数据源能力,不直接操作存储 |
4. 数据源供给层(Provider 核心) | provider 模块 (repository/provider 包) | 统一数据源抽象接口、多存储实现 (Mysql/Redis/ 文件)、工厂模式、缓存适配、配置读写能力 | 策略模式、工厂模式、SPI、装饰器缓存 | 屏蔽底层存储差异,上层业务无感切换数据源 |
5. 底层存储层 | 外部中间件 | Mysql、Redis、Git、本地配置文件 | MySQL、Redis、Git | 所有配置数据持久化源头 |
完整调用链路:
微服务消费者 ←依赖 api 模块契约→ HTTP/Feign 调用 → Provider 服务 (Controller) → Service 业务逻辑 → Provider 数据源适配层 → 数据库 / 缓存
三、Maven 依赖关系拓扑表格
表 3:模块之间依赖流向、打包用途
依赖方向 | 依赖关系说明 | 使用场景 |
provider 依赖 api | ✅ 必选 provider 服务实现 api 中定义的所有接口,导入 api 包拿到接口、DTO | 服务端实现契约接口 |
所有调用方(其他微服务)依赖 api | ✅ 必选 业务服务只引入 api 模块,无需引入 provider 实现包,通过 Feign 远程调用 | 客户端远程调用,契约解耦 |
api 模块 不依赖 provider | ❌ 禁止反向依赖 API 契约层不能引用任何业务实现代码,保证契约纯净稳定 | 契约一旦发布不可随意改动 |
四、api 模块内部详细结构(纯契约无业务实现)
表 4:api 模块目录结构与每部分作用
包 / 文件夹 | 存放内容 | 契约价值 |
com. | Feign 远程调用接口(ProductConfigFeignApi) | 给外部微服务提供调用入口,接口签名永久固化 |
com. | 入参 DTO、出参 DTO、分页实体 | 所有请求响应字段、类型、必填规则统一约定 |
com. | 业务枚举、环境枚举、配置类型枚举 | 上下游枚举取值完全一致,避免参数错乱 |
com. | 全局统一返回体 | 全局响应格式标准化,前端 / SDK 统一解析 |
resources | OpenAPI 注解配置、契约文档配置 | 自动生成接口文档,作为协作依据 |
核心特点:api 模块打包后是纯契约 jar,无任何 ServiceImpl、Mapper、启动类、yml 配置
五、provider 模块内部结构(实现层 + 数据源供给层)
表 5:provider 模块分层包结构(Provider 模式落地)
包层级 | 模块内容 | Provider 设计模式应用 |
controller | RestController,实现 api 模块 Feign 接口 | 接收 http 请求,出入参严格遵守 API 契约 |
service | 业务服务层 ConfigService、VersionService、GrayPushService | 业务编排,只调用 Provider 抽象接口,不绑定具体存储 |
provider(核心供给包) | 1. ConfigProvider 顶层抽象接口 2. MysqlConfigProvider、RedisConfigProvider 具体实现类 3. ProviderFactory 工厂类 4. 缓存装饰器 | 策略模式 + 工厂模式:切换存储只改配置,业务代码零修改 |
mapper | MyBatis 持久层,Mysql 专属读写逻辑 | 仅 MysqlProvider 调用,其他数据源完全不依赖 |
config | Spring 配置类、Provider 自动装配配置、缓存配置 | 读取 yml 配置动态加载对应数据源 Provider |
启动类 | ProductCenterProviderApplication | 可执行 SpringBoot 服务,对外提供完整配置中心能力 |
六、Provider 供给模式核心原理拆解(表格)
表 6:Provider 三层结构设计详情
层级 | 组件 | 作用 |
抽象层:顶层接口 |
| 定义统一能力:读取配置、保存配置、删除配置、版本回滚、监听配置变更 |
通用抽象父类 |
| 模板方法,抽取缓存、序列化、参数校验公共逻辑 |
具体实现子类 | MysqlProvider / RedisProvider / FileProvider | 各自实现对应存储的读写逻辑 |
工厂入口 |
| 根据配置文件 |
表 7:多数据源切换配置示例
启用存储类型 | yml 配置片段 | 生效实现类 | 适用场景 |
MySQL(生产) | config.provider.type=mysql | MysqlConfigProvider | 正式环境持久化、版本回溯、事务 |
Redis(热点缓存) | config.provider.type=redis | RedisConfigProvider | 高频读取轻量化配置 |
本地文件(开发) | config.provider.type=file | LocalFileConfigProvider | 本地调试,无需启动数据库 |
七、API 契约协作全流程(上下游开发规范)
表 8:契约开发四阶段流程表
阶段 | 参与角色 | 工作内容 | API 契约价值 |
1. 契约设计 | 服务端 + 调用方前端 / 微服务 | 共同敲定所有接口、字段、错误码、枚举,编写 api 模块 DTO+Feign 接口 | 提前约定,杜绝后期对接字段不一致 |
2. 服务端开发 | provider 模块开发人员 | 实现 api 内所有接口,参数校验、业务逻辑开发 | 代码必须遵循契约定义,不能私自修改出入参 |
3. 客户端接入 | 其他微服务开发 | 引入 api 依赖包,直接使用 Feign 接口调用远程服务 | 无需手写 http 请求,代码自动提示,类型安全 |
4. 迭代升级 | 全团队 | 契约改动需要升级版本号,保证向下兼容旧接口 | 线上调用不会因为接口迭代报错 |
八、架构优劣对比:传统单体 vs API+Provider 双模块架构
表 9:两种架构全方位对比
对比维度 | 传统单体 SpringBoot 项目 | API+Provider 双模块架构(你当前项目结构) |
调用耦合 | 调用方直接依赖服务实现包,耦合极强 | 调用方只依赖纯净 API 契约包,完全解耦 |
数据源扩展 | 存储逻辑硬编码,新增存储需要大面积改代码 | 新增存储只需要新增 Provider 实现类,上层业务无改动 |
团队协作 | 前后端对接反复调试,无统一标准 | 基于 OpenAPI 契约并行开发,联调成本极低 |
打包部署 | 整体打包,微小改动就要全量发布 | 契约包可单独版本管理,provider 服务可灰度发布 |
单元测试 | 必须依赖数据库,测试繁琐 | 可 Mock Provider 接口,脱离存储做纯业务测试 |
跨语言调用 | 无标准文档,对接困难 | 导出 OpenAPI 规范,可生成 Go/Python 多语言客户端 |
配置中心适配 | 很难做到动态配置推送、多环境隔离 | Provider 层统一实现配置变更监听,全数据源支持动态刷新 |
九、适配配置中心场景专属能力落地表格
表 10:配置中心核心功能在该架构下的实现位置
配置中心功能 | 实现所属模块 | 依托架构能力 |
配置增删改查、版本快照回滚 | provider-service + Provider 层 | Provider 负责存储读写,service 编排业务逻辑 |
多环境、多租户配置隔离 | provider-service 层 | 业务层做数据隔离,底层 Provider 统一读写 |
配置动态推送、客户端自动刷新 | Provider 变更监听事件 + API 推送接口 | Provider 感知数据变动,通过 API 契约推送给客户端 SDK |
配置灰度发布、审批流 | provider 业务层编排 | 不侵入底层存储供给逻辑 |
配置加解密 | Provider 切面统一处理 | 所有数据源读写自动加解密,上层无感知 |
十、核心设计思想总结
1、API 模块 = 契约边界(面向调用方)遵循接口隔离原则,对外只暴露约定好的调用契约,屏蔽内部所有实现细节,保证接口稳定;
2、Provider 模块 = 能力供给(面向内部存储)遵循依赖倒置原则,业务层依赖抽象 Provider 接口,不依赖具体存储实现,灵活适配多种配置存储介质;
3、双模块拆分 = 微服务标准最佳实践Java 微服务中台(商品中心、配置中心、用户中心)通用拆分方案,适配长期迭代、多团队协作、分布式部署场景。