目录
2. Spring Boot 与 Spring Cloud 区别
3. Spring Boot 源码里的 6 个经典设计模式
4. Spring Boot 为什么启动快?自动配置 & Bean 扫描全流程
5. 如何系统优化 Spring Boot 启动时间(5 阶段 12 个参数)
6. 自定义 Starter 依赖顺序:@AutoConfigureAfter 原理
7. 大对象延迟初始化 4 种实现
8. SpringFactoriesLoader & 扩展点大全
9. JDK 8 vs 7:语法 + JVM + GC 性能 3 维度对比
10. Stream 流水线:一张图看懂「懒执行」
11. G1 从 8 → 17 的 7 次关键迭代
12. ZGC 原理 & 4 个落地痛点
13. 生产 Full GC 排查 5 步 + 调参模板
14. Nacos 注册中心:AP/CP 模式 & 与 ZK 对比
15. Nacos 3.x AI 功能(了解即可)
16. Nacos AP 实现源码级拆解
17. Nacos 本地缓存失效会怎样?
18. Nacos 推拉结合机制
19. 0 停机插件中心实现方案
20. 不规则棋盘摆 k 个棋子:回溯 + 位压缩完整代码
🔟 Stream 懒执行
故事:Stream 像「流水线订单」,只有最后一个工人按下按钮,前面的环节才动。
代码演示:
Stream.of(1,2,3,4)
.peek(i -> System.out.println("A" + i)) // 中间,不会执行
.filter(i -> i % 2 == 0)
.forEach(System.out::println); // 触发底层:
• Spliterator 分段 → ReferencePipeline 链表 → TerminalOp 触发。
• 并行时用 ForkJoinTask 递归拆分。
1️⃣4️⃣ Nacos vs Zookeeper
| 维度 | Nacos | ZK |
|---|---|---|
| CAP | 默认 AP(Distro),可选 CP | 强一致 CP(ZAB) |
| 协议 | HTTP + UDP 长轮询 | TCP 长连接 |
| 控制台 | 自带 UI | 无 |
| 健康检查 | 客户端心跳 | TCP KeepAlive |
| 语言 | 支持多语言 SDK | 官方仅 Java |
1️⃣5️⃣ Nacos 3.x AI 功能
官方预告:
• AI 配置助手(根据应用画像自动推荐配置)
• 智能弹性伸缩策略
目前未 GA,可忽略。
1️⃣6️⃣ Nacos AP 实现源码
Distro 协议:
• 每个节点负责 hash(key) % 节点数 的分片
• 写请求 → 负责节点 → 异步广播 → 其他节点内存队列
• 读可本地返回,最终一致性
源码入口:DistroConsistencyServiceImpl#put → DistroProtocol#sync → UDP 广播。
1️⃣7️⃣ 本地缓存失效场景
客户端 ${user.home}/nacos/naming/ 下有 .datum 文件;服务端挂掉后:
• 首次读本地缓存 → 正常
• 本地缓存也被删 → 第一次请求 404,客户端立即全量拉取 → 1~2 次异常后恢复。
解决:开启 -Dnacos.naming.failover-file 外部磁盘双写。
1️⃣8️⃣ 推拉结合
推:服务端变动 → UDP 推送(轻量)
拉:客户端定时 10s 拉一次兜底
长轮询:配置中心使用 30s hold,减少无效轮询。
1️⃣9️⃣ 0 停机插件中心
技术栈:Spring Boot + Spring Boot Loader
步骤:
- 监听目录
/plugins(WatchService) - 发现新 jar → 创建
URLClassLoader - 读取
META-INF/plugin/spring.factories→ 得到@Configuration类 - 通过
GenericApplicationContext#registerBeanDefinition动态注册 - 销毁时关闭 ClassLoader,再移除 BeanDefinition
注意:解决 ClassCastException → 插件接口由宿主提供,双亲委派反向委托。
2️⃣0️⃣ 不规则棋盘摆 k 个棋子
问题抽象:给定矩阵,1 为可放,0 为障碍,求不同行不同列放 k 个的方案数。
回溯 + 位压缩:
public int solve(int[][] board, int k) {
int n = board.length, m = board[0].length;
return dfs(board, 0, 0, k, 0, 0, n, m);
}
// rowMask/colMask 用位掩码
private int dfs(int[][] g, int pos, int cnt, int k,
int rowMask, int colMask, int n, int m) {
if (cnt == k) return 1;
if (pos == n * m) return 0;
int x = pos / m, y = pos % m;
int ans = 0;
// 不放
ans += dfs(g, pos + 1, cnt, k, rowMask, colMask, n, m);
// 放:当前格子可放且行列均未占用
if (g[x][y] == 1 && ((rowMask >> x) & 1) == 0 && ((colMask >> y) & 1) == 0) {
ans += dfs(g, pos + 1, cnt + 1, k,
rowMask | (1 << x),
colMask | (1 << y),
n, m);
}
return ans;
}复杂度:最坏 O(C(nm, k)),位压缩剪枝后实际可接受。
全部展开完毕,面试时按 STAR 原则讲即可:先讲故事背景→源码/原理→落地结果。祝你收割 Offer!