Spring Boot单体、多模块、微服务项目核心区分

前言

日常开发中,很多Spring Boot初学者容易混淆单体项目、多模块项目、微服务项目的概念:

  • 为什么有的项目只有一个启动类?
  • 多模块是不是“拆文件夹”?
  • 微服务和多模块到底差在哪?

本文从概念本质、创建实操、核心特征、适用场景四个维度,彻底讲透三者的区别,全程结合IDEA实操,新手也能秒懂。

一、核心概念:先搞懂“本质差异”

维度 单体项目 多模块项目 微服务项目
本质 单一应用(代码无拆分) 单体应用的代码结构优化 多个独立应用的分布式架构
部署形态 单JAR/WAR,单进程运行 单JAR/WAR,单进程运行 多JAR,多进程/多服务器运行
启动类 1个 1个(仅应用模块有) N个(每个服务1个)
模块依赖 无模块拆分,代码在一个包 本地Maven依赖(编译时) 网络通信依赖(运行时)
核心目标 快速开发小型应用 单体应用代码解耦、易维护 业务解耦、独立扩容、故障隔离

一句话总结

  • 单体项目:“一个文件夹装所有代码”;
  • 多模块项目:“把一个文件夹拆成多个子文件夹,仍装在同一个箱子里”;
  • 微服务项目:“把一个箱子拆成多个独立箱子,每个箱子单独存放、单独搬运”。

二、IDEA实操:创建环节的核心区别

1. Spring Boot单体项目(最简创建)

适用场景

小型工具、个人项目、快速验证的Demo(代码量<5000行)。

创建步骤

  1. IDEA → New → Project → 选择「Spring Initializr」;
  2. 填写Group/Artifact(如com.demo → demo-single);
  3. 勾选基础依赖(如Spring Web);
  4. 完成创建,自动生成1个启动类+application.yml。

项目结构(核心特征)

demo-single(单体项目)
├── src/main/java/com/demo/DemoSingleApplication.java(唯一启动类)
├── src/main/resources/application.yml
└── pom.xml(包含Spring Boot所有依赖)

2. Spring Boot多模块项目(代码拆分)

适用场景

中大型单体应用(代码量>5000行),需要拆分代码(如通用工具、业务逻辑、数据层分离)。

核心原则

1个Spring Initializr(应用模块) + N个纯Maven模块(非应用模块),仅应用模块有启动类。

创建步骤(IDEA实操)

步骤1:创建父工程(纯Maven,无启动类)
  • New → Project → 选择「Maven」(⚠️ 不是Spring Initializr);
  • 填写Group/Artifact(如com.demo → demo-multi-parent);
  • 修改pom.xml,设置打包方式为pom(仅做依赖管理):
<packaging>pom</packaging>
<!-- 统一管理依赖版本(可选) -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.2.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
步骤2:创建非应用模块(纯Maven,无启动类)
  • 父工程右键 → New → Module → 选择「Maven」;
  • 命名为common-module(通用工具模块),仅存放工具类、实体类;
  • pom.xml仅保留基础依赖(无Spring Boot启动器):
<parent>
    <groupId>com.demo</groupId>
    <artifactId>demo-multi-parent</artifactId>
    <version>1.0.0</version>
</parent>
<artifactId>common-module</artifactId>
<packaging>jar</packaging>

<!-- 仅通用依赖,无Spring Boot核心 -->
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
    </dependency>
</dependencies>
步骤3:创建应用模块(Spring Initializr,唯一启动类)
  • 父工程右键 → New → Module → 选择「Spring Initializr」;
  • 命名为app-module,勾选Spring Web依赖;
  • pom.xml依赖非应用模块+Spring Boot核心:
<parent>
    <groupId>com.demo</groupId>
    <artifactId>demo-multi-parent</artifactId>
    <version>1.0.0</version>
</parent>
<artifactId>app-module</artifactId>
<packaging>jar</packaging>

<dependencies>
    <!-- 依赖本地common模块 -->
    <dependency>
        <groupId>com.demo</groupId>
        <artifactId>common-module</artifactId>
        <version>1.0.0</version>
    </dependency>
    <!-- Spring Boot核心依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<!-- 可运行JAR打包插件 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

项目结构(核心特征)

demo-multi-parent(父工程,无启动类)
├── common-module(纯Maven,无启动类)
│   ├── src/main/java/com/demo/common/(工具类)
│   └── pom.xml
└── app-module(Spring Initializr,有启动类)
    ├── src/main/java/com/demo/AppApplication.java
    ├── src/main/resources/application.yml
    └── pom.xml

3. Spring Boot微服务项目(独立应用)

适用场景

大型分布式系统(如电商、金融),需要按业务拆分独立服务(用户、订单、商品)。

核心原则

所有模块都是Spring Initializr,每个模块都是独立应用,各有启动类+独立配置。

创建步骤(IDEA实操)

步骤1:创建父工程(可选,统一依赖版本)
  • 同多模块父工程,仅做依赖管理(打包方式pom)。
步骤2:创建多个微服务模块(全是Spring Initializr)
  • 父工程右键 → New → Module → 选择「Spring Initializr」;
  • 依次创建user-service(用户服务)、order-service(订单服务);
  • 每个服务独立配置:
    • user-service:端口8081,依赖Nacos/OpenFeign;
    • order-service:端口8082,依赖Nacos/OpenFeign。
步骤3:核心pom.xml(以user-service为例)
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.0</version>
</parent>
<artifactId>user-service</artifactId>
<packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 微服务通信依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

<!-- 独立打包插件 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

项目结构(核心特征)

demo-microservice-parent(父工程,无启动类)
├── user-service(Spring Initializr,有启动类)
│   ├── src/main/java/com/demo/user/UserApplication.java
│   ├── src/main/resources/application.yml(端口8081)
│   └── pom.xml
└── order-service(Spring Initializr,有启动类)
    ├── src/main/java/com/demo/order/OrderApplication.java
    ├── src/main/resources/application.yml(端口8082)
    └── pom.xml

三、避坑指南:新手常犯的错误

1. 多模块项目“先创建再删启动类”

错误操作:所有模块都用Spring Initializr创建,再手动删启动类。
正确做法:非应用模块直接选「Maven Module」,从根源避免多余代码。

2. 微服务项目“共用配置文件”

错误操作:多个微服务共用一个application.yml。
正确做法:每个微服务独立配置端口、数据库、注册中心地址,保证独立运行。

3. 混淆“多模块”和“微服务”

错误认知:多模块拆完就是微服务。
核心区别:多模块最终打包成1个JAR(单体),微服务每个模块打包成独立JAR(分布式)。

四、选型建议:该用哪种架构?

项目规模 推荐架构 核心优势
小型项目(<5k行) 单体项目 开发快、部署简单
中型项目(5k-2w行) 多模块项目 代码解耦、易维护、部署简单
大型项目(>2w行) 微服务项目 独立扩容、故障隔离、技术栈灵活

总结

  1. 单体项目:单一Spring Initializr模块,1个启动类,单JAR部署;
  2. 多模块项目:1个Spring Initializr + 多个Maven模块,仅1个启动类,仍单JAR部署;
  3. 微服务项目:全量Spring Initializr模块,每个模块1个启动类,多JAR独立部署;
  4. 核心差异不在“代码拆分”,而在“部署形态”和“依赖方式”——多模块是本地依赖,微服务是网络依赖。

掌握这三者的区别,你就能根据项目规模精准选型,避免从一开始就走弯路。如果有任何问题,欢迎评论区交流~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐