第 243 章:架构总结与面试
学习目标
- 系统化梳理全部知识
- 应对架构师面试
- 巩固核心概念
- 展示实战能力
一、Java 后端技能图谱
二、面试分类汇总
2.1 Java 基础
| 题目 | 答案要点 |
|---|---|
| HashMap 原理 | 数组+链表+红黑树,JDK8 后链 >8 转树,扩容 2x |
| ConcurrentHashMap 1.7 vs 1.8 | 1.7 段锁,1.8 Node+CAS+synchronized |
| synchronized vs ReentrantLock | synch 自动释放,jvm 优化;ReentrantLock 灵活,可中断 |
| volatile 语义 | 可见性、禁止重排序 |
| ThreadLocal 内存泄漏 | 不 remove 在线复用线程时仍持有 |
| Java IO 模型 | BIO/NIO/AIO,Netty 是 NIO |
| 类加载机制 | 加载-验证-准备-解析-初始化,双亲委派 |
2.2 JVM
| 题目 | 答案要点 |
|---|---|
| 内存分区 | 堆(老/年轻/eden)+方法区+栈+PC+本地栈 |
| GC 算法 | 标记清除 / 复制 / 标记整理 / 分代 |
| GC 收集器 | Serial/Parallel/CMS/G1/ZGC |
| 4 个引用 | 强/软/弱/虚,各自回收时机 |
| GC Root | 栈帧、本地方法栈、类静态、运行时常量 |
| Full GC 触发 | 老年代满 / Perm 满 / System.gc / 担保失败 |
| 类加载双亲委派 | 避免重复加载,核心保护 |
2.3 并发
| 题目 | 答案要点 |
|---|---|
| Java 并发包 | JUC:Lock/Atomic/Concurrent/Executor |
| AQS | 同步状态,CAS 改值 |
| 线程池参数 | core/max/queue/rejected/keepAlive |
| volatile vs synchronized | 1 个 vs 多变量可见 |
| ThreadLocal | 线程隔离,内存泄漏风险 |
| 阻塞队列 | ArrayBQ/LBQ/DLQ/PBQ/SLQ |
| 线程数设置 | CPU 密集:N+1,IO 密集:压测 |
2.4 数据库
| 题目 | 答案要点 |
|---|---|
| 事务 ACID | 原子/一致/隔离/持久 |
| 隔离级别 | RU/RC/RR/Serializable |
| 索引底层 | B+Tree(聚簇、非聚簇、覆盖) |
| 索引失效 | 函数、类型转换、前导 % |
| MVCC | 多版本并发控制 |
| 分库分表 | 垂直按业务、水平按 hash/range |
| 主从复制 | binlog + relay log |
| 慢 SQL | LIMIT、OR、SELECT * |
2.5 Spring / Boot
| 题目 | 答案要点 |
|---|---|
| IoC 原理 | 工厂反射 + 容器 |
| AOP 原理 | JDK Proxy vs CGLIB |
| Bean 生命周期 | 实例化-填充属性-init-使用-销毁 |
| Spring 事务 | AOP,@Transactional 默认 REQUIRED |
| Spring Boot 启动 | spring.factories + 自动装配 |
| Spring 设计 | 模板 + 工厂 + 装饰 |
| RestTemplate 拦截器 | ClientHttpRequestInterceptor |
2.6 MyBatis
| 题目 | 答案要点 |
|---|---|
| 一二级缓存 | 1:SqlSession 内,2:SqlSessionFactory |
| 延迟加载 | association/collection 配置 |
| 防 SQL 注入 | #{} 预编译 |
| 拦截器 | Plugin,改 SQL |
2.7 Redis
| 题目 | 答案要点 |
|---|---|
| 数据类型 | String/Hash/List/Set/ZSet/Stream/GEO/Hyperloglog/Bitmap |
| 持久化 | RDB(快照)+ AOF(命令) |
| Cluster | 16384 槽位,gossip 协议 |
| 缓存三大问题 | 雪崩/穿透/击穿 |
| Redlock | 多 Redis 实例过半 |
| 内存淘汰 | LRU/LFU |
| 大 key | 拆分(Redis-cli --bigkeys) |
2.8 消息队列
| 题目 | 答案要点 |
|---|---|
| Kafka 架构 | broker/topic/partition/consumer group |
| 消费语义 | 至少一次(默认)/ 最多一次 / 正好一次 |
| Kafka 顺序 | 单 partition 有序,多 partition 整体无序 |
| Kafka vs RocketMQ | Kafka 吞吐,RocketMQ 事务消息 |
| RabbitMQ 模式 | fanout/direct/topic/headers |
| DLQ | 死信队列 + 死信交换机 |
| Rebalance | 分区重分配 |
2.9 微服务
| 题目 | 答案要点 |
|---|---|
| 微服务特征 | 9 大特征(Fowler) |
| 服务拆分 | DDD + 业务边界 |
| CAP | CP / AP / CA |
| BASE | 基本可用 / 最终一致 |
| Seata 模式 | AT/TCC/Saga/XA |
| Saga 协调 | 编排 / 编舞 |
| 熔断 | Sentinel / Resilience4j |
| 网关 | Spring Cloud Gateway / Kong |
| 服务发现 | Nacos / Eureka / Consul |
| 配置中心 | Nacos / Apollo / Config |
2.10 架构
| 题目 | 答案要点 |
|---|---|
| DDD | 限界上下文 + 聚合 + 实体 + 值对象 |
| 微服务陷阱 | 分布式事务 / 链路追踪 / 服务依赖 |
| 一致性 | 强一致 vs 最终一致 |
| 高可用 | 主从 + 多活 + 灾备 |
| 监控 | Prometheus + Grafana + ELK + SkyWalking |
| 限流 | 固定窗口 / 滑动 / 令牌桶 / 漏桶 |
| 雪崩 | 熔断 / 隔离 / 超时 / 重试 |
| 安全 | OAuth2 + JWT + RBAC |
2.11 运维
| 题目 | 答案要点 |
|---|---|
| Docker 镜像层 | 只读层叠加,CoW |
| Dockerfile 优化 | 多阶段 + 缓存层 + alpine |
| K8s 核心 | Pod/Deployment/Service/Ingress |
| Sidecar | 与主容器共享网络/卷 |
| HPA | CPU/memory/自定义指标 |
| 网络 | 127.0.0.1/0 / DNS / Service IP |
| 监控 | 指标 + 日志 + 追踪 |
三、场景题
3.1 设计短链服务
要求:
- URL → 短码
- 短码 → 原 URL
- 1 亿条
- 1000 万 QPS
方案:
- 生成:Hash(URL)+ 自增 Seq,长度 6-8 字符
- 存储:MySQL + Redis
- 缓存:热短码全在 Redis
- 跳转:301 永久 / 302 临时(统计)
3.2 设计秒杀系统
详见第 233 章。
3.3 设计朋友圈
- 拉与推结合
- 按时间线读
- 写入广播
- 关注关系存图 DB
3.4 设计分布式 ID
- Snowflake(41 bit 时间 + 10 机器 + 12 序列)
- 美团 Leaf(号段/Snowflake)
- UUID(不推荐)
3.5 IM 系统设计
- 长连接(Netty)
- 消息存储(分表 + 归档)
- 离线推送(WebSocket)
- 消息顺序(单会话有序)
四、面试技巧
4.1 STAR 法
yaml
Situation: 业务背景
Task: 任务目标
Action: 具体方案 + 技术
Result: 数据化结果4.2 系统题回答套路
4.3 技术深度与广度
yaml
深度: 项目用过的技术,详谈到原理
广度: 面试官涉及的其他,知道概念
套路:
- 项目: 1-2 个有亮点的项目
- 技术栈: 项目中用过 + 自己深度研究
- 亮点: 性能优化 / 故障处理 / 复杂业务4.4 反问面试官
yaml
好问题:
- 团队技术栈是什么?
- 当前在做哪些业务?
- 团队对某技术栈的态度?
- 业务发展阶段?
避免:
- 薪资(初面)
- 加班强度
- 八卦问题五、简历与项目
5.1 项目写法
yaml
【项目】电商订单中心
技术栈: Spring Boot / Spring Cloud / Seata / Sentinel / Kafka
- 重构订单状态机:从过程式改为 DDD 聚合,18 个月无重大事故
- 引入 Seata AT 替代手工补偿,代码量减少 40%
- 优化下单链路:Redis 缓存+JVM Cache,P99 从 800ms 降到 200ms
- 设计并实现灰度发布框架,支持权重/cookie/header 灰度5.2 量化指标
yaml
✅ 数据化:
- QPS 提升 5 倍
- P99 降低 75%
- 错误率从 0.5% 降到 0.01%
- 节省人力 X 人日
❌ 模糊:
- 提升了性能
- 优化了体验六、Java 学习路径
6.1 1-3 年(初级 → 中级)
yaml
核心:
- Java 基础扎实
- MySQL/Redis/MQ 熟练
- Spring 全家桶熟练
- 简单业务能做
推荐:
- 《Java 编程思想》
- 《Java 核心技术》
- 《MySQL 必知必会》
- 《Spring 实战》
项目:
- 完整的 CRUD 项目
- 上手过 Bug 处理6.2 3-5 年(中级 → 高级)
yaml
核心:
- 高并发、高可用方案
- 中间件原理
- 性能调优
- 微服务实战
推荐:
- 《深入理解 Java 虚拟机》
- 《Java 并发实战》
- 《数据密集型应用系统设计》
- 《高性能 MySQL》
项目:
- 主导过性能优化
- 经历过生产故障处理6.3 5-8 年(高级 → 架构师)
yaml
核心:
- 业务抽象
- 复杂系统设计
- 团队协作
- 技术决策
推荐:
- 《系统架构设计》
- 《企业应用架构模式》
- 《架构整洁之道》
- 《凤凰架构》
能力:
- 带项目(2-5 人)
- 抽象能力(从业务到模型)
- 跨团队协作6.4 8+(架构师 → 技术专家/Leader)
yaml
核心:
- 战略眼光
- 业务驱动技术
- 团队建设
- 技术影响力
能力:
- 大规模系统设计
- 复杂场景方案
- 培养新人
- 行业洞察七、面试高频问题
7.1 项目难点
yaml
问: 你最有成就感的项目?
答:
- 项目背景 + 复杂度
- 你的核心贡献
- 量化成果
- 学到的
问: 遇到最棘手的问题?
答:
- 问题:具体描述 + 数据
- 排查:思路
- 解决:方案 + 代码
- 反思:学到什么7.2 性能题
yaml
问: 系统慢,你怎么定位?
答:
- 监控看指标(应用/DB)
- GC 日志
- 慢 SQL
- 火焰图
- 全链路 trace7.3 设计题
yaml
问: 设计一个 10 万 QPS 的系统
答:
- 客户端: CDN + 限流 + 缓存
- 网关: 鉴权 + 路由 + 限流
- 服务: 多实例 + 无状态 + 异步
- 数据: 多级缓存 + 读写分离
- 兜底: 降级 + 熔断7.4 软题
yaml
问: 怎么推动技术方案?
- 现状评估 + 痛点
- 方案 + 收益(对比)
- 沟通 + 评审
- 灰度 + 度量
问: 团队协作?
- 避免对抗式沟通
- 数据 + 案例
- 双向反馈八、面试总结
8.1 流程
8.2 各阶段考察
| 阶段 | 重点 |
|---|---|
| 一面 | 基础 + 项目 |
| 二面 | 架构 + 解决能力 |
| 交叉面 | 其他团队考察 |
| CTO 面 | 高度 + 价值观 |
| HR 面 | 稳定性 + 期望 |
8.3 拿 Offer 心态
yaml
1. 真实简历
2. 充足准备
3. 清晰表达
4. 双向评估(你也面试公司)
5. 不卑不亢九、书单
9.1 Java 基础
- 《Java 编程思想》(Thinking in Java)
- 《Java 核心技术》Cay Horstmann
- 《On Java 8》Bruce Eckel
9.2 并发与 JVM
- 《Java 并发实战》(Java Concurrency in Practice)
- 《深入理解 Java 虚拟机》周志明
9.3 Spring
- 《Spring 实战》
- 《Spring 揭秘》
- 《Spring 源码解析》
9.4 数据库
- 《MySQL 必知必会》
- 《高性能 MySQL》
- 《MySQL 实战 45 讲》丁奇
9.5 架构
- 《数据密集型应用系统设计》(DDIA)
- 《大型网站技术架构》李智慧
- 《凤凰架构》周志明
- 《企业应用架构模式》Fowler
- 《系统架构设计》
9.6 中间件
- 《Redis 设计与实现》
- 《Kafka 权威指南》
- 《深入理解 Nginx》
9.7 运维
- 《Docker 实战》
- 《Kubernetes 权威指南》
- 《SRE: Google 运维解密》
十、职业发展路径
十一、本章小结
yaml
✅ 知识系统化
✅ 重点知识熟记
✅ 项目经验量化
✅ 系统设计套路
✅ 软技能锻炼结束
到这里,Java 企业级教程 250 章已结束。祝学习顺利!
下一章:第 244 章:综合项目实战