在基于 Dubbo 的分布式服务开发中,如果项目结构不合理,往往会导致依赖混乱、接口耦合过重、版本管理困难等问题。通过对 Maven 多模块(multi-module)项目进行优化,可以更好地分层与隔离,并且为后续的持续集成、部署和扩展带来便利。下面给出一种常见且实用的项目结构方案,帮助你在实际工作中对 Dubbo 项目进行更好的拆分与管理。
一、典型项目结构总览
下面是一个较为典型的 Maven 多模块 项目结构示例(假设工程名为 my-dubbo-project
),你可以根据自己的需求进行适当简化或扩展:
my-dubbo-project
├── my-dubbo-parent // (1) 父模块(Aggregator / Parent POM),管理依赖 & 版本
│ ├── pom.xml
│
├── my-dubbo-bom // (可选) BOM(Bill of Materials),统一各子模块依赖版本
│ ├── pom.xml
│
├── my-dubbo-api // (2) 接口与公共模型模块,定义 Dubbo 服务接口 & DTO
│ ├── pom.xml
│ └── src/main/java
│ └── com.example.api
│ ├── HelloService.java
│ └── ... (其它公用的DTO、常量、枚举等)
│
├── my-dubbo-service // (3) 服务实现(Provider),实现 Dubbo 接口
│ ├── pom.xml
│ └── src/main/java
│ └── com.example.service.impl
│ ├── HelloServiceImpl.java
│ └── ...
│
├── my-dubbo-consumer // (4) 消费者(Consumer),依赖 my-dubbo-api 并调用远程服务
│ ├── pom.xml
│ └── src/main/java
│ └── com.example.consumer
│ ├── ConsumerBootApplication.java
│ ├── SomeController.java
│ └── ...
│
├── my-dubbo-common // (可选) 公共工具模块,提供通用的工具、配置、注解等
│ ├── pom.xml
│ └── src/main/java
│ └── com.example.common
│ ├── utils
│ └── constants
│
└── pom.xml // (5) 根目录的聚合 POM(与 (1) parent POM 可能合并,也可只做 aggregator)
从上至下,我们对各模块的职责进行分析和拆分:
-
my-dubbo-parent
- 用途:作为父 POM(Parent),统一管理版本依赖(Spring Boot、Dubbo、Lombok 等),也可包含 Maven 插件配置、公共的
properties
等。 - 好处:避免在各个子模块中重复声明依赖版本号、Maven 插件配置等。
- 用途:作为父 POM(Parent),统一管理版本依赖(Spring Boot、Dubbo、Lombok 等),也可包含 Maven 插件配置、公共的
-
my-dubbo-api
- 用途:仅包含Dubbo 接口、DTO/VO、常量枚举等无关具体实现的公共类。
- 好处:Consumer 与 Provider 都依赖这个模块即可共享接口定义;确保不包含任何实现类,以避免不必要的耦合与循环依赖。
- 依赖:不依赖其他业务实现包,尽量保持轻量级,通常只需要
api
模块、common
工具包或一些最基础的依赖。
-
my-dubbo-service (Provider)
- 用途:具体的服务实现(
@DubboService
),对外暴露RPC服务。 - 依赖:
my-dubbo-api
(用来实现HelloService
等接口)- Spring Boot / Spring Cloud / Dubbo 相关依赖
- 可能还需要 DB、Cache、消息队列等依赖
- 打包方式:可以打成可执行的
jar
或部署成容器化服务 (Docker)。运行时会注册到注册中心 (如 Nacos / Zookeeper)。
- 用途:具体的服务实现(
-
my-dubbo-consumer (Consumer)
- 用途:消费远程 Dubbo 服务,一般会有 Web 接口、Controller、或其他业务逻辑。
- 依赖:
my-dubbo-api
(拿到接口定义)- 同时引入 Dubbo Client 依赖 (如
dubbo-spring-boot-starter
) - 如果需要暴露 Web,则也会有 Spring Boot Web / Spring MVC 等依赖
- 打包方式:可执行 jar 或 war(如果你使用外部 Tomcat),或同样容器化。
-
my-dubbo-common (可选)
- 用途:提取横切关注点,如日志封装、工具类 (Utils)、基础异常类、通用注解或拦截器等。
- 依赖:一般只