一、Spring Cloud 是什么
Spring Cloud 是一套基于 Spring Boot 的微服务开发 “全家桶”,帮你快速解决分布式系统里的服务注册、发现、调用、负载均衡、熔断、网关、配置中心等问题。
它不是一个框架,而是一堆组件的集合,让你不用自己造轮子就能搭建微服务。
二、为什么要用 Spring Cloud(解决什么痛点)
单体架构 → 微服务拆分后会遇到:
服务太多,互相怎么找?(注册发现)
调用远程服务怎么写?(服务调用)
一个服务挂了,会不会拖垮整个系统?(熔断降级)
配置分散在每个服务,改配置要重启?(配置中心)
前端要调用十几个服务,太乱?(网关统一入口)
三、Spring Cloud 核心组件(面试必背)
我按 最常用、面试最爱问 的顺序讲:
1. 服务注册与发现:Nacos / Eureka / Consul
作用:微服务的通讯录,服务启动注册,调用时查地址。
Eureka:Netflix 出品,老项目常用,已停更。
Nacos(阿里):现在最火,注册发现 + 配置中心二合一,国内企业首选。
Consul:国外常用,强一致性。
2. 服务调用:OpenFeign(必问)
作用:声明式远程调用,像调用本地方法一样调用远程 HTTP 接口。
3. 负载均衡:Ribbon / Spring Cloud LoadBalancer
作用:客户端负载均衡,同一个服务多个实例时,按策略分发请求。
默认策略:轮询(RoundRobin)
其他:随机、权重、响应时间权重。
4. 熔断降级限流:Sentinel / Hystrix
作用:防止服务雪崩,某服务慢 / 挂了,快速失败或走降级逻辑。
Hystrix:Netflix,经典,已停更。
Sentinel(阿里):现在主流,熔断 + 降级 + 限流 + 流量整形,控制台可视化。
核心概念:
熔断:失败率高 → 直接拒绝请求,避免雪崩。
降级:调用失败 → 返回兜底数据(如 “系统繁忙”)。
限流:控制 QPS,防止被打垮。
5. API 网关:Spring Cloud Gateway(必问)
作用:统一入口,路由转发 + 认证授权 + 限流 + 监控 + 日志。
替代旧的 Zuul(性能差、同步阻塞)。
6. 配置中心:Nacos Config / Spring Cloud Config
作用:集中管理所有服务配置,支持动态刷新,不用重启服务。
7. 分布式事务:Seata
作用:解决跨库、跨服务事务一致性问题(下单扣库存、扣钱要同时成功或失败)。
四、微服务整体工作流程(面试常问)
所有服务启动,注册到 Nacos。
网关 Gateway 统一接收前端请求。
Gateway 根据路径路由到对应服务。
服务 A 要调用服务 B → 通过 OpenFeign 调用。
OpenFeign 从 Nacos 获取服务 B 的地址列表。
通过 LoadBalancer 做负载均衡,选一个实例。
调用时如果服务 B 慢 / 异常 → Sentinel 熔断 / 降级。
所有服务配置统一从 Nacos Config 拉取,动态更新。
1. 什么是 Spring Cloud?和 Spring Boot 的关系?
Spring Cloud 是基于 Spring Boot 的微服务生态,提供服务注册发现、调用、熔断、网关、配置中心等组件。
Spring Boot 是单体快速开发框架,Spring Cloud 依赖 Spring Boot,把它扩展成分布式系统。
2. Eureka 和 Nacos 区别?
Eureka:AP 架构(高可用、弱一致),只做注册发现,已停更。
Nacos:CP+AP 可切换,注册发现 + 配置中心,支持动态配置、权重负载、健康检查,国内首选。
3. 什么是服务雪崩?怎么解决?
服务雪崩:某服务响应慢 / 宕机 → 调用方请求堆积 → 线程耗尽 → 调用方也挂 → 连锁反应整个系统崩。
解决:熔断(Sentinel/Hystrix)、降级、限流、超时控制、舱壁模式。
4. OpenFeign 原理?和 RestTemplate 区别?
OpenFeign 是声明式 HTTP 客户端,通过接口 + 注解自动生成请求代码,底层集成 Ribbon 做负载均衡。
RestTemplate 是手动写 HTTP 请求,代码冗余,没有负载均衡。
5. Spring Cloud Gateway 工作原理?
基于 Spring WebFlux(异步非阻塞),核心是 路由(Route)+ 断言(Predicate)+ 过滤器(Filter)。
请求进来 → 匹配路由 → 经过过滤器链(认证、限流)→ 转发到目标服务 → 响应返回。
6. 熔断、降级、限流区别?
熔断:依赖服务出问题 → 快速失败,避免雪崩。
降级:自己调用失败 → 返回兜底数据(不影响用户)。
限流:限制请求 QPS,保护自己不被打垮。
7. 分布式事务了解吗?Seata 三种模式?
分布式事务:跨库 / 跨服务保证数据一致性。
Seata 模式:
AT(自动):默认,无侵入,基于 undo log。
TCC(手动):Try-Confirm-Cancel,适合复杂业务。
SAGA:长事务,补偿机制。
8. 微服务怎么保证接口幂等?
唯一订单号 / 请求号
数据库唯一索引
状态机控制
Token 防重
分布式锁
服务拆分原则:单一职责、高内聚低耦合、按业务域拆分
配置中心好处:统一管理、动态刷新、环境隔离、权限控制
一、Vue2 和 Vue3 核心区别(面试必问)
1. 底层不同
Vue2:基于 Object.defineProperty 实现响应式
Vue3:基于 Proxy 实现响应式(性能更好、支持数组 / 对象全监听)
2. 写法不同
Vue2:选项式 API(Options API)
data() {}, methods: {}, computed: {}
Vue3
:组合式 API(Composition API),
import { ref, reactive } from 'vue'">import { ref, reactive } from 'vue'
3. 性能
Vue3 更快:diff 算法优化、静态提升、事件缓存
Vue3 体积更小:支持 tree-shaking
Vue3 状态管理:Pinia
现在面试 90% 问 Pinia,因为 Vue 官方推荐替代 Vuex。
Pinia 优点
简洁、无 mutations、支持 TS
体积小、性能好
可以直接修改 state
天然模块化
1. Vue2 和 Vue3 响应式区别?
Vue2 用 Object.defineProperty,无法监听新增 / 删除属性、数组下标修改
Vue3 用 Proxy,支持对象全监听,性能更好
7. Vue3 为什么比 Vue2 快?
Proxy 响应式
静态提升
事件监听缓存
优化 diff 算法
Vue2:选项式 API,Object.defineProperty,状态管理用 Vuex。
Vue3:组合式 API,Proxy,性能更强,状态管理用 Pinia。
一、JVM 是什么?
JVM(Java 虚拟机)是一台虚拟计算机,负责加载 .class 文件、管理内存、执行字节码,并自动回收垃圾。
它让 Java 实现 一次编写,到处运行。
五、垃圾回收机制(GC)
1. 什么是垃圾?
没有任何引用指向的对象。
1. 堆和栈的区别?
栈:线程私有,存储局部变量,速度快,自动释放
堆:线程共享,存储对象,GC 管理,容易 OOM
2. JVM 内存模型有哪些区域?
程序计数器、虚拟机栈、本地方法栈、堆、方法区。
3. 如何判断对象可以回收?
可达性分析算法 + GC Roots。
4. Minor GC / Full GC 区别?
Minor GC:新生代,频繁,速度快
Full GC:整堆回收,速度慢,尽量避免
5. 为什么要分新生代和老年代?
不同对象生命周期不同,分代可以用不同算法,提高 GC 效率。
6. CMS 收集器过程?
初始标记
并发标记
重新标记
并发清除
7. G1 特点?
分区、可预测停顿、兼顾低延迟与高吞吐。
8. OOM 是什么?常见原因?
内存不足。
内存泄漏
堆太小
一次性加载太多数据
死循环创建对象
9. StackOverflowError 原因?
方法调用深度太深(递归死循环)。
10. 强引用、软引用、弱引用区别?
强引用永不回收;
软引用内存不足才回收;
弱引用 GC 必回收。
11. GC Roots 有哪些?
栈引用、静态变量、常量、本地方法引用。
12. JDK8 方法区去哪了?
变成 元空间 Metaspace,使用本地内存。
13. 垃圾回收算法有哪些?
标记清除、复制、标记整理、分代收集。
14. 为什么不使用引用计数?
无法解决 循环引用。
15. Full GC 触发条件?
老年代满
元空间满
System.gc()
Minor GC 后进入老年代失败
一、Node.js 是什么(一句话)
Node.js 是基于 Chrome V8 引擎的 JavaScript 运行时,能让 JS 脱离浏览器在服务器端运行,非阻塞、事件驱动、高性能。
核心特点:
用 JavaScript 写后端
单线程,但靠 异步非阻塞 + 事件循环 实现高并发
适合:I/O 密集型(接口、网关、爬虫、实时通信)
1. Node.js 适用场景?
I/O 密集型:
接口服务
网关 / 代理
聊天室 / 实时通信
爬虫
前端构建工具(webpack/vite)
不适合:CPU 密集(视频编码、加密、大量计算)
2. 单线程如何实现高并发?
靠 异步非阻塞 I/O + 事件循环,不阻塞主线程。
3. 什么是事件循环?
Node 处理异步操作的机制,按顺序执行:同步 → 微任务 → 宏任务。
4. 微任务和宏任务区别?
微任务:Promise、nextTick,优先执行
宏任务:setTimeout、I/O,后执行
1. MySQL 两大存储引擎(InnoDB vs MyISAM)
InnoDB(默认,99% 项目用它)
支持 事务(ACID)
支持 行锁
支持 外键
支持 崩溃恢复
底层结构:B+ 树
MyISAM(老项目)
不支持事务
表锁
查询快
面试一句话:
项目用 InnoDB,因为支持事务、行锁、高并发、安全可靠。
1. 索引是什么
索引是提高查询速度的数据结构,类似书的目录。
MySQL 默认使用 B+ 树。
2. 索引优点
大幅提高 查询速度
降低 CPU 消耗
3. 索引缺点
增删改 变慢
占用 磁盘空间
4. 索引分类
主键索引(PRIMARY KEY)
唯一索引(UNIQUE)
普通索引(INDEX)
复合索引(最左前缀原则)
全文索引(FULLTEXT)
5. 最左前缀原则
复合索引 (a,b,c)
能命中:
a
a,b
a,b,c
不能命中:
b
b,c
c
必须从最左边开始匹配!
6. 哪些情况索引失效?
使用 !=、not in、is not null
对字段 计算 / 函数 / 隐式转换
like "%xxx" 以 % 开头
违反最左前缀
使用 or 但有字段无索引
7. 什么时候不要建索引?
数据量小
频繁修改、查询少
字段区分度低(性别、状态)
1. 事务四大特性 ACID
原子性:要么全成功,要么全失败
一致性:执行前后数据不变
隔离性:事务之间互不干扰
持久性:一旦提交永久生效
2. 事务并发带来的问题
脏读:读到未提交数据
不可重复读:同一事务两次查询结果不一样
幻读:范围查询时出现新数据
3. 四大隔离级别(从低到高)
读未提交(脏读、不可重复读、幻读)
读已提交(解决脏读)
可重复读(MySQL 默认,解决脏读、不可重复读)
串行化(最高,无并发问题)
MySQL 默认:可重复读(RR)
4. 锁机制
行锁:InnoDB,锁一行,高并发
表锁:锁全表,并发低
间隙锁:防止幻读
意向锁:表锁 + 行锁共存
四、数据库设计
1. 三范式(3NF)
1NF:列不可再分
2NF:消除部分依赖,非主键字段完全依赖主键
3NF:消除传递依赖
实际开发:反三范式,允许适当冗余,减少 join。
2. 设计规范
表必须有 主键
字段 NOT NULL,用默认值
禁止使用 外键(业务层控制)
禁止使用 视图、存储过程
单表数据量 500 万 考虑分表
禁止 select *
3. 常用字段设计
主键:bigint 自增 / 雪花算法
状态:tinyint
时间:datetime / timestamp
金额:decimal(10,2)
五、SQL 优化
1. 慢查询优化步骤
用 explain 查看执行计划
看是否走索引
优化索引
优化 SQL 语句
分库分表
3. SQL 优化技巧
避免 select *
避免 like "%xxx"
避免 where 1=1
避免 or
复合索引遵循 最左前缀
大分页用 延迟关联
禁止在索引字段做运算
六、MySQL 性能优化
1. 库表优化
小表驱动大表
单表数据量控制在 500w 内
冷热数据分离
大字段拆分
2. 索引优化
高频查询字段建索引
联合索引把 区分度高 的放前面
控制单表索引数量 5 个以内
3. SQL 优化
禁止使用 join 超过 3 张表
禁止子查询,改用 join
批量插入,禁止循环插入
4. 架构优化
读写分离
分库分表(水平 / 垂直)
加 缓存(Redis)
1. InnoDB vs MyISAM
InnoDB 支持事务、行锁、外键、崩溃恢复;MyISAM 不支持。
2. 索引为什么用 B+ 树?
层级少、查询快
叶子节点有序、范围查询快
适合磁盘 IO
3. 最左前缀原则?
联合索引必须从左到右匹配,否则失效。
4. 事务四大特性?
ACID。
5. MySQL 默认隔离级别?
可重复读。
6. 脏读、不可重复读、幻读?
脏读:未提交数据;
不可重复读:同一事务两次结果不同;
幻读:范围查询出现新数据。
7. 行锁 vs 表锁?
行锁锁一行,高并发;表锁锁全表,并发低。
8. 什么是回表查询?
通过二级索引找到主键,再去主键索引查数据。
9. 如何避免回表?
使用 覆盖索引。
10. 数据库三范式?
列不可再分、消除部分依赖、消除传递依赖。
11. 什么时候不建索引?
数据量小、频繁更新、区分度低。
12. 索引失效场景?
函数运算、like % xxx、or、隐式转换、违反最左。
13. 慢查询怎么优化?
explain 分析 → 建索引 → 改 SQL → 分表。
14. MySQL 优化思路?
库表 → 索引 → SQL → 架构(读写分离、分库分表)。
15. 大表分页怎么优化?
延迟关联、主键过滤。
16. 什么是 MVCC?
多版本并发控制,提高并发,不加锁也能读。
17. 为什么不推荐外键?
影响性能、难以扩展、业务控制更灵活。
18. 什么是读写分离?
主库写,从库读,减轻压力。
19. 分库分表场景?
单表 500w 以上,性能瓶颈。
MySQL 用 InnoDB 引擎,索引基于 B+ 树,遵循最左前缀原则;
事务默认可重复读,通过 MVCC 实现高并发;
优化从索引、SQL、架构三个层面入手,最终实现分库分表 + 读写分离。
一、RabbitMQ 是什么(一句话)
RabbitMQ 是一款基于 AMQP 协议的开源消息队列,用于系统解耦、异步处理、流量削峰、消息通知。
作用:
解耦(订单 → 物流,不用直接调用)
异步(发送短信、邮件,不影响主流程)
削峰(秒杀、高并发,防止压垮服务)
二、核心组件
Producer:消息生产者
Consumer:消息消费者
Queue:队列,存储消息
Exchange:交换机,路由消息
Binding:绑定,交换机 → 队列
Virtual Host:虚拟主机(隔离环境)
Connection / Channel:连接 / 信道
1. 为什么用消息队列?
解耦、异步、削峰。
2. RabbitMQ 交换机类型?
Direct、Topic、Fanout、Headers。
3. 如何保证消息不丢失?
生产者 Confirm、消息持久化、消费者手动 ACK。
4. 如何解决消息重复消费?
幂等性:唯一 ID + Redis/DB 去重。
5. 什么是死信队列?
消息过期 / 拒收 / 队列满 → 进入死信,用于延迟队列。
6. 如何实现延迟队列?
TTL + 死信队列。
7. 消息积压怎么处理?
扩容消费者、优化消费逻辑、批量消费。
8. 手动 ACK 和自动 ACK 区别?
自动:接收即确认,容易丢消息。
手动:处理完才确认,安全,生产必须用。
9. RabbitMQ 如何保证高可用?
镜像队列(集群)。
10. vhost 作用?
环境隔离,权限隔离。
11. 为什么用 Topic 交换机?
灵活路由,支持通配符,业务最常用。
12. 消息怎么持久化?
交换机持久化 + 队列持久化 + 消息持久化。
13. 什么是幂等性?
重复消费不会造成业务问题。
14. RabbitMQ 挂了怎么办?
集群 + 持久化 + 限流 + 降级。
15. RabbitMQ 适用场景?
异步通知、订单流程、日志收集、秒杀削峰、系统解耦。


















