第二章:环境搭建与工程初始化
说实话,每次开始一个新项目,我最头疼的就是环境搭建。不是技术难,而是琐碎。但这一步要是没走稳,后面全是坑。今天我就带你一步步把地基打牢。
2.1 用Spring Initializr快速生成项目骨架
我个人习惯用 Spring Initializr 来创建项目。为什么?省时间。你想想看,手动建目录、配pom.xml,搞不好就漏掉某个依赖,排查起来特别烦。
打开浏览器,访问 https://start.spring.io/。我一般这样配置:
- Project:Maven(Gradle也行,但我团队都用Maven)
- Language:Java 17(LTS版本,稳)
- Spring Boot:3.2.x(最新稳定版)
- Group:com.ordersystem
- Artifact:order-system
嗯,这里要注意:Packaging 选 Jar。虽然传统企业喜欢War包,但微服务时代,Jar包部署更灵活。
依赖方面,先别加太多。我建议只选这几个核心的:
- Spring Web
- Lombok(少写样板代码)
- Spring Boot DevTools(开发时热加载)
点击 Generate,下载下来。解压后用 IDEA 打开,等它下载完依赖。第一次会慢一点,喝杯咖啡的功夫就好。
2.2 多模块工程结构设计
单模块项目?小打小闹还行。高并发订单系统?必须拆模块。我在项目中遇到过,所有代码堆在一个模块里,后期维护简直是噩梦。
我设计的模块结构是这样的:
order-system/
├── common/ # 公共工具类、常量、通用异常
├── order/ # 订单核心业务
├── stock/ # 库存服务
├── gateway/ # API网关
└── pom.xml # 父POM
为什么要这么拆?说白了就是职责单一。每个模块只关心自己的事,互不干扰。
来看父POM怎么配。这是整个项目的基石:
<?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>
<groupId>com.ordersystem</groupId>
<artifactId>order-system</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>order</module>
<module>stock</module>
<module>gateway</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2023.0.0</spring-cloud.version>
</properties>
</project>
关键点:父POM的packaging必须是pom,否则Maven不认子模块。
2.3 各模块的Maven依赖配置
每个模块的依赖不一样。我来说说我的配置思路。
common模块
这个模块最轻量,只放公共的东西。依赖也最少:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
我曾经犯过一个错:把数据库驱动也放到common里。结果所有模块都引入了MySQL依赖,明明gateway根本不需要。所以记住:common只放真正公共的东西。
order模块
订单模块是核心,依赖最多:
<dependencies>
<dependency>
<groupId>com.ordersystem</groupId>
<artifactId>common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
小技巧:MyBatis-Plus的版本要跟Spring Boot 3.x匹配。我一开始用了旧版本,启动直接报错,排查了半天。
stock模块
库存模块需要高并发支持,依赖上侧重缓存和数据库:
<dependencies>
<dependency>
<groupId>com.ordersystem</groupId>
<artifactId>common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
</dependency>
</dependencies>
gateway模块
网关模块比较特殊,它不用Spring Web,而是用Spring Cloud Gateway:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.ordersystem</groupId>
<artifactId>common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
警告:gateway模块绝对不能引入spring-boot-starter-web。Spring Cloud Gateway基于WebFlux,跟Servlet容器冲突。我见过有人两个都加了,启动直接报Bean冲突。
2.4 模块间的依赖关系
搞清楚了每个模块的依赖,还得理清它们之间的关系。我画了张图,一看就明白:
从图上能看出来:
- gateway 在最上层,负责接收外部请求,转发给 order 或 stock
- order 和 stock 是平级的业务模块,互相不直接依赖
- common 在最底层,被 order 和 stock 依赖
这种结构的好处是:依赖方向是单向的。不会出现循环依赖,编译和部署都清爽。
2.5 验证工程是否搭建成功
配完了,怎么知道对不对?我一般做三步验证:
- 编译检查:在项目根目录执行
mvn clean compile -DskipTests,看能不能通过 - 启动检查:分别启动 order、stock、gateway 模块,看控制台有没有报错
- 接口检查:写一个简单的测试接口,比如
/health,返回 "OK"
避坑指南:我曾经在 gateway 模块里忘了排除 spring-boot-starter-web,结果启动时一直报端口冲突。排查了半小时才发现。所以启动前,先检查依赖有没有冲突。
好了,环境搭建就到这里。项目骨架已经搭好,依赖也配齐了。下一章我们开始写真正的业务代码。