第一次接触微服务开发时,我习惯把所有代码都堆在一个工程里。结果随着功能增加,项目很快变成了"一锅粥":配置文件互相覆盖、依赖版本冲突、构建时间越来越长。直到有次需要单独升级某个功能模块,才发现牵一发而动全身——这就是典型的单体应用痛点。
多模块工程就像乐高积木,把大系统拆分成多个独立又关联的小模块。以电商系统为例:
我推荐使用这套黄金组合:
验证环境是否就绪:
bash复制java -version
# 应输出类似:openjdk version "17.0.8" 2023-07-18
mvn -v
# 应显示Apache Maven 3.8.6及更高版本
访问start.spring.io时,新手常忽略这三个关键点:
pom类型Spring Web,子模块再按需添加通过IDEA创建新项目时:
Spring InitializrArtifact输入springcloud-parentPackaging从默认的jar改为pom生成后的pom.xml需要手动添加:
xml复制<!-- 必须的父工程标识 -->
<packaging>pom</packaging>
<!-- 统一依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2022.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在父工程中定义属性块,这是我多年实践总结的最佳方案:
xml复制<properties>
<java.version>17</java.version>
<spring-boot.version>3.1.2</spring-boot.version>
<spring-cloud.version>2022.0.3</spring-cloud.version>
<!-- 统一日志版本 -->
<logback.version>1.4.7</logback.version>
</properties>
右键父工程 → New → Module:
user-serviceSpring Web、Lombokxml复制<parent>
<groupId>com.example</groupId>
<artifactId>springcloud-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
配置文件技巧:
yaml复制# application.yml
server:
port: 8081
spring:
application:
name: user-service
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
创建order-service时要注意:
OpenFeign(服务调用)yaml复制spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
FeignClient示例:
java复制@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/users/{id}")
User getUser(@PathVariable Long id);
}
在父工程中定义公共依赖:
xml复制<!-- 公共依赖示例 -->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
子模块引用其他模块时:
xml复制<dependency>
<groupId>com.example</groupId>
<artifactId>common-utils</artifactId>
<version>${project.version}</version>
</dependency>
使用IDEA的Run Dashboard功能:
测试技巧:
bash复制# 同时检查所有服务健康状态
curl -X GET "http://localhost:8080/actuator/health"
在父工程建立config目录:
code复制resources/
├── application-dev.yml
├── application-prod.yml
└── bootstrap.yml
通过VM参数切换环境:
code复制-Dspring.profiles.active=prod
在父pom中添加并行构建配置:
xml复制<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<parallel>true</parallel>
<threadCount>4</threadCount>
</configuration>
</plugin>
</plugins>
</build>
依赖冲突排查:
bash复制mvn dependency:tree -Dverbose -Dincludes=:spring-core
端口占用处理:
java复制// 在测试类中添加
@SpringBootTest(webEnvironment =
SpringBootTest.WebEnvironment.RANDOM_PORT)
循环依赖预防:
@Lazy注解