第二章:环境搭建与工程初始化

说实话,每次开始一个新项目,我最头疼的就是环境搭建。不是技术难,而是琐碎。但这一步要是没走稳,后面全是坑。今天我就带你一步步把地基打牢。

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(网关) Spring Cloud Gateway order(订单) 核心业务模块 stock(库存) 库存管理模块 common(公共) 工具类、常量、异常 路由转发 路由转发 依赖 依赖 网关层 业务层 库存层 公共层

从图上能看出来:

  • gateway 在最上层,负责接收外部请求,转发给 order 或 stock
  • orderstock 是平级的业务模块,互相不直接依赖
  • common 在最底层,被 order 和 stock 依赖

这种结构的好处是:依赖方向是单向的。不会出现循环依赖,编译和部署都清爽。

2.5 验证工程是否搭建成功

配完了,怎么知道对不对?我一般做三步验证:

  1. 编译检查:在项目根目录执行 mvn clean compile -DskipTests,看能不能通过
  2. 启动检查:分别启动 order、stock、gateway 模块,看控制台有没有报错
  3. 接口检查:写一个简单的测试接口,比如 /health,返回 "OK"

避坑指南:我曾经在 gateway 模块里忘了排除 spring-boot-starter-web,结果启动时一直报端口冲突。排查了半小时才发现。所以启动前,先检查依赖有没有冲突。

好了,环境搭建就到这里。项目骨架已经搭好,依赖也配齐了。下一章我们开始写真正的业务代码。


专注资料整理

专注资料整理