一、单体 spring boot 工程
单工程、单可执行 jar 包,所有业务逻辑、配置、依赖都集中在一个工程内,无需模块拆分,开发和部署成本低,适合中小型 crud 项目、快速原型开发。
一、接收类的核心存放目录
1. 基础目录结构(单项目)
接收类统一放在根包下的dto目录,且建议再细分req(request,接收类)和resp(response,响应类)子目录,结构如下:
demo-boot-single/ # 项目根目录 ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/example/demo/ # 根包(启动类必须在此) │ │ │ ├── demoapplication.java # 唯一启动类(核心入口) │ │ │ ├── controller/ # 接口层:接收前端请求 │ │ │ │ ├── usercontroller.java │ │ │ │ └── ordercontroller.java │ │ │ ├── service/ # 业务层接口:定义业务方法 │ │ │ │ ├── userservice.java │ │ │ │ └── orderservice.java │ │ │ ├── service/impl/ # 业务层实现:核心业务逻辑 │ │ │ │ ├── userserviceimpl.java │ │ │ │ └── orderserviceimpl.java │ │ │ ├── mapper/ # 数据访问层:对接数据库 │ │ │ │ ├── usermapper.java │ │ │ │ └── ordermapper.java │ │ │ ├── entity/ # 实体层:映射数据库表 │ │ │ │ ├── user.java │ │ │ │ └── order.java │ │ │ ├── dto/ # 数据传输对象:封装入参/出参 │ │ │ │ ├── req/ # 请求dto:接收前端参数 │ │ │ │ │ ├── useraddreqdto.java │ │ │ │ │ └── orderqueryreqdto.java │ │ │ │ └── resp/ # 响应dto:返回前端数据 │ │ │ │ ├── userinforespdto.java │ │ │ │ └── orderlistrespdto.java │ │ │ ├── config/ # 配置层:自定义bean/框架配置 │ │ │ │ ├── mybatisconfig.java │ │ │ │ └── redisconfig.java │ │ │ ├── constant/ # 常量层:枚举/固定值 │ │ │ │ ├── commonconstant.java │ │ │ │ └── userstatusenum.java │ │ │ ├── exception/ # 异常层:自定义异常+全局处理 │ │ │ │ ├── businessexception.java │ │ │ │ └── globalexceptionhandler.java │ │ │ ├── interceptor/ # 拦截器:登录校验/日志 │ │ │ │ └── logininterceptor.java │ │ │ └── util/ # 工具层:通用辅助方法 │ │ │ ├── dateutil.java │ │ │ └── httputil.java │ │ └── resources/ # 资源目录 │ │ ├── application.yml # 核心配置文件(端口/数据库/redis) │ │ ├── application-dev.yml # 开发环境配置 │ │ ├── application-prod.yml # 生产环境配置 │ │ ├── mapper/ # mybatis xml映射文件 │ │ │ ├── usermapper.xml │ │ │ └── ordermapper.xml │ │ ├── static/ # 静态资源(css/js/图片,可选) │ │ ├── templates/ # 视图模板(thymeleaf,可选) │ │ └── db/ # 数据库脚本 │ │ ├── schema.sql # 建表语句 │ │ └── data.sql # 初始化数据 │ └── test/ # 测试目录(和main结构一致) │ └── java/com/example/demo/ │ ├── controller/ │ │ └── usercontrollertest.java │ ├── service/ │ │ └── userservicetest.java │ └── demoapplicationtests.java ├── pom.xml # maven依赖(所有依赖集中在此) ├── readme.md # 项目说明 └── .gitignore # git忽略文件
2. 按业务模块细分(复杂单项目)
如果项目业务模块多(如用户、订单、商品),可在req下再按模块拆分,更易维护:
plaintext
dto/
├── req/
│ ├── user/ # 用户模块接收类
│ │ ├── useraddreqdto.java
│ │ └── userloginreqdto.java
│ ├── order/ # 订单模块接收类
│ │ ├── ordercreatereqdto.java
│ │ └── ordercancelreqdto.java
│ └── ai/ # ai模块接收类
│ └── chatreqdto.java
└── resp/
├── user/
└── order/二、接收类的命名规范(必遵循)
接收类的命名要直观体现 “业务 + 操作 + 类型”,让开发者一眼知道用途:
表格
场景 | 命名规则 | 示例 |
新增接口接收类 | 模块名 + add + reqdto | useraddreqdto 、orderaddreqdto |
修改接口接收类 | 模块名 + update + reqdto | userupdatereqdto |
查询接口接收类 | 模块名 + query + reqdto | orderqueryreqdto 、userpagereqdto |
登录 / 特殊操作接收类 | 模块名 + 操作 + reqdto | userloginreqdto 、chatsendreqdto |
三、关键注意事项(避坑)
禁止直接用实体类做接收类:
- 实体类(
entity/user.java)是数据库表的映射,包含主键、创建时间等前端无需传递的字段,直接接收会暴露数据库结构,且易引发参数安全问题; - 示例:前端仅需传
username/password,但实体类有id/createtime,用实体类接收会导致这些字段被前端随意赋值。
简单场景的简化方案:
- 极小项目(仅 1-2 个接口):可临时用
@requestparam单个接收参数,无需创建接收类; - 中等项目:至少拆分
req/resp,避免接收 / 响应类混放。
接收类的使用示例:在 controller 中调用接收类,语义清晰:java运行
@restcontroller
@requestmapping("/user")
public class usercontroller {
@postmapping("/add")
// 直接接收封装好的接收类
public result<?> adduser(@requestbody useraddreqdto useraddreqdto) {
userservice.adduser(useraddreqdto);
return result.success();
}
}特殊接收类的处理:
- 文件上传接收类:可单独放在
dto/req/file/下,如fileuploadreqdto.java; - 分页通用接收类:可放在
dto/req/common/下,如pagereqdto.java,供所有模块复用。
总结:
- 核心位置:后端接收类统一放在
dto/req/目录下,按业务模块(如user/order)细分; - 命名规范:模块名 + 操作 + reqdto(如
useraddreqdto),直观体现用途; - 核心原则:接收类和实体类、响应类严格区分,禁止用实体类直接接收前端参数。
二、spring boot 父子工程
本质还是单体工程(最终打包为一个 jar),但在代码层面拆分为 “父工程 + 子模块”,将通用代码(工具、异常、常量)抽离为独立子模块,业务代码保留在另一个子模块,提升代码复用性和维护性,适合中等规模、需要代码分层管理的项目。
一、父子工程整体结构(核心:公共模块独立,业务模块保留)
demo-boot-parent/ # 父工程(仅管理依赖版本,无业务代码) ├── pom.xml # 父pom:统一管理所有子模块的依赖版本 ├── demo-common/ # 子模块1:通用模块(所有业务复用) │ ├── pom.xml │ └── src/main/java/com/example/demo/common/ │ ├── constant/ # 通用常量/枚举 │ │ ├── commonconstant.java │ │ └── userstatusenum.java │ ├── exception/ # 通用异常/全局处理器 │ │ ├── businessexception.java │ │ └── globalexceptionhandler.java │ ├── interceptor/ # 通用拦截器 │ │ └── logininterceptor.java │ ├── util/ # 通用工具类 │ │ ├── dateutil.java │ │ └── httputil.java │ └── config/ # 通用配置(跨域/redis) │ └── redisconfig.java └── demo-business/ # 子模块2:业务核心模块(仅此处有启动类) ├── pom.xml # 依赖demo-common子模块 └── src/ ├── main/ │ ├── java/com/example/demo/ │ │ ├── demoapplication.java # 唯一启动类 │ │ ├── controller/ # 业务控制器 │ │ │ ├── usercontroller.java │ │ │ └── ordercontroller.java │ │ ├── service/ # 业务服务接口 │ │ │ ├── userservice.java │ │ │ └── orderservice.java │ │ ├── service/impl/ # 业务服务实现 │ │ │ ├── userserviceimpl.java │ │ │ └── orderserviceimpl.java │ │ ├── mapper/ # 业务数据访问层 │ │ │ ├── usermapper.java │ │ │ └── ordermapper.java │ │ ├── entity/ # 业务实体 │ │ │ ├── user.java │ │ │ └── order.java │ │ ├── dto/ # 业务dto │ │ │ ├── req/ │ │ │ └── resp/ │ │ └── config/ # 业务专属配置 │ │ └── mybatisconfig.java │ └── resources/ # 业务资源 │ ├── application.yml │ ├── application-dev.yml │ ├── mapper/ │ │ ├── usermapper.xml │ │ └── ordermapper.xml │ └── db/ └── test/ # 业务测试目录 └── java/com/example/demo/ ├── controller/ └── service/
二、核心工程职责说明(保证子工程独立)
表格
工程名称 | 核心职责 | 独立性说明 |
demo-springboot-parent | 仅作为父工程,无任何业务代码,只在 pom.xml 中统一管理所有子工程的依赖版本(如 spring boot、mybatis、lombok 等) | 纯依赖管理,不依赖任何子工程 |
demo-common | 存放所有公共、通用的代码(常量、异常、工具、通用配置),无业务逻辑 | 独立编译、可单独发布,被 demo-business 依赖,不依赖任何业务工程 |
demo-business | 存放核心业务代码(控制器、服务、mapper、实体、dto)+ 唯一启动类 | 依赖 demo-common,是最终可运行的工程,包含所有业务逻辑 |
三、关键配置要点(保证父子工程协同)
1. 父工程 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>
<!-- 父工程坐标 -->
<groupid>com.example</groupid>
<artifactid>demo-springboot-parent</artifactid>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>demo-springboot-parent</name>
<!-- 子工程声明 -->
<modules>
<module>demo-common</module>
<module>demo-business</module>
</modules>
<!-- 统一依赖版本管理 -->
<properties>
<spring.boot.version>3.2.0</spring.boot.version>
<mybatis.version>3.5.15</mybatis.version>
<project.build.sourceencoding>utf-8</project.build.sourceencoding>
</properties>
<!-- 依赖版本锁定 -->
<dependencymanagement>
<dependencies>
<!-- 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>
<!-- 子工程依赖声明 -->
<dependency>
<groupid>com.example</groupid>
<artifactid>demo-common</artifactid>
<version>1.0.0</version>
</dependency>
</dependencies>
</dependencymanagement>
</project>2. demo-common 子工程 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">
<parent>
<groupid>com.example</groupid>
<artifactid>demo-springboot-parent</artifactid>
<version>1.0.0</version>
</parent>
<artifactid>demo-common</artifactid>
<packaging>jar</packaging>
<name>demo-common</name>
<!-- 仅引入通用依赖(无业务依赖) -->
<dependencies>
<!-- spring context(配置/bean) -->
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-context</artifactid>
</dependency>
<!-- redis客户端(通用配置) -->
<dependency>
<groupid>redis.clients</groupid>
<artifactid>jedis</artifactid>
</dependency>
<!-- lombok(工具类简化) -->
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
<optional>true</optional>
</dependency>
</dependencies>
</project>3. demo-business 子工程 pom.xml(依赖 demo-common)
<?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">
<parent>
<groupid>com.example</groupid>
<artifactid>demo-springboot-parent</artifactid>
<version>1.0.0</version>
</parent>
<artifactid>demo-business</artifactid>
<packaging>jar</packaging>
<name>demo-business</name>
<!-- 核心依赖:引入公共模块 -->
<dependencies>
<dependency>
<groupid>com.example</groupid>
<artifactid>demo-common</artifactid>
</dependency>
<!-- spring boot web(控制器) -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<!-- mybatis(数据访问) -->
<dependency>
<groupid>org.mybatis.spring.boot</groupid>
<artifactid>mybatis-spring-boot-starter</artifactid>
<version>${mybatis.version}</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupid>com.mysql</groupid>
<artifactid>mysql-connector-j</artifactid>
<scope>runtime</scope>
</dependency>
</dependencies>
<!-- 启动类配置 -->
<build>
<plugins>
<plugin>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-maven-plugin</artifactid>
<configuration>
<mainclass>com.example.demo.demoapplication</mainclass>
</configuration>
</plugin>
</plugins>
</build>
</project>四、关键注意事项(保证子工程独立 & 可运行)
- 包名规范:demo-common 的包名统一为
com.example.demo.common,demo-business 引用时需导入该包(如import com.example.demo.common.util.dateutil); - 启动类位置:仅 demo-business 有启动类,且放在
com.example.demo根包下,确保能扫描到 demo-common 的 bean(需在启动类加@componentscan(basepackages = "com.example.demo")); - 配置隔离:demo-common 仅放通用配置(如 redis、webmvc),业务专属配置(如 mybatis)放在 demo-business;
- 依赖隔离:demo-common 不引入任何业务依赖(如 mybatis、数据库驱动),仅保留通用依赖,保证独立性。
总结:
- 拆分核心:将常量、异常、工具、通用配置抽离为独立的 demo-common 子工程,业务代码 + 启动类保留在 demo-business;
- 父子关系:父工程仅管理依赖版本,子工程独立(demo-common 可单独复用,demo-business 是唯一可运行工程);
- 协同规则:demo-business 依赖 demo-common,demo-common 不依赖任何业务模块,保证低耦合、高复用。
三、spring cloud 微服务工程
一、微服务整体目录结构(核心:按服务拆分,复用公共模块)
demo-cloud/ # 微服务父工程(管理spring cloud版本)
├── pom.xml # 父pom:统一管理spring cloud/spring boot版本
├── demo-common/ # 公共模块(所有服务复用)
│ ├── pom.xml
│ └── src/main/java/com/example/demo/common/
│ ├── constant/ # 全局常量
│ ├── exception/ # 全局异常
│ ├── util/ # 通用工具
│ ├── dto/ # 通用dto(分页/统一响应体)
│ └── feign/ # feign远程调用接口(供服务间调用)
│ └── userfeignclient.java
├── demo-gateway/ # 网关服务(微服务统一入口)
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/com/example/demo/gateway/
│ │ │ ├── demogatewayapplication.java # 网关启动类
│ │ │ ├── config/ # 网关配置
│ │ │ │ └── gatewayconfig.java
│ │ │ └── filter/ # 网关过滤器(鉴权/限流)
│ │ │ └── authfilter.java
│ │ └── resources/
│ │ ├── application.yml # 网关配置(路由规则/nacos地址)
│ │ └── application-dev.yml
│ └── test/
├── demo-user-service/ # 用户微服务(独立业务)
│ ├── pom.xml # 依赖demo-common
│ └── src/
│ ├── main/
│ │ ├── java/com/example/demo/user/
│ │ │ ├── demouserapplication.java # 用户服务启动类
│ │ │ ├── controller/ # 用户接口
│ │ │ │ └── usercontroller.java
│ │ │ ├── service/ # 用户业务
│ │ │ │ ├── userservice.java
│ │ │ │ └── impl/userserviceimpl.java
│ │ │ ├── mapper/ # 用户数据访问
│ │ │ │ └── usermapper.java
│ │ │ ├── entity/ # 用户实体
│ │ │ │ └── user.java
│ │ │ ├── dto/ # 用户dto
│ │ │ │ ├── req/
│ │ │ │ └── resp/
│ │ │ └── feign/ # 对外暴露的feign接口
│ │ │ └── userfeignapi.java
│ │ └── resources/
│ │ ├── application.yml # 用户服务配置(端口/数据库/nacos)
│ │ ├── application-dev.yml
│ │ └── mapper/
│ │ └── usermapper.xml
│ └── test/
└── demo-order-service/ # 订单微服务(独立业务)
├── pom.xml # 依赖demo-common + 引入user服务feign
└── src/
├── main/
│ ├── java/com/example/demo/order/
│ │ ├── demoorderapplication.java # 订单服务启动类
│ │ ├── controller/ # 订单接口
│ │ │ └── ordercontroller.java
│ │ ├── service/ # 订单业务(调用user feign)
│ │ │ ├── orderservice.java
│ │ │ └── impl/orderserviceimpl.java
│ │ ├── mapper/ # 订单数据访问
│ │ │ └── ordermapper.java
│ │ ├── entity/ # 订单实体
│ │ │ └── order.java
│ │ └── dto/ # 订单dto
│ └── resources/
│ ├── application.yml # 订单服务配置
│ └── application-dev.yml
└── test/2. 微服务启动类示例(用户服务)
package com.example.demo.user;
import org.mybatis.spring.annotation.mapperscan;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.cloud.client.discovery.enablediscoveryclient;
import org.springframework.cloud.openfeign.enablefeignclients;
/**
* 用户微服务启动类
* @enablediscoveryclient:注册到服务注册中心(nacos/eureka)
* @enablefeignclients:开启feign远程调用
* @mapperscan:扫描mapper接口
*/
@springbootapplication
@enablediscoveryclient
@enablefeignclients(basepackages = "com.example.demo.common.feign")
@mapperscan("com.example.demo.user.mapper")
public class demouserapplication {
public static void main(string[] args) {
springapplication.run(demouserapplication.class, args);
}
}二、核心组件职责说明(微服务特有)
组件名称 | 核心职责 | 关键特点 |
demo-common | 所有微服务的通用代码,无业务逻辑 | 独立 jar 包,被网关、用户、订单等所有服务依赖 |
demo-gateway | 微服务入口,负责路由转发、统一鉴权、跨域、限流 | 无业务代码,仅处理网关相关逻辑 |
demo-user-service | 专注用户业务(注册、登录、用户信息管理) | 独立数据库,对外暴露 feign 接口供订单服务调用 |
demo-order-service | 专注订单业务(创建订单、查询订单、调用用户服务查用户信息) | 依赖用户服务 feign,独立数据库 |
demo-ai-service | 专注 ai 业务(对话、向量检索) | 无数据库依赖,仅对接 ai 模型 |
三、单个微服务内部分层(以用户服务为例)
每个微服务内部仍遵循 spring boot 单项目的分层规范,保证自身完整性:
demo-user-service/src/main/java/com/example/demo/user/ ├── demouserapplication.java # 微服务启动类(加@springbootapplication、@enablediscoveryclient) ├── controller/usercontroller.java # 用户接口(仅处理用户相关请求) ├── service/ │ ├── userservice.java # 用户服务接口 │ └── impl/userserviceimpl.java # 用户服务实现 ├── mapper/usermapper.java # 用户mapper(对接user表) ├── entity/user.java # 用户实体(仅映射user表) ├── dto/ │ ├── req/useraddreqdto.java # 用户新增入参 │ └── resp/userinforespdto.java # 用户信息出参 ├── config/mybatisconfig.java # 用户服务专属mybatis配置 └── feign/userfeignclient.java # 对外暴露的feign接口(供订单服务调用)
四、微服务核心配置要点
一、微服务整体目录结构(核心:按服务拆分,复用公共模块)
demo-microservice/ # 微服务父工程(仅管理依赖版本) ├── pom.xml # 父pom:统一管理spring cloud、各依赖版本 ├── demo-common/ # 公共通用模块(所有微服务复用) │ ├── pom.xml │ └── src/main/java/com/example/demo/common/ │ ├── constant/ # 全局常量(如状态码、通用枚举) │ ├── exception/ # 全局异常(业务异常、全局处理器) │ ├── util/ # 通用工具(日期、http、bean拷贝) │ ├── config/ # 通用配置(redis、跨域、feign配置) │ ├── dto/ # 通用dto(分页、统一响应体) │ └── feign/ # feign远程调用接口(给其他服务调用) ├── demo-gateway/ # 网关微服务(统一入口、路由、鉴权) │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/com/example/demo/gateway/ │ │ │ ├── demogatewayapplication.java # 网关启动类 │ │ │ ├── config/ # 网关配置(路由、跨域、过滤器) │ │ │ ├── filter/ # 网关过滤器(token校验、日志) │ │ │ └── handler/ # 网关异常处理 │ │ └── resources/ │ │ ├── application.yml │ │ └── application-dev.yml │ └── test/ ├── demo-user-service/ # 用户微服务(用户相关业务) │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/com/example/demo/user/ │ │ │ ├── demouserapplication.java # 用户服务启动类 │ │ │ ├── controller/ # 用户控制器(仅用户接口) │ │ │ ├── service/ # 用户服务层(接口+实现) │ │ │ ├── mapper/ # 用户数据访问层 │ │ │ ├── entity/ # 用户实体(仅用户相关表) │ │ │ ├── dto/ # 用户dto(入参/出参) │ │ │ ├── config/ # 用户服务专属配置(mybatis、mq) │ │ │ └── feign/ # 对外暴露的feign接口(供其他服务调用) │ │ └── resources/ │ │ ├── application.yml │ │ ├── application-dev.yml │ │ └── mapper/ # 用户mapper.xml │ └── test/ ├── demo-order-service/ # 订单微服务(订单相关业务) │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/com/example/demo/order/ │ │ │ ├── demoorderapplication.java # 订单服务启动类 │ │ │ ├── controller/ # 订单控制器 │ │ │ ├── service/ # 订单服务层(含调用用户服务feign) │ │ │ ├── mapper/ # 订单数据访问层 │ │ │ ├── entity/ # 订单实体 │ │ │ ├── dto/ # 订单dto │ │ │ └── config/ # 订单服务专属配置 │ │ └── resources/ │ │ ├── application.yml │ │ ├── application-dev.yml │ │ └── mapper/ # 订单mapper.xml │ └── test/ ├── demo-ai-service/ # ai微服务(可选,ai相关业务) │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/com/example/demo/ai/ │ │ │ ├── demoaiapplication.java # ai服务启动类 │ │ │ ├── controller/ # ai控制器 │ │ │ ├── service/ # ai服务层 │ │ │ ├── model/ # ai模型相关dto │ │ │ └── config/ # ai配置(openai密钥、模型参数) │ │ └── resources/ │ │ ├── application.yml │ │ ├── application-dev.yml │ │ └── ai_prompt/ # ai提示词模板 │ └── test/ ├── readme.md # 微服务整体说明 └── .gitignore # 全局忽略文件
二、核心组件职责说明(微服务特有)
组件名称 | 核心职责 | 关键特点 |
demo-common | 所有微服务的通用代码,无业务逻辑 | 独立 jar 包,被网关、用户、订单等所有服务依赖 |
demo-gateway | 微服务入口,负责路由转发、统一鉴权、跨域、限流 | 无业务代码,仅处理网关相关逻辑 |
demo-user-service | 专注用户业务(注册、登录、用户信息管理) | 独立数据库,对外暴露 feign 接口供订单服务调用 |
demo-order-service | 专注订单业务(创建订单、查询订单、调用用户服务查用户信息) | 依赖用户服务 feign,独立数据库 |
demo-ai-service | 专注 ai 业务(对话、向量检索) | 无数据库依赖,仅对接 ai 模型 |
三、单个微服务内部分层(以用户服务为例)
微服务整体目录结构(核心:按服务拆分,复用公共模块)
demo-microservice/ # 微服务父工程(仅管理依赖版本) ├── pom.xml # 父pom:统一管理spring cloud、各依赖版本 ├── demo-common/ # 公共通用模块(所有微服务复用) │ ├── pom.xml │ └── src/main/java/com/example/demo/common/ │ ├── constant/ # 全局常量(如状态码、通用枚举) │ ├── exception/ # 全局异常(业务异常、全局处理器) │ ├── util/ # 通用工具(日期、http、bean拷贝) │ ├── config/ # 通用配置(redis、跨域、feign配置) │ ├── dto/ # 通用dto(分页、统一响应体) │ └── feign/ # feign远程调用接口(给其他服务调用) ├── demo-gateway/ # 网关微服务(统一入口、路由、鉴权) │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/com/example/demo/gateway/ │ │ │ ├── demogatewayapplication.java # 网关启动类 │ │ │ ├── config/ # 网关配置(路由、跨域、过滤器) │ │ │ ├── filter/ # 网关过滤器(token校验、日志) │ │ │ └── handler/ # 网关异常处理 │ │ └── resources/ │ │ ├── application.yml │ │ └── application-dev.yml │ └── test/ ├── demo-user-service/ # 用户微服务(用户相关业务) │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/com/example/demo/user/ │ │ │ ├── demouserapplication.java # 用户服务启动类 │ │ │ ├── controller/ # 用户控制器(仅用户接口) │ │ │ ├── service/ # 用户服务层(接口+实现) │ │ │ ├── mapper/ # 用户数据访问层 │ │ │ ├── entity/ # 用户实体(仅用户相关表) │ │ │ ├── dto/ # 用户dto(入参/出参) │ │ │ ├── config/ # 用户服务专属配置(mybatis、mq) │ │ │ └── feign/ # 对外暴露的feign接口(供其他服务调用) │ │ └── resources/ │ │ ├── application.yml │ │ ├── application-dev.yml │ │ └── mapper/ # 用户mapper.xml │ └── test/ ├── demo-order-service/ # 订单微服务(订单相关业务) │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/com/example/demo/order/ │ │ │ ├── demoorderapplication.java # 订单服务启动类 │ │ │ ├── controller/ # 订单控制器 │ │ │ ├── service/ # 订单服务层(含调用用户服务feign) │ │ │ ├── mapper/ # 订单数据访问层 │ │ │ ├── entity/ # 订单实体 │ │ │ ├── dto/ # 订单dto │ │ │ └── config/ # 订单服务专属配置 │ │ └── resources/ │ │ ├── application.yml │ │ ├── application-dev.yml │ │ └── mapper/ # 订单mapper.xml │ └── test/ ├── demo-ai-service/ # ai微服务(可选,ai相关业务) │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/com/example/demo/ai/ │ │ │ ├── demoaiapplication.java # ai服务启动类 │ │ │ ├── controller/ # ai控制器 │ │ │ ├── service/ # ai服务层 │ │ │ ├── model/ # ai模型相关dto │ │ │ └── config/ # ai配置(openai密钥、模型参数) │ │ └── resources/ │ │ ├── application.yml │ │ ├── application-dev.yml │ │ └── ai_prompt/ # ai提示词模板 │ └── test/ ├── readme.md # 微服务整体说明 └── .gitignore # 全局忽略文件
二、核心组件职责说明(微服务特有)
组件名称 | 核心职责 | 关键特点 |
demo-common | 所有微服务的通用代码,无业务逻辑 | 独立 jar 包,被网关、用户、订单等所有服务依赖 |
demo-gateway | 微服务入口,负责路由转发、统一鉴权、跨域、限流 | 无业务代码,仅处理网关相关逻辑 |
demo-user-service | 专注用户业务(注册、登录、用户信息管理) | 独立数据库,对外暴露 feign 接口供订单服务调用 |
demo-order-service | 专注订单业务(创建订单、查询订单、调用用户服务查用户信息) | 依赖用户服务 feign,独立数据库 |
demo-ai-service | 专注 ai 业务(对话、向量检索) | 无数据库依赖,仅对接 ai 模型 |
三、单个微服务内部分层(以用户服务为例)
每个微服务内部仍遵循 spring boot 单项目的分层规范,保证自身完整性:
demo-user-service/src/main/java/com/example/demo/user/ ├── demouserapplication.java # 微服务启动类(加@springbootapplication、@enablediscoveryclient) ├── controller/usercontroller.java # 用户接口(仅处理用户相关请求) ├── service/ │ ├── userservice.java # 用户服务接口 │ └── impl/userserviceimpl.java # 用户服务实现 ├── mapper/usermapper.java # 用户mapper(对接user表) ├── entity/user.java # 用户实体(仅映射user表) ├── dto/ │ ├── req/useraddreqdto.java # 用户新增入参 │ └── resp/userinforespdto.java # 用户信息出参 ├── config/mybatisconfig.java # 用户服务专属mybatis配置 └── feign/userfeignclient.java # 对外暴露的feign接口(供订单服务调用)
1. 父工程 pom.xml(核心:管理 spring cloud 版本)
<?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.example</groupid>
<artifactid>demo-microservice</artifactid>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>demo-microservice</name>
<!-- 子模块声明 -->
<modules>
<module>demo-common</module>
<module>demo-gateway</module>
<module>demo-user-service</module>
<module>demo-order-service</module>
<module>demo-ai-service</module>
</modules>
<!-- 版本管理:spring cloud & spring boot -->
<properties>
<spring.boot.version>3.2.0</spring.boot.version>
<spring.cloud.version>2023.0.0</spring.cloud.version>
<spring.cloud.alibaba.version>2023.0.1.0</spring.cloud.alibaba.version>
</properties>
<dependencymanagement>
<dependencies>
<!-- 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 依赖 -->
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-dependencies</artifactid>
<version>${spring.cloud.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>
<!-- 公共模块依赖 -->
<dependency>
<groupid>com.example</groupid>
<artifactid>demo-common</artifactid>
<version>1.0.0</version>
</dependency>
</dependencies>
</dependencymanagement>
</project>2. 微服务启动类示例(用户服务)
package com.example.demo.user;
import org.mybatis.spring.annotation.mapperscan;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.cloud.client.discovery.enablediscoveryclient;
import org.springframework.cloud.openfeign.enablefeignclients;
/**
* 用户微服务启动类
* @enablediscoveryclient:注册到服务注册中心(nacos/eureka)
* @enablefeignclients:开启feign远程调用
* @mapperscan:扫描mapper接口
*/
@springbootapplication
@enablediscoveryclient
@enablefeignclients(basepackages = "com.example.demo.common.feign")
@mapperscan("com.example.demo.user.mapper")
public class demouserapplication {
public static void main(string[] args) {
springapplication.run(demouserapplication.class, args);
}
}五、微服务目录设计核心原则
- 服务独立:每个微服务是独立的子工程,有自己的启动类、配置、数据库(按需),可独立部署、扩容;
- 复用优先:通用代码(工具、异常、常量)全部放到 demo-common,避免重复编写;
- 边界清晰:每个微服务仅负责自身业务(如用户服务只处理用户,订单服务只处理订单),通过 feign 调用其他服务;
- 分层统一:每个微服务内部仍遵循 “controller→service→mapper→entity” 分层,保持开发规范一致。
总结:
- 整体结构:微服务以父工程为依赖入口,拆分为公共模块、网关、各业务微服务,每个微服务独立且复用公共代码;
- 内部规范:单个微服务内部保留 spring boot 经典分层,保证业务逻辑清晰;
- 核心特点:服务解耦、独立部署、通用代码复用,符合微服务 “高内聚、低耦合” 的设计思想。
四、spring mvc(boot 整合)工程
1. 核心定位
基于 spring boot 整合 spring mvc 框架,严格贴合 mvc(model-view-controller)分层设计,支持前后端一体(返回视图)或前后端分离(返回 json),是 web 开发的基础架构,适配所有 web 项目。
2. 完整目录结构
demo-mvc/ # spring boot + mvc工程 ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/example/demo/ │ │ │ ├── demoapplication.java # 启动类 │ │ │ ├── controller/ # c层(controller):接收请求 │ │ │ │ ├── usercontroller.java # @controller返回视图 / @restcontroller返回json │ │ │ │ └── ordercontroller.java │ │ │ ├── service/ # m层(model):业务逻辑 │ │ │ │ ├── userservice.java │ │ │ │ └── impl/userserviceimpl.java │ │ │ ├── mapper/ # m层(model):数据访问 │ │ │ │ └── usermapper.java │ │ │ ├── entity/ # m层(model):数据模型 │ │ │ │ └── user.java │ │ │ ├── dto/ # m层扩展:传输模型 │ │ │ │ ├── req/ │ │ │ │ └── resp/ │ │ │ └── config/ # mvc配置 │ │ │ └── webmvcconfig.java # 自定义mvc规则(视图解析器/静态资源) │ │ └── resources/ # 资源目录 │ │ ├── application.yml # mvc核心配置(端口/视图解析器) │ │ ├── static/ # 静态资源(css/js/图片) │ │ │ ├── css/ │ │ │ │ └── index.css │ │ │ └── js/ │ │ │ └── index.js │ │ └── templates/ # v层(view):视图模板(thymeleaf) │ │ ├── user/ │ │ │ └── userinfo.html │ │ └── index.html │ └── test/ │ └── java/com/example/demo/ │ └── controller/ │ └── usercontrollertest.java ├── pom.xml # 核心依赖:spring-boot-starter-web(内置spring mvc) ├── readme.md └── .gitignore
mvc 分层与目录的对应关系(核心)
表格
mvc 分层 | 对应目录 / 类 | 核心作用 |
controller(c 层) | controller/ | 接收前端请求,调用 service,返回视图 / json(spring boot 中 @restcontroller 返回 json,@controller 返回视图) |
model(m 层) | entity/ /dto/ /service/ | 数据模型(实体)+ 业务逻辑(service)+ 数据访问(mapper),是 mvc 的核心数据层 |
view(v 层) | resources/templates/ | 前端视图页面(thymeleaf/freemarker),前后端分离项目中此目录可空 |
3. 核心配置(webmvcconfig.java)
package com.example.demo.config;
import org.springframework.context.annotation.configuration;
import org.springframework.web.servlet.config.annotation.resourcehandlerregistry;
import org.springframework.web.servlet.config.annotation.viewresolverregistry;
import org.springframework.web.servlet.config.annotation.webmvcconfigurer;
/**
* spring mvc自定义配置(替代传统xml)
*/
@configuration
public class webmvcconfig implements webmvcconfigurer {
// 配置视图解析器(前后端一体场景)
@override
public void configureviewresolvers(viewresolverregistry registry) {
registry.thymeleaf()
.prefix("classpath:/templates/") // 视图前缀
.suffix(".html"); // 视图后缀
}
// 配置静态资源访问(放行static目录)
@override
public void addresourcehandlers(resourcehandlerregistry registry) {
registry.addresourcehandler("/static/**")
.addresourcelocations("classpath:/static/");
}
}4. 核心特点
- 严格贴合 mvc 分层:c 层 = controller 目录,m 层 = service/mapper/entity,v 层 = templates 目录;
- 核心依赖是
spring-boot-starter-web(内置 spring mvc 核心组件 dispatcherservlet); - 前后端一体场景:controller 用
@controller,返回视图名称(如return "user/userinfo"); - 前后端分离场景:controller 用
@restcontroller,返回 json,可删除 templates 目录; - 通过
webmvcconfig自定义 mvc 规则(视图解析器、静态资源、拦截器),替代传统 xml 配置。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论