JDK 17 + Spring Boot 3.5.8:企业级开发技术栈全景

JDK 17 + Spring Boot 3.5.8:企业级开发技术栈全景

飞鱼系统技术栈全景解析

💡 摘要: 本文深入剖析飞鱼管理系统的完整技术栈架构,涵盖 Spring Boot 3.5.8、Spring Security 6、MyBatis、Redis 等核心技术选型。通过 RuoYi-Vue、RuoYi-Vue3 和飞鱼系统三个版本的详细对比,揭示技术升级背后的决策逻辑。包含 5 个技术选型误区、3 套性能优化方案 (启动速度提升 73%、内存占用降低 75%),以及企业级架构设计经验。适合 Java 后端开发工程师、系统架构师阅读,助你构建高性能、可扩展的企业级应用。

📊 一、技术架构总览

1.1 整体架构图

后端架构

用户层

前端应用
Vue 2.6 + Element UI

网关层
Nginx 反向代理

应用层
Spring Boot 3.5.8

安全认证
Spring Security 6 + JWT

Controller 层
RESTful API

Service 层
业务逻辑处理

Mapper 层
MyBatis ORM

MySQL 8.2

Redis 7.x
缓存/会话存储

对象存储
本地/S3

监控运维
Actuator + Prometheus

任务调度
Quartz 2.5

1.2 技术栈分层说明

层级技术选型职责描述
表现层Vue 2.6 + Element UI用户界面交互、数据展示
网关层Nginx反向代理、负载均衡、静态资源服务
应用层Spring Boot 3.5.8核心业务逻辑处理
安全层Spring Security 6 + JWT认证授权、权限控制
持久层MyBatis 3.0.5 + PageHelperORM 映射、分页查询
数据层MySQL 8.2 + Redis 7.x关系型数据存储 + 分布式缓存
工具层FastJSON2/Hutool/Apache Commons通用工具类库
监控层Spring Boot Actuator + Oshi系统监控、健康检查

🔧 二、后端技术栈详解

2.1 Spring Boot 3.5.8 - 核心框架

🎯 为什么选择 Spring Boot 3.5.8?

作为 Spring Boot 3.x 系列的最新稳定版本,3.5.8 带来了众多优势:

✅ 全面拥抱 Jakarta EE 9

<!-- 传统 Java EE → Jakarta EE 迁移 --><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version></dependency>

✅ 改进的依赖注入机制

  • 强制使用构造器注入 (推荐方式)
  • 更好的循环依赖检测
  • 支持 Record 类作为 Bean

✅ 原生支持 GraalVM

# 编译为 Native Image mvn -Pnative native:compile # 启动时间:30 秒 → 0.1 秒# 内存占用:512MB → 128MB

✅ 可观测性增强

  • Micrometer Tracing 集成
  • 分布式追踪支持
  • 改进的健康检查端点
📦 核心 Starter 依赖
<properties><spring-boot.version>3.5.8</spring-boot.version></properties><dependencies><!-- Web 基础功能 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 安全认证 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- 数据验证 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><!-- 监控运维 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- AOP 支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency></dependencies>

2.2 Spring Security 6.3+ - 安全基石

🔐 重大变更

Spring Security 6.x 相比 5.x 有颠覆性变化:

❌ 废弃 WebSecurityConfigurerAdapter

// ❌ Spring Security 5.x 写法@Configuration@EnableWebSecuritypublicclassSecurityConfigextendsWebSecurityConfigurerAdapter{@Overrideprotectedvoidconfigure(HttpSecurity http)throwsException{ http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated();}}// ✅ Spring Security 6.x 写法@Configuration@EnableWebSecuritypublicclassSecurityConfig{@BeanpublicSecurityFilterChainfilterChain(HttpSecurity http)throwsException{ http.authorizeHttpRequests(auth -> auth .requestMatchers("/public/**").permitAll().anyRequest().authenticated());return http.build();}}

✅ Lambda DSL 语法

@BeanpublicSecurityFilterChainfilterChain(HttpSecurity http)throwsException{ http .csrf(csrf -> csrf.disable()).sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS)).authorizeHttpRequests(auth -> auth .requestMatchers("/api/login").permitAll().requestMatchers("/api/admin/**").hasRole("ADMIN").anyRequest().authenticated());return http.build();}
🛡️ 飞鱼系统的安全特性
安全功能实现方式说明
认证鉴权JWT Token无状态认证,支持多终端
密码加密BCrypt强哈希算法,自动加盐
权限控制@PreAuthorize方法级别细粒度权限
XSS 防护XssFilter请求参数过滤
CSRF 防护Token 验证防止跨站请求伪造
限流保护RateLimiter防止恶意刷接口

2.3 MyBatis 3.0.5 - 持久层框架

🎯 为什么选择 MyBatis 而不是 JPA?

❌ JPA 的局限性:

// ❌ 复杂查询难以维护@Query("SELECT u FROM User u WHERE u.department.id = :deptId AND u.status = :status "+"AND (u.role = :role1 OR u.role = :role2) "+"ORDER BY u.createTime DESC")List<User>findComplexUsers(@Param("deptId")Long deptId,@Param("status")Integer status,@Param("role1")String role1,@Param("role2")String role2);// ❌ 动态 SQL 困难@Query(value ="SELECT * FROM user "+"WHERE 1=1 "+"#{#username != null ? 'AND username LIKE %' + #username + '%' : ''} "+"#{#email != null ? 'AND email = ' + #email : ''}", nativeQuery =true)List<User>findDynamicUsers(String username,String email);// SQL 注入风险,难以维护

✅ MyBatis 的优势:

<!-- ✅ 复杂查询清晰易读 --><mappernamespace="com.feiyu.user.UserMapper"><selectid="selectComplexUsers"resultMap="UserResult"> SELECT u.*, d.dept_name, r.role_name FROM sys_user u LEFT JOIN sys_dept d ON u.dept_id = d.dept_id LEFT JOIN sys_user_role ur ON u.user_id = ur.user_id LEFT JOIN sys_role r ON ur.role_id = r.role_id <where><iftest="deptId != null"> AND u.dept_id = #{deptId} </if><iftest="status != null"> AND u.status = #{status} </if><iftest="username != null and username != ''"> AND u.username LIKE CONCAT('%', #{username}, '%') </if><iftest="email != null"> AND u.email = #{email} </if></where> ORDER BY u.create_time DESC </select></mapper><!-- ✅ 动态 SQL 安全灵活 --><selectid="selectDynamicUsers"resultMap="UserResult"> SELECT * FROM sys_user <where><iftest="username != null and username != ''"> AND username LIKE CONCAT('%', #{username}, '%') </if><iftest="email != null"> AND email = #{email} </if><iftest="status != null"> AND status = #{status} </if></where></select>

性能对比:

场景JPAMyBatis胜出者
简单 CRUD⭐⭐⭐⭐⭐ 自动生成⭐⭐⭐ 手动编写🏆 JPA
复杂查询⭐⭐ 难以维护⭐⭐⭐⭐⭐ 灵活控制🏆 MyBatis
动态 SQL⭐⭐ 容易注入⭐⭐⭐⭐⭐ 安全可靠🏆 MyBatis
SQL 优化⭐⭐⭐ 黑盒优化⭐⭐⭐⭐⭐ 完全可控🏆 MyBatis
学习成本⭐⭐⭐ 需要理解概念⭐⭐⭐⭐ 简单易学🏆 MyBatis
📦 MyBatis 核心配置
<!-- pom.xml --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.5</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>2.1.1</version></dependency>
# application.ymlmybatis:mapper-locations: classpath*:mapper/**/*Mapper.xmltype-aliases-package: com.ant.cluster.system.domain configuration:map-underscore-to-camel-case:true# 下划线转驼峰cache-enabled:true# 开启二级缓存lazy-loading-enabled:false# 关闭延迟加载
✨ 飞鱼的 ORM封装创新
// ✅ 所有 Mapper 继承 BaseMapperpublicinterfaceSysUserMapperextendsBaseMapper<SysUser,Long>{// 只需定义自定义查询方法SysUserselectByUserName(String userName);}// ✅ 所有 Service 继承 BaseService@ServicepublicclassSysUserServiceextendsBaseServiceImpl<SysUser,Long>implementsISysUserService{// 自动拥有 CRUD 方法// findById(id)// findAll()// save(entity)// deleteById(id)// ...}

2.4 Druid 1.2.27 - 数据库连接池

🎯 为什么选择 Druid?
连接池性能监控扩展性社区活跃度
Druid⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
HikariCP⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
DBCP2⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

Druid 核心优势:

  • ✅ 强大的监控功能 (Web 控制台)
  • ✅ SQL 防火墙 (WallFilter)
  • ✅ 慢 SQL 统计
  • ✅ 连接泄漏检测
  • ✅ 阿里出品,久经考验
📦 Druid 生产环境配置
spring:datasource:type: com.alibaba.druid.pool.DruidDataSource druid:# 初始连接数initial-size:5# 最小空闲连接min-idle:10# 最大活跃连接max-active:50# 获取连接超时时间max-wait:60000# 心跳检测keep-alive:true# 连接超时时间connect-timeout:5000# Socket 超时时间socket-timeout:60000# 监控配置stat-view-servlet:enabled:trueurl-pattern: /druid/* login-username: admin login-password: your_password web-stat-filter:enabled:trueurl-pattern: /* exclusions:"*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"# Filter 配置filter:stat:enabled:truedb-type: mysql log-slow-query:trueslow-query-millis:1000wall:enabled:trueconfig:drop-table-allow:false# 禁止删除表truncate-allow:false# 禁止清空表slf4j:enabled:truestatement-create-after-log-enabled:falsestatement-close-after-log-enabled:falseresult-set-open-after-log-enabled:falseresult-set-close-after-log-enabled:false

2.5 Redis 7.x - 分布式缓存

🎯 Redis 在飞鱼系统中的应用场景
应用场景Key 命名规范数据结构过期策略
用户 Tokenlogin_tokens:{uuid}String2 小时
验证码captcha_codes:{uuid}String5 分钟
用户信息缓存sys:user:{userId}Hash30 分钟
字典数据缓存sys:dict:{dictType}Hash永久
限流计数rate_limit:{api}:{userId}String1 分钟
幂等性 Tokenidempotent:{token}String5 秒
在线用户online_users:{token}Hash实时刷新
📦 RedisUtil 统一封装
// ✅ 飞鱼系统统一使用RedisUtil@AutowiredprivateRedisUtil redisUtil;// String 操作 redisUtil.set("key","value",30,TimeUnit.MINUTES);String value = redisUtil.get("key");// Hash 操作 redisUtil.hset("user:1001","name","张三");Map<String,Object> userInfo = redisUtil.hgetAll("user:1001");// List 操作 redisUtil.lpush("task:queue","task1","task2");List<Object> tasks = redisUtil.lrange("task:queue",0,-1);// 批量操作List<String> keys =Arrays.asList("key1","key2","key3"); redisUtil.delete(keys);

2.6 FastJSON2 2.0.60 - JSON 序列化

🎯 为什么选择 FastJSON2?
JSON 库性能安全性易用性生态
FastJSON2⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Jackson⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Gson⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

FastJSON2 核心优势:

  • ✅ 性能比 FastJSON 1.x 提升 50%+
  • ✅ 修复了已知安全漏洞
  • ✅ 更好的泛型支持
  • ✅ 更小的包体积
📦 FastJSON2 配置
<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.60</version></dependency>
// ✅ 统一 JSON 配置@ConfigurationpublicclassJsonConfig{@BeanpublicHttpMessageConvertersfastJsonHttpMessageConverters(){FastJsonHttpMessageConverter fastConverter =newFastJsonHttpMessageConverter();FastJsonConfig fastJsonConfig =newFastJsonConfig(); fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); fastJsonConfig.setCharset(StandardCharsets.UTF_8);// 配置序列化选项 fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,// 格式化输出SerializerFeature.WriteNullStringAsEmpty,// null 字符串转为""SerializerFeature.WriteNullListAsEmpty,// null 集合转为[]SerializerFeature.WriteDateUseDateFormat,// 使用日期格式SerializerFeature.DisableCircularReferenceDetect// 禁用循环引用检测); fastConverter.setFastJsonConfig(fastJsonConfig);returnnewHttpMessageConverters(fastConverter);}}

🎨 三、前端技术栈深度对比

3.1 技术选型决策过程

在飞鱼系统开发初期,我们面临一个艰难的抉择:

选项 A: 继续使用 Vue 2.6 + Element UI (若依原版) 选项 B: 升级到 Vue 3 + Element Plus (RuoYi-Vue3) 选项 C: 使用 Vue 3 + TypeScript (RuoYi-Vue3-Plus) 

3.2 三大版本全方位对比

📊 核心技术对比表
特性/版本飞鱼系统RuoYi-Vue3RuoYi-Vue3-TypeScript
Vue 版本2.6.123.4+3.4+
脚本语言JavaScript ES6+JavaScript ES6+TypeScript 5+
构建工具Vue CLI 4.4.6Vite 5+Vite 5+
UI 组件库Element UI 2.15Element Plus 2.7+Element Plus 2.7+
状态管理Vuex 3.6Pinia 2.1+Pinia 2.1+
路由管理Vue Router 3.4Vue Router 4.3+Vue Router 4.3+
HTTP 客户端Axios 0.21+Axios 1.xAxios 1.x
🎯 选择 Vue 2.6 的理由

尽管 Vue 3 已经成熟,但我们仍选择 Vue 2.6,基于以下考量:

✅ 技术成熟度

  • Vue 2.6 历经多年打磨,稳定性极高
  • 社区资源丰富,问题容易找到解决方案
  • 团队成员技术储备充足

✅ 生态完善

  • Element UI 组件齐全,文档完善
  • 第三方插件丰富 (图表、编辑器等)
  • 兼容性好,少有 breaking changes

✅ 学习成本低

  • Options API 易于理解
  • 无需学习 Composition API
  • 不需要 TypeScript 基础

⚠️ Vue 3 的挑战

  • Composition API 学习曲线陡峭
  • TypeScript 增加开发复杂度
  • 部分插件生态不完善
  • 迁移成本较高
💡 我们的建议
团队情况推荐方案理由
新手团队Vue 2 + Element UI快速上手,专注业务
有经验团队Vue 3 + Element Plus享受新特性,提升效率
大型企业Vue 3 + TypeScript类型安全,便于维护
个人项目根据兴趣选择开心最重要

3.3 Element UI 核心组件使用

 <template> <div> <!-- 搜索表单 --> <el-form :model="queryParams" :inline="true"> <el-form-item label="用户名" prop="userName"> <el-input v-model="queryParams.userName" placeholder="请输入用户名" clearable @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item> <el-button type="primary" icon="Search" @click="handleQuery"> 搜索 </el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button> </el-form-item> </el-form> <!-- 数据表格 --> <el-table v-loading="loading" :data="userList"> <el-table-column label="用户 ID" prop="userId"/> <el-table-column label="用户名" prop="userName" :show-overflow-tooltip="true"/> <el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true"/> <el-table-column label="状态" prop="status"> <template #default="scope"> <el-switch v-model="scope.row.status" active-value="1" inactive-value="0" @change="handleStatusChange(scope.row)" /> </template> </el-table-column> <el-table-column label="操作"> <template #default="scope"> <el-button type="text" icon="Edit" @click="handleUpdate(scope.row)" >修改 </el-button> <el-button type="text" icon="Delete" @click="handleDelete(scope.row)" >删除 </el-button> </template> </el-table-column> </el-table> <!-- 分页组件 --> <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> </div> </template> <script> import {listUser, updateUser} from '@/api/system/user' export default { name: 'UserManage', data() { return { loading: true, userList: [], total: 0, queryParams: { pageNum: 1, pageSize: 10, userName: undefined } } }, created() { this.getList() }, methods: { async getList() { this.loading = true try { const {data} = await listUser(this.queryParams) this.userList = data.rows this.total = data.total } finally { this.loading = false } }, handleQuery() { this.queryParams.pageNum = 1 this.getList() }, resetQuery() { this.resetForm('queryParams') this.handleQuery() } } } </script> 

🗄️ 四、数据库技术选型

4.1 MySQL 8.2.0 - 关系型数据库

🎯 为什么选择 MySQL 8.x?
版本MySQL 5.7MySQL 8.0+飞鱼选择理由
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐查询性能提升 2 倍
JSON 支持⭐⭐⭐⭐⭐⭐⭐⭐原生 JSON 函数
窗口函数❌ 不支持✅ 支持复杂分析查询
CTE 表达式❌ 不支持✅ 支持递归查询简化
字符集utf8utf8mb4完整 Unicode 支持
📦 MySQL 8 核心特性应用

✅ 窗口函数

-- 查询每个部门工资前三的员工SELECT dept_id, user_name, salary, ROW_NUMBER()OVER(PARTITIONBY dept_id ORDERBY salary DESC)as rn FROM sys_user WHEREstatus='1'HAVING rn <=3;

✅ CTE 递归查询

-- 查询部门树形结构WITH RECURSIVE dept_tree AS(SELECT dept_id, dept_name, parent_id,0aslevelFROM sys_dept WHERE parent_id =0UNIONALLSELECT d.dept_id, d.dept_name, d.parent_id, t.level+1FROM sys_dept d INNERJOIN dept_tree t ON d.parent_id = t.dept_id)SELECT*FROM dept_tree ORDERBYlevel, dept_id;

✅ JSON 字段

-- 存储扩展属性CREATETABLE sys_user_ext ( user_id BIGINTPRIMARYKEY, ext_info JSON,-- 存储扩展信息 create_time DATETIME);-- 插入 JSON 数据INSERTINTO sys_user_ext VALUES(1,'{"skills": ["Java", "Python"], "certificates": ["PMP"]}',NOW());-- 查询 JSON 字段SELECT user_id, JSON_EXTRACT(ext_info,'$.skills[0]')as first_skill FROM sys_user_ext;

4.2 数据库设计规范

📋 命名规范
-- ✅ 推荐命名方式-- 表名:小写字母 + 下划线 sys_user -- 系统用户表 sys_role_menu -- 角色菜单关联表-- 主键:统一使用 id 或 {模块}_id id -- 单表使用 user_id -- 多表关联使用-- 字段:小写字母 + 下划线 user_name -- 用户名 create_time -- 创建时间 update_by -- 更新人-- 索引:idx_{字段名} idx_user_name -- 用户名索引-- 唯一索引:uk_{字段名} uk_user_email -- 邮箱唯一索引
📋 建表规范
CREATETABLE`sys_user`(`user_id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'用户 ID',`dept_id`bigint(20)DEFAULTNULLCOMMENT'部门 ID',`user_name`varchar(30)NOTNULLCOMMENT'用户账号',`nick_name`varchar(30)NOTNULLCOMMENT'用户昵称',`email`varchar(50)DEFAULT''COMMENT'用户邮箱',`phonenumber`varchar(11)DEFAULT''COMMENT'手机号码',`sex`char(1)DEFAULT'0'COMMENT'用户性别 (0 男 1 女 2 未知)',`avatar`varchar(100)DEFAULT''COMMENT'头像路径',`password`varchar(100)DEFAULT''COMMENT'密码',`status`char(1)DEFAULT'0'COMMENT'帐号状态 (0 正常 1 停用)',`del_flag`char(1)DEFAULT'0'COMMENT'删除标志 (0 代表存在 2 代表删除)',`login_ip`varchar(128)DEFAULT''COMMENT'最后登录 IP',`login_date`datetimeDEFAULTNULLCOMMENT'最后登录时间',`create_by`varchar(64)DEFAULT''COMMENT'创建者',`create_time`datetimeDEFAULTNULLCOMMENT'创建时间',`update_by`varchar(64)DEFAULT''COMMENT'更新者',`update_time`datetimeDEFAULTNULLCOMMENT'更新时间',`remark`varchar(500)DEFAULTNULLCOMMENT'备注',PRIMARYKEY(`user_id`),UNIQUEKEY`uk_user_name`(`user_name`),KEY`idx_dept_id`(`dept_id`),KEY`idx_create_time`(`create_time`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COMMENT='系统用户表';

🛠️ 五、工具类库精选

5.1 Hutool 5.8.40 - Java 工具集

🎯 Hutool 核心模块
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.40</version></dependency>

常用工具类:

importcn.hutool.core.util.*;importcn.hutool.http.HttpUtil;importcn.hutool.crypto.SecureUtil;// 字符串工具StrUtil.isBlank(str);StrUtil.format("Hello, {}","World");// 数字工具NumberUtil.isNumber("123");NumberUtil.div(newBigDecimal("100"),newBigDecimal("3"),2);// 日期工具DateUtil.now();DateUtil.parse("2024-01-01");DateUtil.offsetDay(newDate(),7);// 文件工具FileUtil.readUtf8String("test.txt");FileUtil.writeUtf8String("content","test.txt");// HTTP 工具String result =HttpUtil.get("https://api.example.com/data");// 加密工具String md5 =SecureUtil.md5("password");String sha256 =SecureUtil.sha256("password");

5.2 Apache Commons - 经典工具库

<!-- IO 工具 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.21.0</version></dependency><!-- 语言工具 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.18.0</version></dependency><!-- 集合工具 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version></dependency>

5.3 Lombok 1.18.42 - 代码简化神器

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.42</version><scope>provided</scope></dependency>
// ✅ 实体类标准写法@Data@Builder@NoArgsConstructor@AllArgsConstructor@TableName("sys_user")publicclassSysUser{@TableId(type =IdType.AUTO)privateLong userId;privateString userName;privateString email;@JsonIgnoreprivateString password;privateLocalDateTime createTime;}// ✅ Service 注入写法@Service@RequiredArgsConstructor@Slf4jpublicclassUserServiceImplextendsBaseServiceImpl<SysUser,Long>implementsIUserService{privatefinalUserMapper userMapper;@OverridepublicSysUsergetUserById(Long userId){ log.debug("查询用户:{}", userId);return userMapper.selectById(userId);}}

📈 六、监控与运维工具

6.1 Oshi 6.9.1 - 系统信息采集

<dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>6.9.1</version></dependency>
// 获取 CPU 信息SystemInfo si =newSystemInfo();HardwareAbstractionLayer hal = si.getHardware();CentralProcessor processor = hal.getProcessor();long[] prevTicks = processor.getSystemCpuLoadTicks();Thread.sleep(1000);double cpuLoad = processor.getSystemCpuLoadBetweenTicks(prevTicks);// 获取内存信息GlobalMemory memory = hal.getMemory();long available = memory.getAvailable();long total = memory.getTotal();// 获取磁盘信息List<HWDiskStore> diskStores = hal.getDiskStores();for(HWDiskStore store : diskStores){long readBytes = store.getReadBytes();long writeBytes = store.getWriteBytes();}

6.2 Spring Boot Actuator - 应用监控

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
management:endpoints:web:exposure:include: health,info,metrics,prometheus,threaddump endpoint:health:show-details: always metrics:export:prometheus:enabled:true

访问端点:

  • 健康检查:http://localhost:8080/actuator/health
  • 应用信息:http://localhost:8080/actuator/info
  • 指标数据:http://localhost:8080/actuator/metrics
  • Prometheus: http://localhost:8080/actuator/prometheus

🎯 七、技术选型总结

7.1 选型原则

飞鱼系统的技术选型遵循以下原则:

  1. 稳定性优先: 选择经过生产环境验证的技术
  2. 适度超前: 在稳定基础上引入新技术
  3. 生态完善: 选择社区活跃、文档丰富的技术
  4. 团队匹配: 考虑团队技术储备和学习成本
  5. 可扩展性: 预留技术升级空间

7.2 技术债务管理

技术债项当前方案未来规划升级难度
前端框架Vue 2.6Vue 3 + TS⭐⭐⭐⭐ 高
构建工具Vue CLIVite 5⭐⭐⭐ 中
状态管理VuexPinia⭐⭐ 低
后端框架Spring Boot 3.5Spring Boot 4.x⭐⭐ 低

7.3 给读者的建议

如果你正在做技术选型:

学习路线:

☕ Java 基础

🍃 Spring Boot

🔗 MyBatis

🎨 Vue 基础

🚀 项目实战

表格形式

阶段技术栈图标说明
1Java 基础面向对象、集合框架、多线程并发
2Spring Boot🍃自动配置、RESTful API、Starter 机制
3MyBatis🔗ORM 映射、动态 SQL、性能优化
4Vue 基础🎨Composition API、响应式原理、组件通信
5项目实战🚀前后端联调、权限管理、业务模块开发、部署上线

进阶路线图:

飞鱼项目
学习路线

后端技术栈

Java 基础

面向对象

集合框架

多线程并发

Spring Boot

自动配置

RESTful API

Starter 机制

MyBatis

ORM 映射

动态 SQL

性能优化

前端技术栈

Vue3

Composition API

响应式原理

组件通信

TypeScript

类型系统

接口定义

泛型应用

Element Plus

UI 组件库

表单验证

表格分页

数据库

MySQL

索引优化

事务隔离

SQL 调优

Redis

缓存策略

数据结构

持久化

工程化

Maven

依赖管理

多模块构建

Git

版本控制

分支管理

Docker

容器化部署

镜像构建

详细内容规划:

类别子类别知识点详细内容
后端技术栈Java 基础面向对象封装、继承、多态
后端技术栈Java 基础集合框架List、Map、Set
后端技术栈Java 基础多线程并发线程池、锁机制、并发工具
后端技术栈Spring Boot自动配置条件注解、自动装配原理
后端技术栈Spring BootRESTful API接口设计、请求映射
后端技术栈Spring BootStarter 机制自定义 Starter、依赖管理
后端技术栈MyBatisORM 映射实体映射、结果映射
后端技术栈MyBatis动态 SQLif、choose、foreach
后端技术栈MyBatis性能优化缓存、批量操作、分页
前端技术栈Vue3Composition APIsetup、ref、reactive
前端技术栈Vue3响应式原理Proxy、依赖追踪
前端技术栈Vue3组件通信Props、Emits、Provide/Inject
前端技术栈TypeScript类型系统接口、泛型、联合类型
前端技术栈TypeScript接口定义类型声明、类型推断
前端技术栈TypeScript泛型应用泛型约束、泛型工具
前端技术栈Element PlusUI 组件库布局、表单、表格
前端技术栈Element Plus表单验证规则验证、自定义验证器
前端技术栈Element Plus表格分页分页器、表格排序
数据库MySQL索引优化B+ 树、覆盖索引、最左前缀
数据库MySQL事务隔离ACID、隔离级别、MVCC
数据库MySQLSQL 调优Explain 分析、慢查询优化
数据库Redis缓存策略多级缓存、缓存穿透/雪崩/击穿
数据库Redis数据结构String、Hash、List、Set、ZSet
数据库Redis持久化RDB、AOF、混合持久化
工程化Maven依赖管理版本控制、冲突解决
工程化Maven多模块构建模块划分、聚合继承
工程化Git版本控制提交、分支、合并
工程化Git分支管理Git Flow、Code Review
工程化Docker容器化部署镜像构建、容器编排
工程化Docker镜像构建Dockerfile、多阶段构建

避坑指南:

  • 不要盲目追求最新技术
  • 充分评估团队能力
  • 预留技术升级空间
  • 重视文档和生态

最佳实践:

  • 建立统一的技术规范
  • 定期进行技术分享
  • 鼓励技术创新试错
  • 平衡稳定性和先进性

⚠️ 避坑指南:5 个技术选型常见误区

⚠️ 误区 1: 盲目追求最新技术

现象:

<!-- ❌ 盲目使用最新未稳定版本 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>3.6.0-SNAPSHOT</version><!-- 快照版本风险高 --></dependency> // ❌ 前端使用未经验证的库 import { experimental_feature } from 'vue-experimental'; 

原因:

  • 新版本可能存在未发现的 Bug
  • 生态系统可能不兼容
  • 社区支持不足,问题难解决
  • 生产环境稳定性无法保证

解决方案:

<!-- ✅ 选择稳定版本 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>3.5.8</version><!-- 最新稳定版 --></dependency> // ✅ 使用成熟技术栈 import { ref, reactive } from 'vue'; // Vue 3 稳定 API 

选型原则:

  • ✅ 生产环境:选择最新稳定版本(LTS 优先)
  • ✅ 学习项目:可以尝试新技术
  • ✅ 关注官方推荐和最佳实践

⚠️ 误区 2: 忽视 Jakarta EE 包名迁移

现象:

// ❌ 编译错误:找不到 javax 包importjavax.servlet.http.HttpServletRequest;importjavax.persistence.Entity;importjavax.validation.constraints.NotNull;// 报错:// package javax.servlet does not exist// package javax.persistence does not exist

原因:

  • Spring Boot 3.x 全面迁移到 Jakarta EE 9
  • 包名从 javax.* 改为jakarta.*
  • 旧依赖不兼容新框架

解决方案:

// ✅ 使用 Jakarta 包名importjakarta.servlet.http.HttpServletRequest;importjakarta.persistence.Entity;importjakarta.validation.constraints.NotNull;// ✅ 更新 Maven 依赖<dependency><groupId>jakarta.platform</groupId><artifactId>jakarta.jakartaee-api</artifactId><version>9.1.0</version></dependency>

影响范围:

  • ✅ Servlet API: javax.servletjakarta.servlet
  • ✅ JPA: javax.persistencejakarta.persistence
  • ✅ Validation: javax.validationjakarta.validation

⚠️ 误区 3: 前端技术栈选择不当

现象:

// ❌ Vue 2 项目强行使用 Vue 3 语法const{ref, reactive}= Vue;// Vue 2 不支持// ❌ 在大型项目中使用实验性技术import{experimental_newReactivity}from'vue';

原因:

  • Vue 2 和 Vue 3 API 不兼容
  • Composition API 和 Options API 混用导致混乱
  • 团队技术栈不统一增加维护成本

解决方案:

方案 A: 坚持 Vue 2 (保守选择)

// ✅ Vue 2.6 + Options APIexportdefault{data(){return{count:0}},methods:{increment(){this.count++;}}}

方案 B: 升级到 Vue 3 (推荐)

// ✅ Vue 3.4 + Composition API<script setup>import{ref}from'vue';const count =ref(0);constincrement=()=> count.value++;</script>

选型建议:

场景推荐方案理由
新项目Vue 3.4 + TS技术先进,生态完善
老项目维护Vue 2.6稳定可靠,迁移成本低
大型重构Vue 3.4 + TS长期受益,TypeScript 增强类型安全

⚠️ 误区 4: 数据库版本选择不当

现象:

-- ❌ 使用过旧的 MySQL 5.6SELECT*FROM users;-- 不支持窗口函数-- ❌ 使用不稳定的 MySQL 8.0 早期版本-- 8.0.11-8.0.16 存在已知 Bug

原因:

  • MySQL 5.x 不支持现代特性 (窗口函数、CTE)
  • MySQL 8.0 早期版本稳定性差
  • 版本不匹配导致驱动兼容性问题

解决方案:

-- ✅ 推荐 MySQL 8.2+SELECT user_id, ROW_NUMBER()OVER(ORDERBY create_time)as row_num FROM users;-- ✅ 使用 CTE 优化查询WITH RECURSIVE cte AS(SELECT id, parent_id FROM dept WHERE id =1UNIONALLSELECT d.id, d.parent_id FROM dept d INNERJOIN cte ON d.parent_id = cte.id)SELECT*FROM cte;

版本推荐:

  • MySQL 8.2+: 性能最优,特性最全
  • MySQL 8.0.28+: 稳定版本,广泛使用
  • MySQL 5.7: 已停止维护
  • MySQL 8.0.11-16: 存在已知 Bug

⚠️ 误区 5: 缓存使用不当

现象:

// ❌ 缓存穿透:查询不存在的数据publicUsergetUser(Long id){return redisTemplate.opsForValue().get("user:"+ id);// 数据库也没有,每次查询都穿透到 DB}// ❌ 缓存雪崩:大量 key 同时过期@Cacheable(value ="users", ttl =3600);// 所有缓存 1 小时后同时失效// ❌ 缓存击穿:热点 key 过期瞬间大量请求@Cacheable(value ="hot_product", ttl =1800);

原因:

  • 缓存设计不合理导致数据库压力大
  • 没有考虑异常情况处理
  • 缺少缓存更新策略

解决方案:

// ✅ 缓存穿透:布隆过滤器 + 缓存空对象publicUsergetUser(Long id){// 1. 布隆过滤器检查if(!bloomFilter.mightContain(id)){returnnull;// 肯定不存在}// 2. 查询缓存User user = redisTemplate.opsForValue().get("user:"+ id);if(user !=null){return user;}// 3. 查询数据库 user = userMapper.selectById(id);if(user ==null){// 缓存空对象,防止穿透 redisTemplate.opsForValue().set("user:"+ id,null,300,TimeUnit.SECONDS);returnnull;}// 4. 写入缓存 redisTemplate.opsForValue().set("user:"+ id, user,3600+newRandom().nextInt(300),// 随机 TTL 防雪崩TimeUnit.SECONDS);return user;}// ✅ 缓存雪崩:随机 TTL@Cacheable(value ="users", ttl =3600+newRandom().nextInt(300));// 1-1.5 小时随机// ✅ 缓存击穿:互斥锁 + 永不过期publicUsergetHotProduct(Long id){String key ="hot_product:"+ id;User user = redisTemplate.opsForValue().get(key);if(user !=null){return user;}// 获取分布式锁RLock lock = redissonClient.getLock("lock:"+ key);if(lock.tryLock()){try{// 双重检查 user = redisTemplate.opsForValue().get(key);if(user !=null){return user;}// 查询数据库 user = userMapper.selectById(id); redisTemplate.opsForValue().set(key, user);return user;}finally{ lock.unlock();}}else{// 等待重试Thread.sleep(100);returngetHotProduct(id);}}

📊 性能优化建议

6.1 启动优化

优化前:

# ❌ 默认配置,启动慢spring:main:lazy-initialization:false# 立即初始化所有 Bean

优化后:

# ✅ 延迟初始化配置spring:main:lazy-initialization:true# 延迟初始化,启动速度提升 40%# JVM 参数优化-Xms512m -Xmx1024m # 堆内存配置-XX:+UseG1GC # G1 垃圾回收器-XX:MaxGCPauseMillis=100 # 最大 GC 停顿时间-XX:+ParallelRefProcEnabled # 并行引用处理

性能对比:

指标优化前优化后提升幅度
启动时间30 秒8 秒-73%
初始内存512MB128MB-75%
首次请求2 秒0.5 秒-75%

6.2 连接池优化

优化前:

# ❌ 默认配置,并发能力弱spring:datasource:hikari:maximum-pool-size:10# 默认值太小minimum-idle:10

优化后:

# ✅ 企业级配置spring:datasource:hikari:maximum-pool-size:50# 最大连接数 (根据并发调整)minimum-idle:20# 最小空闲连接connection-timeout:30000# 连接超时 (30 秒)idle-timeout:600000# 空闲超时 (10 分钟)max-lifetime:1800000# 最大生命周期 (30 分钟)leak-detection-threshold:60000# 泄漏检测 (60 秒)

性能对比:

指标优化前优化后提升幅度
并发连接数1050+400%
响应时间500ms300ms-40%
吞吐量100 QPS300 QPS+200%

6.3 缓存优化

优化前:

// ❌ 简单缓存,无优化@Cacheable("users")publicUsergetUser(Long id){return userMapper.selectById(id);}

优化后:

// ✅ 多级缓存 + 本地缓存@Cacheable(value ="users", unless ="#result == null",// 不缓存空值 key ="#root.methodName + ':' + #id")publicUsergetUser(Long id){// 先查本地缓存 (Caffeine)User user = localCache.get(id);if(user !=null){return user;}// 再查 Redis user = redisTemplate.opsForValue().get("user:"+ id);if(user !=null){ localCache.put(id, user);// 回写本地缓存return user;}// 最后查数据库 user = userMapper.selectById(id);if(user !=null){ redisTemplate.opsForValue().set("user:"+ id, user,3600); localCache.put(id, user);}return user;}

性能对比:

指标优化前优化后提升幅度
热点数据查询50ms0.5ms+10000%
数据库压力100%20%-80%
平均响应时间100ms20ms-80%

📝 总结

本文系统介绍了飞鱼管理系统的完整技术栈架构,包括5 个技术选型常见误区3 套性能优化方案关键收获:

  1. 技术选型要平衡稳定与创新: Spring Boot 3.5.8 + JDK 17 是生产环境的最佳选择
  2. 避免常见误区: 不盲目追新、重视 Jakarta EE 迁移、合理选择前后端技术栈
  3. 性能优化至关重要: 启动优化提升 73%、连接池优化提升 200% 并发能力、缓存优化降低 80% 数据库压力

技术选型建议:

  • 生产环境: 选择最新稳定版本 (LTS 优先)
  • 学习项目: 可尝试新技术但要注意风险
  • 团队协作: 统一技术栈,降低维护成本
  • 长期发展: 预留升级空间,管理技术债务

下一篇文章,我们将手把手教你搭建飞鱼开发环境,包含详细的安装步骤和避坑指南,敬请期待!


👍 如果本文对你有帮助,欢迎点赞、收藏、转发!
💬 有任何问题或建议,请在评论区留言交流~
🔔 关注我,获取飞鱼系统 Spring Boot 3.x 系列文章!
📝 行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激!!

专栏导航:

如果觉得本文有帮助,欢迎点赞👍收藏⭐关注💖!

Read more

Windows系统下读写Mac OS磁盘驱动的完整解决方案

本文还有配套的精品资源,点击获取 简介:由于文件系统不兼容,Windows无法直接读写采用HFS+或APFS格式的Mac OS磁盘。本文详细介绍在Windows环境下实现对Mac磁盘读写的技术方案,涵盖主流工具如Paragon HFS+、Tuxera NTFS、Mounty等,并探讨通过虚拟机和第三方文件管理器实现跨平台数据访问的方法。文章旨在为需要在双平台间交换数据的用户提供安全、高效的实践指导,确保数据完整性与操作便捷性。 Mac与Windows跨平台磁盘访问技术全解析 你有没有遇到过这样的尴尬?朋友递来一块外置硬盘,说是“里面都是照片”,可你插上电脑后系统却弹出:“需要格式化才能使用”——救命,这可是人家的结婚照啊!🤯 或者你在公司里接手一个项目,前任同事用的是Mac,留下的资料盘在你的Windows主机上直接“失踪”。这些日常场景背后,其实隐藏着现代计算世界最基础、也最容易被忽视的技术鸿沟: 文件系统的不兼容性 。 别小看这个“读不了盘”的问题。它不仅仅是两个操作系统之间的摩擦,更是底层设计哲学的碰撞。Mac和Windows各自构建了一套完整而封闭的数据管理体系,它

By Ne0inhk
KaiwuDB社区版 3.1.0 在 Ubuntu 22.04 部署实战:TLS 配置、踩坑复盘与轻量压测

KaiwuDB社区版 3.1.0 在 Ubuntu 22.04 部署实战:TLS 配置、踩坑复盘与轻量压测

KWDB 作为一款易用性不断优化的数据库产品,其 3.1.0 版本在运维脚本、配置管理等方面的升级为部署带来了便利,但新手在单机部署过程中仍易因环境适配、依赖缺失、配置不当等问题踩坑。为帮助开发者快速落地 KWDB 单机环境,本文以 Ubuntu 22.04 为基础环境,从实战角度出发,完整拆解 KWDB 3.1.0 单机部署的全流程:不仅明确版本选型依据和部署目标,还细化了环境核查、安装包获取、依赖配置、部署脚本执行等关键操作,针对性解决部署中的高频问题,并通过服务验证、性能基线测试完成最小化验收,最终实现 “安装即能用、问题有解法、效果可验证” 的部署目标,为 KWDB 入门者提供清晰、可复现的实操指引。 文章目录 * 1. 版本与部署路线怎么选 * 2. 目标:这篇文章读完,能带走哪些“

By Ne0inhk
Linux 动态链接与动态库加载深度解析

Linux 动态链接与动态库加载深度解析

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 进程如何感知并加载动态库 * 1.1 进程对动态库的 “可见性” * 1.2 多进程共享动态库的实现 * 二. 动态链接的核心工作原理 * 2.1 程序运行前的动态链接准备 * 2.2 动态库的地址无关性:PIC 编译 * 2.3 运行时的地址重定位:从符号到实际地址 * 三. GOT/PLT:动态链接的核心实现机制 * 3.1 全局偏移量表(GOT) * 3.2 过程链接表(PLT):延迟绑定优化 * 3.

By Ne0inhk