1. 项目工程目录
这张图是一个 SpringCloud 多模块项目依赖结构图,是我们入门微服务时最常用的项目工程骨架。
- **顶层父工程:cloud-demo:**这是整个项目的根模块,主要负责统一管理版本依赖,解决了微服务中最常见的依赖冲突问题。定义了 SpringBoot、SpringCloud、SpringCloud Alibaba 的版本号,并通过 dependencyManagement 标签统一管理。所有子模块都继承这个父工程,就不用再单独声明版本号了,避免了不同模块依赖版本不一致的问题。
- **公共依赖模块:services(管理微服务):**这是一个被所有业务服务继承的父模块,作用是封装所有微服务都需要的公共依赖。例如:SpringWeb、MyBatis、Lombok、Nacos 客户端、OpenFeign 等。业务服务只需要继承 services 模块,就能自动获得这些公共依赖,减少重复配置。
- **业务微服务模块:**service-product、service-order 等这些是真正的业务模块,每个模块代表一个独立的微服务。service-product:商品服务,处理商品相关的业务逻辑。service-order:订单服务,处理订单相关的业务逻辑。它们继承了 services 模块,间接继承了 cloud-demo 父工程,因此能享受到统一的版本管理和公共依赖。
继承关系:service-product → services → cloud-demo业务服务模块继承 services,services 再继承 cloud-demo。
这种结构的核心优势:
- 统一版本管理:所有框架版本在父工程中统一控制,从根源避免依赖冲突。
- 依赖复用:公共依赖只在 services 模块声明一次,所有业务服务直接继承,减少重复代码。
- 模块化解耦:每个业务模块独立开发、编译、打包,互不影响,符合微服务 "高内聚、低耦合" 的思想。
2. 创建项目
1.1 创建父项目cloud-demo
创建完成之后我们需要修改项目的pom:
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 重点:父项目必须是 pom 打包方式 -->
<packaging>pom</packaging>
<groupId>com.ting.study</groupId>
<artifactId>cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-demo</name>
<description>cloud-demo</description>
<properties>
<!-- Java版本,springCloud 和springCloudAlibaba版本-->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- <parent> 已经指定了 Spring Boot 版本,这里就不需要了 -->
<!-- <spring.boot.version>3.3.4</spring.boot.version>-->
<spring.cloud.version>2023.0.3</spring.cloud.version>
<spring.cloud.alibaba.version>2023.0.3.2</spring.cloud.alibaba.version>
</properties>
<!-- dependencyManagement:依赖版本管理,子模块继承时不会自动引入,只会统一版本 -->
<dependencyManagement>
<dependencies>
<!-- Spring Cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- <parent> 已经指定了 Spring Boot 版本,这里就不需要了 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-dependencies</artifactId>-->
<!-- <version>${spring.boot.version}</version>-->
<!-- <type>pom</type>-->
<!-- <scope>import</scope>-->
<!-- </dependency>-->
<!-- Spring Cloud Alibaba 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 子模块会在这里自动生成,不用手动写 -->
<!-- 父项目是 pom 类型,只用来管理版本、管理子模块
不写代码、不运行、不打包
不需要 SpringBoot 打包插件-->
<!-- <build>-->
<!-- <plugins>-->
<!-- <plugin>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
<!-- </plugin>-->
<!-- </plugins>-->
<!-- </build>-->
</project>
这里要注意:父项目打包方式是 <packaging>pom</packaging>不写业务代码、不启动、不打成可运行 jar只做两件事:统一管理、收纳子模块
所以父项目只保留pom文件即可
2.2 创建services


注意这里选择新建模块而不是spring项目,父项目本身已经基于 SpringBoot 构建,内置了 spring-boot-starter-parent 版本管理。子项目直接继承父工程即可统一版本。如果子项目创建时也勾选为 SpringBoot 项目,会再次重复继承一层 spring-boot-starter-parent,造成依赖嵌套混乱、版本冗余冲突。
services = 中间层公共父模块 作用:把所有微服务(order、product、user...)都要用到的依赖,统一放在这里,让子模块不用重复引,同样不需要写代码需要把打包方式改为pom:
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.ting.study</groupId>
<artifactId>cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<packaging>pom</packaging>
<artifactId>services</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
2.3 创建服务

创建成功后我们可以在services中引入公共依赖来测试是否正确:

可以看到在services中引入了nacos和openfeign后,product和order中也同时出现了nacos

