# 后端技术术语详解 - 写给前端工程师 > 用前端类比的方式,帮助前端同学理解后端架构和术语 --- ## 一、框架与运行环境 ### Spring Boot **类比**:相当于前端的 Vite + Vue 全家桶的脚手架。 **解释**:Java 后端的"一站式开发框架",帮你把 Web 服务器、数据库连接、配置管理等都自动配置好,开箱即用。就像 Vite 帮你配好了 webpack、热更新、打包一样,Spring Boot 帮后端配好了 Tomcat 服务器、数据库连接池等。 ### WAR 包 / ROOT.war **类比**:相当于前端 `npm run build` 打出来的 `dist` 文件夹。 **解释**:后端代码编译打包后的产物,是一个压缩包(类似 zip)。`ROOT.war` 部署到 Tomcat 服务器上运行,就像你把 `dist` 丢到 Nginx 上一样。 ### Tomcat **类比**:相当于前端的 Nginx。 **解释**:Java Web 应用的运行容器/服务器。前端用 Nginx 托管静态文件,后端用 Tomcat 运行 Java 代码。 ### Maven / pom.xml **类比**:Maven = npm,pom.xml = package.json。 **解释**:Java 的包管理工具。`mvn install` 类似 `npm install`,`mvn clean package` 类似 `npm run build`。pom.xml 里定义了项目依赖(类似 dependencies)和构建配置(类似 scripts)。 ### mvn clean install **类比**:`rm -rf node_modules && npm install && npm run build` **解释**:清除旧的编译产物(clean),重新编译并安装到本地仓库(install),供其他模块引用。 --- ## 二、项目分层架构 后端代码是分层的,**请求从上往下走,响应从下往上回**: ``` 前端请求 ↓ Controller ← 相当于前端的路由 (Router),定义 URL 和接收参数 ↓ Service ← 相当于前端的 Vuex actions / 业务逻辑层 ↓ Mapper ← 相当于前端的 ApiService,负责跟数据库"通信" ↓ MySQL ← 相当于前端的后端 API(但这次是真正的数据存储) ``` ### Controller(控制器) **类比**:Vue Router 的路由定义 + 页面组件的入口方法。 **解释**:定义 API 接口地址(如 `POST /task/pageList`),接收前端传来的参数,调用 Service 处理,返回结果。你在 `api.js` 里写的每个接口地址,后端都有一个 Controller 方法与之对应。 ``` 前端: api.js 里定义 /task/pageList 后端: TaskController.java 里有个方法处理这个请求 ``` ### Service(服务层) **类比**:Vuex 的 actions + 复杂的业务逻辑函数。 **解释**:处理业务逻辑的地方。比如"创建任务"不只是往数据库插一条数据,还要检查权限、分配人员、发通知等,这些逻辑都在 Service 里。 ### Mapper(数据访问层) **类比**:前端的 `ApiService/*.js`,但操作对象是数据库而非 HTTP 接口。 **解释**:负责跟 MySQL 数据库交互,执行增删改查 SQL。每个 Mapper 对应一张数据库表。 ### Entity / Model(实体类) **类比**:TypeScript 的 `interface` 或 `type` 定义。 **解释**:定义数据结构。比如 `TaskInfo` 实体就是定义了任务表有哪些字段(id、name、status...),类似前端定义的: ```typescript // 前端 TypeScript 的写法 interface TaskInfo { id: number; name: string; status: number; } ``` --- ## 三、数据库相关 ### MySQL **类比**:一个超大的、持久化的、结构化的 JSON 数据仓库。 **解释**:关系型数据库,数据按表(Table)存储。一张表就像一个 Excel 表格,有固定的列(字段),每一行是一条数据。跟前端的 localStorage 不同,MySQL 可以存海量数据、支持复杂查询、多人并发访问。 ### 数据源 / DataSource **类比**:前端 axios 实例配置不同的 `baseURL`。 **解释**:本项目有两个数据库(DB1 基础信息、DB2 业务数据),后端配置了两个数据源,不同的 Mapper 连接不同的数据库。就像前端可能有多个 axios 实例,一个请求 `api.example.com`,另一个请求 `auth.example.com`。 ### MyBatis-Plus **类比**:一个帮你自动写 SQL 的工具,类似前端用 Axios 封装了 fetch。 **解释**:Java 的 ORM 框架(对象关系映射)。不用手写 SQL,直接操作 Java 对象就能完成数据库增删改查。比如 `mapper.selectById(1)` 自动生成 `SELECT * FROM task_info WHERE id = 1`。 ### Mapper XML **类比**:复杂的 GraphQL 查询定义文件。 **解释**:当自动生成的 SQL 不够用时(比如多表关联查询),在 XML 文件里手写 SQL 语句。类似前端遇到复杂请求时要手动拼接参数。 ### QueryWrapper **类比**:前端拼接 URL 查询参数的工具函数。 **解释**:用代码构造 SQL 查询条件。比如: ```java // 后端 wrapper.eq("status", 1).like("name", "保洁") // 等同于 SQL: WHERE status = 1 AND name LIKE '%保洁%' // 类比前端 params = { status: 1, name: '保洁' } // 传给后端做筛选 ``` ### IPage(分页) **类比**:前端 `el-pagination` 组件的 `currentPage` 和 `pageSize`。 **解释**:后端分页查询对象,包含页码、每页条数、总数、数据列表。前端传 `pageNum` 和 `pageSize`,后端返回对应页的数据。 ### Druid 连接池 **类比**:浏览器的 HTTP 连接复用(HTTP/2 多路复用)。 **解释**:数据库连接的"缓存池"。创建数据库连接很耗时(类似 TCP 握手),连接池预先创建一批连接放着,用完归还而不是销毁,下次直接取用,提升性能。 ### 事务 / Transaction **类比**:前端表单提交时的"全部成功才提交,否则全部撤销"。 **解释**:保证多个数据库操作要么全部成功,要么全部回滚。比如"创建任务"要同时插入 task_info、task_user、task_scenes 三张表,如果 task_scenes 插入失败,前面两张表的数据也要撤销,保持数据一致。 ### 软删除 / soft_delete **类比**:前端列表中的"隐藏"而非"删除"。 **解释**:删除数据时不是真的从数据库删掉,而是把 `soft_delete` 字段从 0 改为 1。查询时自动过滤 `soft_delete=1` 的记录。好处是数据可恢复。 --- ## 四、Redis 相关 ### Redis **类比**:一个超级强化版的 `sessionStorage`,速度极快,支持多种数据结构,多个服务可以共享。 **解释**:内存数据库,数据存在内存中所以读写极快。本项目用 Redis 做三件事: 1. **缓存** - 避免频繁查数据库(类似前端用变量缓存 API 响应) 2. **消息队列** - 服务之间传递消息(类似前端的 EventBus) 3. **分布式锁** - 防止并发冲突(类似前端的防重复点击) ### Redis DB4 / DB5 **类比**:localStorage 和 sessionStorage 的区别,两个独立的存储空间。 **解释**:Redis 支持 16 个独立数据库(编号 0-15),本项目用了 DB4 和 DB5,存放不同类型的数据,互不干扰。 ### Redis 数据类型 | Redis 类型 | 前端类比 | 说明 | |-----------|---------|------| | **String** | `localStorage.setItem('key', 'value')` | 最简单的键值对,存一个字符串值 | | **List** | JavaScript 数组 `[]`,支持 push/pop | 有序列表,常用作消息队列(先进先出) | | **Set** | JavaScript `new Set()` | 无序集合,元素不重复 | | **Hash** | JavaScript 对象 `{}` | 键值对的集合,类似一个小型的 JSON 对象 | | **ZSet** | 带排序分数的 Set | 有序集合,每个元素有一个分数,按分数排序 | ### Redis 消息队列 **类比**:前端的 EventBus / Vuex 的 dispatch。 **解释**:用 Redis 的 List 当消息队列: - **生产者**用 `LPUSH` 往列表左边塞消息(类似 `eventBus.$emit`) - **消费者**用 `RPOP` 从列表右边取消息(类似 `eventBus.$on`) - 实现了 Web 服务和 Task 服务之间的异步通信 ``` // 类比前端 // Web 服务(生产者) eventBus.$emit('taskPushQueue', { taskId: 123, type: '新任务' }) // Task 服务(消费者,每秒轮询) setInterval(() => { const msg = eventBus.popMessage('taskPushQueue') if (msg) sendPushNotification(msg) }, 1000) ``` ### Redis 分布式锁 **类比**:前端按钮的 `loading` + `disabled` 防重复点击,但是跨服务器生效。 **解释**:用 Redis 的 `SETNX`(Set if Not Exists)命令实现。多个请求同时到达时,只有第一个能设置成功(获得锁),其他的被拒绝。30秒后锁自动过期释放。 ### TTL(Time To Live) **类比**:`setTimeout(() => localStorage.removeItem('key'), 30000)` — 数据过期自动删除。 **解释**:Redis 数据的过期时间。设置 TTL=30秒,30秒后这个 Key 自动消失。用于登录 Token 过期、临时缓存清理等。 ### Dictionary Hash **类比**:前端 Vuex Store 里的全局配置 state。 **解释**:Redis 里存了一个叫 `Dictionary` 的 Hash,里面存各种系统开关和配置项(如 `UserAppointFlag`、`AutoOffWorkTime`),后端需要时直接从 Redis 读取,不用每次查数据库。 --- ## 五、定时任务相关 ### XXL-Job **类比**:一个可视化的 `setInterval` 管理平台。 **解释**:分布式定时任务调度中心。你可以在管理界面上创建定时任务,设置执行时间(比如每天早上8点),它会自动触发后端的方法执行。比前端的 `setInterval` 强大很多:支持 cron 表达式、失败重试、集群分发等。 ### @Scheduled **类比**:写在代码里的 `setInterval`。 **解释**:Spring 框架提供的定时任务注解,直接写在方法上。比如 `@Scheduled(fixedRate = 1000)` 表示每 1 秒执行一次。与 XXL-Job 的区别是:@Scheduled 写死在代码里,XXL-Job 可以在管理界面动态调整。 ### Cron 表达式 **类比**:一种描述"什么时候执行"的规则字符串。 **解释**:格式为 `秒 分 时 日 月 周`。例如: ``` * * * * * ? → 每秒执行(类似 setInterval(fn, 1000)) 0 0 8 * * ? → 每天早上8点执行 0 0 8 ? * MON → 每周一早上8点执行 6 6 6 28 12 ? → 每年12月28日 6:06:06 执行 ``` --- ## 六、消息通信相关 ### MQTT **类比**:WebSocket,但更轻量,专为物联网设备设计。 **解释**:一种消息通信协议,用于手表等 IoT 设备和服务器之间的实时双向通信。跟 WebSocket 类似,建立长连接后可以互相推送消息。区别是 MQTT 有"主题"(Topic)概念,设备订阅特定主题接收消息。 ``` // 类比前端 WebSocket // WebSocket ws.send(JSON.stringify({ type: 'task', data: {...} })) ws.onmessage = (msg) => { ... } // MQTT mqtt.publish('watch_IMEI_123', JSON.stringify({ messageType: 1, ... })) mqtt.subscribe('watch_IMEI_123', (msg) => { ... }) ``` ### MQTT Topic(主题) **类比**:WebSocket 里的消息 `type` 字段 / 前端路由路径。 **解释**:消息的"频道"。设备订阅某个 Topic 后,只会收到发到这个 Topic 的消息。比如手表订阅自己的 IMEI 号作为 Topic,服务器往这个 Topic 发消息,只有这块手表能收到。 ### MQTT QoS(服务质量等级) **类比**:HTTP 请求的重试策略。 **解释**: - QoS 0:发了就不管了(类似 `fetch` 不处理失败) - QoS 1:至少送达一次,可能重复(类似 `fetch` + 自动重试) - QoS 2:恰好送达一次(最可靠但最慢) - 本项目用 QoS 1。 ### MQTT Broker **类比**:WebSocket 服务器 / 消息中转站。 **解释**:MQTT 的中心服务器,所有设备和后端都连接到 Broker,由它负责消息的转发。类似一个邮局,发件人投到邮局,邮局派送给收件人。 ### 个推 / GeTui **类比**:浏览器的 `Notification API` / PWA 推送通知。 **解释**:第三方手机 APP 推送服务。后端调用个推 SDK,个推通过 APNs(苹果)/ FCM(谷歌)/ 各厂商通道把通知推送到用户手机。就像浏览器推送通知,但是走的是手机系统级通道。 --- ## 七、认证与安全 ### Interceptor(拦截器) **类比**:Axios 的请求/响应拦截器。 **解释**:在请求到达 Controller 之前先经过拦截器,做统一处理(如认证检查、日志记录)。跟前端 Axios 拦截器一模一样的概念,只是在后端执行。 ``` // 前端 Axios 拦截器 axios.interceptors.request.use(config => { /* 加 token */ }) // 后端 Interceptor public boolean preHandle(request, response) { /* 验证签名 */ } ``` ### AOP(面向切面编程) **类比**:Vue 的全局混入(mixin)/ 全局前置守卫。 **解释**:在不修改业务代码的情况下,给方法"织入"额外逻辑。比如 `@RepeatSubmit` 注解加在 Controller 方法上,自动加上防重复提交逻辑,不用每个方法手动写。类似前端用装饰器或全局 mixin 给所有组件加统一行为。 ### UUID **类比**:前端 `sessionStorage` 里的 `token`。 **解释**:登录成功后后端生成的唯一标识符(一串随机字符),存在 Redis 中(30天有效期)。前端每次请求都带上 UUID,后端据此识别用户身份。 ### 签名 / Signature **类比**:前端请求的防篡改校验。 **解释**:前端把 UUID + 时间戳 + 手机号通过 MD5 算法生成一个签名字符串,放在请求头里。后端用同样的算法重新计算,对比一致则说明请求没被篡改。类似前端某些支付场景的签名验证。 ### MD5 **类比**:一种"指纹"算法。 **解释**:把任意长度的字符串转换成固定长度(32位)的字符串。同样的输入永远得到同样的输出,但无法从输出反推输入。常用于签名验证、密码存储(但不推荐用于安全场景,因为已被破解)。 --- ## 八、Java 特有概念 ### 注解 / Annotation(@xxx) **类比**:前端的装饰器 `@decorator` / Vue 的指令 `v-xxx`。 **解释**:Java 用 `@` 开头的标记给代码添加元信息。常见的: - `@Controller` → 标记这个类处理 HTTP 请求 - `@PostMapping("/task/pageList")` → 标记这个方法处理 POST /task/pageList - `@Autowired` → 自动注入依赖(类似 Vue 的 `inject`) - `@TableName("task_info")` → 标记这个类对应数据库的 task_info 表 ### Lombok **类比**:TypeScript 的自动生成 getter/setter。 **解释**:Java 的代码简化工具。加个 `@Data` 注解就自动生成 getter、setter、toString 等方法,不用手写。类似 TypeScript 的 `class` 可以直接访问属性。 ### Bean / IoC / 依赖注入 **类比**:Vue 的 `provide/inject` 或 Vuex Store 的全局共享。 **解释**:Spring 框架帮你创建和管理对象(Bean),需要用的时候自动"注入"进来,不用手动 `new`。类似 Vue 的 `inject` 可以直接使用祖先组件 `provide` 的数据。 ```java // 后端:Spring 自动注入 @Autowired private TaskService taskService; // 不用自己 new // 类比前端:Vue inject const taskStore = inject('taskStore') // 不用自己创建 ``` ### profile(环境配置) **类比**:前端的 `.env.develop` / `.env.test` / `.env.production`。 **解释**:后端的环境区分。`application-test.yml` 存测试环境配置,`application-prod.yml` 存生产环境配置。启动时通过 `--spring.profiles.active=test` 指定用哪个配置,跟前端 `npm run dev` 和 `npm run build` 类似。 --- ## 九、日志与监控 ### Log4j **类比**:前端的 `console.log`,但更强大。 **解释**:Java 的日志框架。可以控制日志级别(DEBUG/INFO/WARN/ERROR)、输出位置(控制台/文件)、格式等。相当于 `console.log` 的高级版本,支持自动按日期分割日志文件。 ### Swagger **类比**:自动生成的 API 文档,可以在线调试。 **解释**:后端加注解后自动生成 API 文档网页,能看到所有接口的地址、参数、返回值,还能直接在页面上发请求测试。访问 `/doc.html` 查看。相当于一个自动生成的 Postman。 --- ## 十、部署相关 ### 连接池 vs 直连 **类比**: ```javascript // 直连(每次都新建) async function query() { const conn = await createConnection() // 耗时操作 const result = await conn.query(sql) conn.close() } // 连接池(复用连接) const pool = createPool({ max: 100 }) // 预先创建 async function query() { const conn = pool.getConnection() // 直接取,很快 const result = await conn.query(sql) conn.release() // 归还,不关闭 } ``` ### 多模块依赖 **类比**:npm 的 monorepo(如 lerna / pnpm workspace)。 **解释**:本项目有 3 个子模块: ``` public (公共模块) ← 类似前端的 @shared/utils 包 ↑ ↑ | | web task ← 类似前端的 @app/admin 和 @app/worker ``` 修改 public 后需要先 `mvn install`(发布到本地),web 和 task 才能用到最新代码。类似 monorepo 里改了 shared 包要先 build。 ### Lettuce **类比**:Axios 之于 HTTP,Lettuce 之于 Redis。 **解释**:Java 连接 Redis 的客户端驱动。负责跟 Redis 服务器建立连接、发送命令、接收结果。你不需要关心它,只需要知道后端通过它操作 Redis。 ### Elasticsearch / BBoss **类比**:一个超级强大的全文搜索引擎,类似浏览器的 Ctrl+F 但能搜索海量数据。 **解释**:目前项目中这部分代码被注释掉了(`#`),暂未启用。如果启用,可以实现类似"模糊搜索任务名称"的功能,比数据库的 `LIKE` 查询快得多。