Java:DDD 微服务分层 + API 契约 + Provider 供给分层/API+Provider双模块架构全景深度解析

📅 2026/8/4 2:32:51 👁️ 阅读次数 📝 编程学习
Java:DDD 微服务分层 + API 契约 + Provider 供给分层/API+Provider双模块架构全景深度解析

abc-def-product-center-api

abc-def-product-center-provider
这是标准 DDD 微服务分层 + API 契约 + Provider 供给分层的企业级 SpringBoot 多模块拆分范式,广泛用于配置中心、商品中心、业务中台系统。

一、两个模块字面含义 & 核心定位对照表

表 1:api 模块 vs provider 模块职责边界总览

模块名称

全称释义

打包类型

核心定位

设计思想

对应架构角色

abc-def-product-center-api

产品中心 API 契约层

jar 包(非可执行)

契约定义层:只放接口、入参出参 DTO、枚举、常量、Feign 接口、统一返回体

面向调用方定义标准契约,不包含任何业务实现代码

API 契约层

abc-def-product-center-provider

产品中心服务供给实现层

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.def.product.api

Feign 远程调用接口(ProductConfigFeignApi)

给外部微服务提供调用入口,接口签名永久固化

com.def.product.dto

入参 DTO、出参 DTO、分页实体

所有请求响应字段、类型、必填规则统一约定

com.def.product.enums

业务枚举、环境枚举、配置类型枚举

上下游枚举取值完全一致,避免参数错乱

com.def.product.common

全局统一返回体Result<T>、错误码枚举、常量

全局响应格式标准化,前端 / 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 三层结构设计详情

层级

组件

作用

抽象层:顶层接口

ConfigProvider

定义统一能力:读取配置、保存配置、删除配置、版本回滚、监听配置变更

通用抽象父类

AbstractConfigProvider

模板方法,抽取缓存、序列化、参数校验公共逻辑

具体实现子类

MysqlProvider / RedisProvider / FileProvider

各自实现对应存储的读写逻辑

工厂入口

ProviderFactory

根据配置文件config.provider.type自动创建对应实现类实例

表 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 微服务中台(商品中心、配置中心、用户中心)通用拆分方案,适配长期迭代、多团队协作、分布式部署场景。