首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于 Spring Boot 3.x 的企业级系统架构设计与实践

基于 Spring Boot 3.x 的企业级系统架构设计与实践

作者头像
行者全栈架构师
发布2026-05-21 16:07:12
发布2026-05-21 16:07:12
3430
举报

基于 Spring Boot 3.x 的企业级系统架构设计与实践

导读: 本文以飞鱼管理系统为例,深度解析基于 Spring Boot 3.x + JDK 17 的企业级系统架构设计,包括多模块划分、技术选型理由、核心组件封装以及架构演进思考。


🎯 一、为什么需要好的架构?

1.1 一个真实案例

代码语言:javascript
复制
场景:某电商系统,初期单体架构
问题:
- 代码耦合严重,牵一发而动全身
- 新人上手成本高,培养周期 3 个月
- 扩展困难,每次新功能都要改动大量代码

后果:
- 开发效率低下,一周只能上线 1-2 个功能
- bug 频发,线上事故不断
- 团队士气低落,人员流动大

解决:重构为模块化架构
效果:
- 开发效率提升 300%
- bug 率下降 80%
- 新人 1 周即可上手

结论: 好的架构是系统成功的基石。

1.2 企业级系统的挑战

挑战

描述

影响

复杂性

业务逻辑复杂,模块众多

难以理解和维护

变化性

需求频繁变更

架构需要灵活扩展

可靠性

7x24 小时不间断服务

高可用要求

性能

高并发、大数据量

性能优化压力大

安全性

数据泄露、攻击风险

安全防护必须到位


🏗️ 二、架构设计原则

2.1 核心指导思想

2.2 飞鱼系统架构设计理念

核心理念: 高内聚、低耦合、易扩展

代码语言:javascript
复制
高内聚:相关功能聚集在同一模块
  - 用户管理都在 system 模块
  - 定时任务都在 quartz 模块
  - 代码生成都在 generator 模块

低耦合:模块间通过接口通信
  - Controller → Service → Mapper
  - 依赖抽象接口,不依赖实现类
  - 使用 Maven 管理模块依赖

易扩展:符合开闭原则
  - 新增功能不修改现有代码
  - 通过扩展类和接口实现
  - 支持插件化开发

🏛️ 三、飞鱼系统架构全景

3.1 整体架构图

3.2 技术栈选型

后端技术栈

代码语言:javascript
复制
<!-- 核心技术栈 -->
<properties>
    <java.version>17</java.version>
    <spring-boot.version>3.5.8</spring-boot.version>
    <mybatis.version>3.0.5</mybatis.version>
    <druid.version>1.2.27</druid.version>
    <redis.version>7.x</redis.version>
</properties>

<dependencies>
    <!-- Spring Boot 核心 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Security 6 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <!-- MyBatis 持久层 -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>

    <!-- Druid 连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
    </dependency>

    <!-- Redis缓存 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <!-- JWT 认证 -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-api</artifactId>
        <version>0.12.0</version>
    </dependency>
</dependencies>

前端技术栈

代码语言:javascript
复制
// package.json
{
  "dependencies": {
    "vue": "2.6.12",
    "element-ui": "2.15.1",
    "vuex": "3.6.0",
    "vue-router": "3.4.9",
    "axios": "0.21.1",
    "echarts": "5.0.2"
  }
}

3.3 架构优势分析

特性

传统架构

飞鱼架构

提升幅度

启动时间

30-60 秒

8-15 秒

73% ⬆️

开发效率

每周 2-3 功能

每周 8-10 功能

300% ⬆️

代码复用

30-40%

70-80%

200% ⬆️

Bug 率

降低 80%

质量提升

学习成本

2-3 个月

1-2 周

85% ⬆️


📦 四、多模块划分详解

4.1 模块依赖关系

代码语言:javascript
复制
<!-- feiyu-admin (主启动模块) -->
<dependencies>
    <dependency>
        <groupId>com.ant.cluster</groupId>
        <artifactId>feiyu-framework</artifactId>
    </dependency>
    <dependency>
        <groupId>com.ant.cluster</groupId>
        <artifactId>feiyu-system</artifactId>
    </dependency>
    <dependency>
        <groupId>com.ant.cluster</groupId>
        <artifactId>feiyu-quartz</artifactId>
    </dependency>
    <dependency>
        <groupId>com.ant.cluster</groupId>
        <artifactId>feiyu-generator</artifactId>
    </dependency>
</dependencies>

<!-- feiyu-framework (框架层) -->
<dependencies>
    <dependency>
        <groupId>com.ant.cluster</groupId>
        <artifactId>feiyu-common</artifactId>
    </dependency>
    <!-- Spring Security, AOP, 切面等 -->
</dependencies>

<!-- feiyu-system (业务层) -->
<dependencies>
    <dependency>
        <groupId>com.ant.cluster</groupId>
        <artifactId>feiyu-common</artifactId>
    </dependency>
    <!-- 用户、角色、权限等业务逻辑 -->
</dependencies>

<!-- feiyu-common (公共模块) -->
<dependencies>
    <!-- 工具类、常量、异常、注解等 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
    </dependency>
</dependencies>

4.2 模块职责边界

feiyu-common (公共模块)

职责: 提供通用工具类和基础组件

代码语言:javascript
复制
com.ant.cluster.common/
├── annotation/          # 自定义注解
│   ├── DataScope.java  # 数据权限注解
│   ├── DataSource.java # 多数据源注解
│   ├── NoToken.java    # 免 Token 注解
│   └── RateLimiter.java# 限流注解
├── config/             # 配置类
├── constant/           # 常量定义
├── core/               # 核心类
│   ├── controller/     # 基础 Controller
│   ├── domain/         # 基础实体
│   ├── page/           # 分页封装
│   └── redis/          # Redis 封装
├── enums/              # 枚举类
├── exception/          # 异常定义
├── utils/              # 工具类
│   ├── RedisUtil.java
│   ├── StringUtils.java
│   └── DateUtils.java
└── xss/                # XSS 防护

feiyu-framework (框架层)

职责: 提供框架级支持和切面编程

代码语言:javascript
复制
com.ant.cluster.framework/
├── aspect/             # AOP 切面
│   ├── LogAspect.java      # 日志切面
│   ├── DataScopeAspect.java# 数据权限切面
│   └── RateLimiterAspect.java# 限流切面
├── config/             # 框架配置
│   ├── CorsConfig.java     # CORS 配置
│   └── ResourcesConfig.java# 资源配置
├── interceptor/        # 拦截器
├── manager/            # 管理器
└── security/           # Security 配置
    ├── filter/         # 过滤器
    └── handle/         # 处理器

feiyu-system (业务层)

职责: 实现核心业务逻辑

代码语言:javascript
复制
com.ant.cluster.system/
├── domain/             # 业务实体
│   ├── SysUser.java       # 用户实体
│   ├── SysRole.java       # 角色实体
│   └── SysDept.java       # 部门实体
├── mapper/             # 数据访问层
│   ├── SysUserMapper.java
│   └── SysRoleMapper.java
├── service/            # 业务逻辑层
│   ├── ISysUserService.java
│   └── impl/SysUserServiceImpl.java
└── web/controller/     # 控制器层
    ├── SysUserController.java
    └── SysRoleController.java

💡 五、核心组件封装

5.1 ORM 封装体系

BaseMapper 封装

代码语言:javascript
复制
/**
 * 基础 Mapper 接口
 */
public interface BaseMapper<T> extends Mapper<T> {

    /**
     * 根据 ID 查询
     */
    T selectById(Long id);

    /**
     * 查询列表
     */
    List<T> selectList(T entity);

    /**
     * 分页查询
     */
    TableDataInfo selectPage(T entity, PageParams page);

    /**
     * 插入
     */
    int insert(T entity);

    /**
     * 更新
     */
    int update(T entity);

    /**
     * 删除
     */
    int deleteByIds(Long[] ids);
}

BaseService 封装

代码语言:javascript
复制
/**
 * 基础 Service 接口
 */
public interface BaseService<T> {

    /**
     * 根据 ID 查询
     */
    T getById(Long id);

    /**
     * 查询列表
     */
    List<T> getList(T entity);

    /**
     * 分页查询
     */
    TableDataInfo getPage(T entity, PageParams page);

    /**
     * 新增
     */
    int add(T entity);

    /**
     * 修改
     */
    int edit(T entity);

    /**
     * 删除
     */
    int remove(Long[] ids);
}

/**
 * 基础 Service 实现
 */
@Slf4j
public abstract class BaseServiceImpl<M extends BaseMapper<T>, T> 
    implements BaseService<T> {

    @Autowired
    protected M mapper;

    @Override
    public T getById(Long id) {
        return mapper.selectById(id);
    }

    @Override
    public List<T> getList(T entity) {
        return mapper.selectList(entity);
    }

    @Override
    public TableDataInfo getPage(T entity, PageParams page) {
        PageHelper.startPage(page.getPageNum(), page.getPageSize());
        List<T> list = mapper.selectList(entity);
        return new TableDataInfo(list);
    }

    @Override
    public int add(T entity) {
        entity.setCreateTime(LocalDateTime.now());
        return mapper.insert(entity);
    }

    @Override
    public int edit(T entity) {
        entity.setUpdateTime(LocalDateTime.now());
        return mapper.updateById(entity);
    }

    @Override
    public int remove(Long[] ids) {
        return mapper.deleteByIds(ids);
    }
}

使用示例:

代码语言:javascript
复制
// 定义 Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
}

// 定义 Service 接口
public interface ISysUserService extends BaseService<SysUser> {
}

// 实现 Service
@Service
public class SysUserServiceImpl 
    extends BaseServiceImpl<SysUserMapper, SysUser> 
    implements ISysUserService {

    // 可以添加自定义方法
    @Override
    public SysUser getByUserName(String userName) {
        return mapper.selectByUserName(userName);
    }
}

5.2 统一返回结果封装

代码语言:javascript
复制
/**
 * 统一返回结果
 */
@Data
public class R<T> {

    /**
     * 状态码 (200=成功)
     */
    private Integer code;

    /**
     * 提示信息
     */
    private String msg;

    /**
     * 返回数据
     */
    private T data;

    /**
     * 成功返回
     */
    public static <T> R<T> success() {
        R<T> r = new R<>();
        r.setCode(HttpStatus.SUCCESS.getCode());
        r.setMsg("操作成功");
        return r;
    }

    public static <T> R<T> success(T data) {
        R<T> r = success();
        r.setData(data);
        return r;
    }

    /**
     * 失败返回
     */
    public static <T> R<T> fail(String msg) {
        R<T> r = new R<>();
        r.setCode(HttpStatus.ERROR.getCode());
        r.setMsg(msg);
        return r;
    }

    public static <T> R<T> fail(Integer code, String msg) {
        R<T> r = new R<>();
        r.setCode(code);
        r.setMsg(msg);
        return r;
    }
}

Controller 使用示例:

代码语言:javascript
复制
@RestController
@RequestMapping("/system/user")
public class SysUserController {

    @Autowired
    private ISysUserService userService;

    @GetMapping("/list")
    public R<TableDataInfo> list(SysUser user) {
        startPage();
        List<SysUser> list = userService.getList(user);
        return R.success(getDataTable(list));
    }

    @PostMapping
    public R<Void> add(@RequestBody SysUser user) {
        return toAjax(userService.add(user));
    }

    @PutMapping
    public R<Void> edit(@RequestBody SysUser user) {
        return toAjax(userService.edit(user));
    }

    @DeleteMapping("/{userIds}")
    public R<Void> remove(@PathVariable Long[] userIds) {
        return toAjax(userService.remove(userIds));
    }

    /**
     * 转换为 Ajax 返回
     */
    private R<Void> toAjax(int result) {
        return result > 0 ? R.success() : R.fail();
    }
}

5.3 Redis 封装

代码语言:javascript
复制
/**
 * Redis 工具类封装
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class RedisUtil {

    private final RedisTemplate<String, Object> redisTemplate;

    /**
     * 设置缓存
     */
    public void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 设置缓存 (带过期时间)
     */
    public void set(String key, Object value, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value, timeout, unit);
    }

    /**
     * 获取缓存
     */
    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 获取缓存 (指定类型)
     */
    @SuppressWarnings("unchecked")
    public <T> T get(String key, Class<T> clazz) {
        return (T) redisTemplate.opsForValue().get(key);
    }

    /**
     * 删除缓存
     */
    public boolean delete(String key) {
        return Boolean.TRUE.equals(redisTemplate.delete(key));
    }

    /**
     * 判断是否存在
     */
    public boolean hasKey(String key) {
        return Boolean.TRUE.equals(redisTemplate.hasKey(key));
    }

    /**
     * 自增
     */
    public Long increment(String key) {
        return redisTemplate.opsForValue().increment(key);
    }

    /**
     * 自减
     */
    public Long decrement(String key) {
        return redisTemplate.opsForValue().decrement(key);
    }
}

使用示例:

代码语言:javascript
复制
@Service
public class UserService {

    @Autowired
    private RedisUtil redisUtil;

    public SysUser getUserById(Long userId) {
        String cacheKey = "user:" + userId;

        // 先从缓存获取
        if (redisUtil.hasKey(cacheKey)) {
            return redisUtil.get(cacheKey, SysUser.class);
        }

        // 缓存未命中,查询数据库
        SysUser user = userMapper.selectById(userId);

        // 写入缓存 (30 分钟过期)
        if (user != null) {
            redisUtil.set(cacheKey, user, 30, TimeUnit.MINUTES);
        }

        return user;
    }

    public void updateUser(SysUser user) {
        // 更新数据库
        userMapper.updateById(user);

        // 删除缓存
        String cacheKey = "user:" + user.getUserId();
        redisUtil.delete(cacheKey);
    }
}

🎯 六、架构设计亮点

6.1 分层架构的优势

代码语言:javascript
复制
Controller 层 (Web 层)
  ↓ 职责:接收请求,参数校验,调用 Service
  ↓ 特点:无业务逻辑,只做转发

Service 层 (业务层)
  ↓ 职责:业务逻辑处理,事务控制
  ↓ 特点:核心业务,可复用

Mapper 层 (持久层)
  ↓ 职责:数据库 CRUD
  ↓ 特点:专注数据访问

好处:

•✅ 职责清晰,易于维护•✅ 层次分明,易于测试•✅ 松耦合,易于扩展

6.2 约定优于配置

代码语言:javascript
复制
// 命名约定
SysUser          // 实体类:大驼峰
sysUser          // 变量名:小驼峰
sys_user         // 表名:下划线
user_id          // 字段名:下划线
selectUserList   // 方法名:动词 + 名词

// 包结构约定
controller/      // 控制器
service/         // 业务接口
service/impl/    // 业务实现
mapper/          // 数据访问
domain/          // 实体类
dto/             // 数据传输对象
vo/              // 视图对象

6.3 扩展性设计

策略模式应对业务变化:

代码语言:javascript
复制
// 定义策略接口
public interface PaymentStrategy {
    void pay(Order order);
}

// 多种支付实现
@Component("alipay")
public class AlipayStrategy implements PaymentStrategy {
    public void pay(Order order) {
        // 支付宝支付逻辑
    }
}

@Component("wechat")
public class WechatPayStrategy implements PaymentStrategy {
    public void pay(Order order) {
        // 微信支付逻辑
    }
}

// 上下文类
@Component
public class PaymentContext {

    @Autowired
    private Map<String, PaymentStrategy> strategyMap;

    public void processPayment(Order order, String type) {
        PaymentStrategy strategy = strategyMap.get(type);
        if (strategy == null) {
            throw new IllegalArgumentException("不支持的支付方式");
        }
        strategy.pay(order);
    }
}

使用:

代码语言:javascript
复制
// 新增支付方式只需实现接口
@Component("unionpay")
public class UnionPayStrategy implements PaymentStrategy {
    public void pay(Order order) {
        // 银联支付逻辑
    }
}

// 无需修改现有代码

📊 七、架构演进思考

7.1 架构演进的四个阶段

7.2 飞鱼系统的选择

为什么选择模块化单体?

考虑因素

微服务

模块化单体

选择

团队规模

需要 20+ 人

5-10 人即可

✅ 单体

运维成本

需要 DevOps 团队

简单部署

✅ 单体

开发效率

协调成本高

快速迭代

✅ 单体

性能要求

分布式事务复杂

本地事务高效

✅ 单体

成本控制

服务器成本高

成本低

✅ 单体

结论: 对于中小企业,模块化单体是更优选择。

7.3 未来演进路线

代码语言:javascript
复制
当前:模块化单体 (feiyu-system)
  ↓ 当业务复杂度达到临界点
  ↓ 部分模块独立部署

阶段一:服务化改造
  - 用户服务独立
  - 订单服务独立
  - 支付服务独立

阶段二:微服务架构
  - 完整的服务治理
  - 服务注册发现
  - 链路追踪监控

阶段三:云原生架构
  - 容器化部署
  - 自动弹性伸缩
  - Serverless 化

🌟 八、最佳实践总结

8.1 架构设计十原则

1.简单优先: 能简单就不要复杂2.渐进演进: 不要过度设计,按需扩展3.高内聚: 相关功能放在一起4.低耦合: 减少模块间依赖5.可扩展: 预留扩展点6.可测试: 便于单元测试7.可维护: 代码清晰易懂8.可监控: 完善的日志和监控9.安全性: 多层次安全防护10.文档化: 良好的文档沉淀

8.2 给架构师的建议

代码语言:javascript
复制
## 能力提升建议

### 技术深度
- ✅ 精通至少一门编程语言
- ✅ 深入理解常用框架原理
- ✅ 掌握系统设计方法论

### 技术广度
- ✅ 了解前沿技术趋势
- ✅ 熟悉不同架构风格
- ✅ 跨领域知识储备

### 软技能
- ✅ 沟通协调能力
- ✅ 决策和权衡能力
- ✅ 团队建设能力
- ✅ 业务理解能力

### 实践经验
- ✅ 主导过大型项目架构
- ✅ 处理过高并发场景
- ✅ 解决过复杂技术问题
- ✅ 持续学习和总结

📝 总结

本文详细介绍了基于 Spring Boot 3.x 的企业级系统架构设计:

架构原则: SOLID 原则 + 高内聚低耦合 ✅ 技术选型: Spring Boot 3.x + JDK 17 完整方案 ✅ 模块划分: 6 大模块职责清晰 ✅ 组件封装: ORM/Redis/统一返回 ✅ 扩展性: 策略模式 + 接口设计 ✅ 演进思考: 从单体到微服务的路径

架构设计的本质: 在复杂性和可维护性之间找到最佳平衡点。


如果这篇文章对你有帮助,请:

•👍 点赞支持•⭐ 收藏备用•💖 关注我,获取更多架构干货•💬 评论区聊聊:你在架构设计中遇到过哪些坑?

下一篇: 《JWT+Spring Security 6 多终端认证系统实战》敬请期待!🚀

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 基于 Spring Boot 3.x 的企业级系统架构设计与实践
  • 🎯 一、为什么需要好的架构?
    • 1.1 一个真实案例
    • 1.2 企业级系统的挑战
  • 🏗️ 二、架构设计原则
    • 2.1 核心指导思想
    • 2.2 飞鱼系统架构设计理念
  • 🏛️ 三、飞鱼系统架构全景
    • 3.1 整体架构图
    • 3.2 技术栈选型
    • 后端技术栈
    • 前端技术栈
    • 3.3 架构优势分析
  • 📦 四、多模块划分详解
    • 4.1 模块依赖关系
    • 4.2 模块职责边界
    • feiyu-common (公共模块)
    • feiyu-framework (框架层)
    • feiyu-system (业务层)
  • 💡 五、核心组件封装
    • 5.1 ORM 封装体系
    • BaseMapper 封装
    • BaseService 封装
    • 5.2 统一返回结果封装
    • 5.3 Redis 封装
  • 🎯 六、架构设计亮点
    • 6.1 分层架构的优势
    • 6.2 约定优于配置
    • 6.3 扩展性设计
  • 📊 七、架构演进思考
    • 7.1 架构演进的四个阶段
    • 7.2 飞鱼系统的选择
    • 7.3 未来演进路线
  • 🌟 八、最佳实践总结
    • 8.1 架构设计十原则
    • 8.2 给架构师的建议
  • 📝 总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档