题库
模块 1:网络
OSI七层模型
物理层(比特流传输,网线、光纤、网卡)
题目 1(基础):
物理层的主要功能是什么?常见设备有哪些?
答案:
- 功能:在物理媒介上传输比特流(0/1),实现数据的原始传输,不关心数据含义。
- 设备:网线(铜缆)、光纤、网卡、集线器、收发器。
题目 2(场景题):
公司内网出现频繁掉线,怀疑是物理层问题,你会如何排查?
答案:
- 检查网线是否损坏或接触不良;
- 使用网线测试仪或更换线缆;
- 检查光纤接口是否有污染或折损;
- 查看网卡指示灯或更换网卡;
- 检查集线器/交换机端口状态。
题目 3(考点延伸):
物理层和数据链路层的主要区别是什么?
答案:
- 物理层:负责比特流传输,只关注信号,不处理数据含义;
- 数据链路层:负责成帧、MAC 地址寻址、差错检测,保证帧正确到达邻居节点。
数据链路层(成帧、MAC 地址、交换机、以太网协议)
题目 1(基础):
交换机是如何通过 MAC 地址转发数据的?
答案:
- 交换机维护 MAC 地址表,将端口和 MAC 地址对应;
- 帧到达交换机时查表决定转发端口,若未知则广播。
题目 2(场景题):
内网出现广播风暴,网络拥堵,原因可能是什么?如何解决?
答案:
- 原因:交换机环路、MAC 表不完整导致频繁广播。
- 解决方案:启用 STP(生成树协议)、检查拓扑避免环路、划分 VLAN 减少广播域。
题目 3(考点延伸):
以太网帧结构包含哪些字段?
答案:
- 前导码+帧头(同步);
- 目的 MAC(6B)、源 MAC(6B);
- 类型/长度(2B);
- 数据(46~1500B);
- CRC(4B)用于错误检测。
网络层(IP 地址、子网、路由、ICMP、ARP)
题目 1(基础):
网络层的主要功能是什么?
答案:
- 功能:为数据包选择路径和传输,进行逻辑地址寻址;
- 主要协议:IP、ICMP、ARP;
- 设备:路由器。
题目 2(场景题):
用户无法访问某服务器,ping 不通,如何排查网络层问题?
答案:
- 检查本机 IP、子网掩码、默认网关;
- 使用 ping 测试本机、网关、目标 IP;
- 使用 traceroute 查看路由是否异常;
- 检查防火墙和路由策略。
题目 3(考点延伸):
ARP 协议的作用是什么?
答案:
- ARP 用于将 IP 地址映射到 MAC 地址,实现局域网通信;
- 通过广播请求目标 IP 的 MAC,目标回复 MAC。
传输层(TCP、UDP)
题目 1(基础):
TCP 和 UDP 的区别是什么?
答案:
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输 | 不可靠 |
| 传输方式 | 流式 | 数据报 |
| 应用 | 文件传输、HTTP | 视频、语音、DNS |
题目 2(场景题):
视频会议使用 UDP 而不是 TCP,为什么?
答案:
- UDP 无连接、延迟低;
- 丢包不会触发重传,保证实时性;
- TCP 重传可能导致延迟增加,影响视频流畅度。
题目 3(考点延伸):
TCP 如何保证可靠传输?
答案:
- 三次握手建立连接;
- 序列号、确认号保证顺序与可靠性;
- 流量控制:滑动窗口;
- 拥塞控制:慢启动、拥塞避免、快重传、快恢复。
会话层(建立、管理、终止会话)
题目 1(基础):
会话层的作用是什么?
答案:
- 建立、管理、终止应用间会话;
- 提供会话恢复、同步、对话控制。
题目 2(场景题):
在长连接的聊天应用中,会话层出现问题可能导致什么?
答案:
- 会话无法正确建立 → 无法通信;
- 会话异常终止 → 消息丢失或重复;
- 解决方案:心跳包检测、会话重连机制。
题目 3(考点延伸):
举例说明会话层协议。
答案:
- PPTP、RPC、NetBIOS、SSL/TLS(兼作表示层加密)。
表示层(数据表示、加密解密、编码)
题目 1(基础):
表示层的主要功能是什么?
答案:
- 数据表示、加密解密、编码转换;
- 常用协议:SSL/TLS、Unicode、ASCII。
题目 2(场景题):
HTTP 数据在网络上传输是明文还是加密?TLS 在表示层如何工作?
答案:
- HTTP 明文传输,HTTPS 使用 TLS 加密;
- TLS 握手交换公钥、协商对称密钥,建立加密通道;
- 表示层负责数据加密和解密。
题目 3(考点延伸):
解释前向保密(PFS)是什么?
答案:
- 即使私钥泄露,也无法解密历史通信数据;
- TLS1.3 默认支持 PFS,通过临时密钥保证安全。
应用层(HTTP、HTTPS、FTP、DNS、SMTP、SSH)
题目 1(基础):
应用层协议有哪些?功能是什么?
答案:
- HTTP/HTTPS:网页传输;
- FTP:文件传输;
- DNS:域名解析;
- SMTP:邮件发送;
- SSH:远程登录。
题目 2(场景题):
用户访问网页显示 404,说明了什么?
答案:
- HTTP 状态码 404 → 请求的资源不存在;
- 可通过 URL 检查、服务器文件路径、虚拟主机配置排查。
题目 3(考点延伸):
HTTPS 与 HTTP 的区别是什么?
答案:
- HTTP 明文传输;
- HTTPS 使用 TLS 加密,保证数据机密性、完整性和身份验证。
网络接口层(驱动、网卡、MAC)
题目 1(基础):
网络接口层的主要功能是什么?
答案:
- 功能:负责把数据从主机传到物理网络,处理网卡驱动、MAC 地址寻址。
- 设备:网卡、驱动程序。
题目 2(场景题):
网卡被替换后,局域网无法访问,怀疑网络接口层问题,你如何排查?
答案:
- 检查网卡是否正确安装驱动;
- 确认 MAC 地址是否被禁用或冲突;
- 使用
ifconfig或ip addr查看网卡状态; - 测试物理连通性。
题目 3(考点延伸):
MAC 地址在网络接口层的作用是什么?
答案:
- 唯一标识网络接口设备;
- 局域网中用于帧的目的/源地址寻址;
- 交换机根据 MAC 地址转发帧。
网络层(IP、ICMP)
题目 1(基础):
网络层的作用是什么?
答案:
- 功能:逻辑地址寻址、路由选择、数据包传输。
- 协议:IP、ICMP、ARP(局域网辅助)。
题目 2(场景题):
用户无法访问外网,ping 路由器成功但 ping 外网失败,如何排查?
答案:
- 检查默认网关配置是否正确;
- 查看路由表(
route -n或ip route); - 检查防火墙规则或 NAT 设置;
- 使用
traceroute确认数据包到达路径。
题目 3(考点延伸):
ICMP 的主要作用是什么?
答案:
- 网络诊断(如
ping); - 报告网络错误(目的不可达、超时等);
- 帮助路由器控制数据流。
传输层(TCP、UDP)
题目 1(基础):
传输层的功能是什么?
答案:
- 为应用提供端到端通信;
- 实现可靠传输(TCP)或低延迟传输(UDP);
- 流量控制、端口寻址。
题目 2(场景题):
同一台服务器同时运行 HTTP(TCP)和 DNS(UDP)服务,它们如何通过端口区分?
答案:
- 传输层通过 端口号 区分不同应用;
- TCP HTTP 默认 80/443,UDP DNS 默认 53;
- 内核根据四元组(源 IP/端口 + 目的 IP/端口 + 协议)区分流量。
题目 3(考点延伸):
TCP 如何保证可靠传输?
答案:
- 三次握手建立连接;
- 序列号、确认号保证顺序;
- 滑动窗口进行流量控制;
- 拥塞控制:慢启动、拥塞避免、快重传、快恢复。
TCP 机制
三次握手(SYN、SYN+ACK、ACK)
题目 1(基础):
TCP 三次握手的目的是什么?
答案:
- 建立可靠连接;
- 双方同步初始序列号;
- 确认通道可用。
题目 2(场景题):
三次握手中客户端发送 SYN 但服务器未响应,可能原因是什么?
答案:
- 服务器端口未开启;
- 防火墙阻止 SYN 包;
- 网络丢包或路由问题;
- SYN 攻击导致资源耗尽。
题目 3(考点延伸):
三次握手与四次挥手的区别是什么?
答案:
- 三次握手用于建立连接,双方确认序列号;
- 四次挥手用于断开连接,双方确认数据已传输完毕,涉及 TIME_WAIT 状态。
四次挥手(FIN/ACK、TIME_WAIT)
题目 1(基础):
TCP 四次挥手的作用是什么?
答案:
- 正确关闭 TCP 连接;
- 确保双方数据传输完毕;
- TIME_WAIT 防止旧报文干扰新连接。
题目 2(场景题):
客户端关闭连接后一直处于 TIME_WAIT,这会影响服务器吗?
答案:
- TIME_WAIT 会占用本地端口;
- 不会直接影响服务器,但大量短连接可能耗尽可用端口;
- 可通过缩短 TIME_WAIT 或复用端口优化。
题目 3(考点延伸):
TCP 状态机中 CLOSE_WAIT、FIN_WAIT 的含义是什么?
答案:
- CLOSE_WAIT:等待本端关闭连接(收到 FIN);
- FIN_WAIT:等待对端确认关闭连接。
拥塞控制、流量控制
题目 1(基础):
TCP 拥塞控制包含哪些算法?
答案:
- 慢启动(Slow Start);
- 拥塞避免(Congestion Avoidance);
- 快重传(Fast Retransmit);
- 快恢复(Fast Recovery)。
题目 2(场景题):
大量并发用户下载文件,服务器出现拥塞,TCP 如何缓解?
答案:
- 慢启动限制初始发送窗口;
- 拥塞避免算法动态调整窗口大小;
- 快重传+快恢复减少丢包重传延迟;
- 流量控制(滑动窗口)防止接收端过载。
题目 3(考点延伸):
流量控制与拥塞控制的区别是什么?
答案:
- 流量控制:接收端控制发送端,保证接收端不溢出;
- 拥塞控制:网络控制,防止过多报文导致网络拥塞。
UDP
题目 1(基础):
UDP 的特点是什么?
答案:
- 无连接、不可靠;
- 无序到达、无重传;
- 低延迟,适合实时通信。
题目 2(场景题):
在线直播使用 UDP,如果出现丢包,该怎么办?
答案:
- 丢包不重传保证实时性;
- 使用前向纠错(FEC)或应用层重传部分关键帧;
- 使用 QoS 优化网络优先级。
题目 3(考点延伸):
UDP 如何区分不同应用?
答案:
- 通过 源端口和目的端口;
- 内核使用四元组(源 IP/端口 + 目的 IP/端口 + 协议)区分不同数据流。
HTTPS/TLS
握手、证书、加密
题目 1(基础):
HTTPS 与 HTTP 的区别是什么?
答案:
- HTTP 明文传输;
- HTTPS 在应用层使用 TLS 加密,保证机密性、完整性和身份验证。
题目 2(场景题):
访问 HTTPS 网站时,浏览器提示证书不可信,可能原因是什么?
答案:
- 自签名证书;
- CA 根证书未安装或过期;
- 中间证书链缺失;
- 域名与证书不匹配。
题目 3(考点延伸):
TLS 握手流程简述。
答案:
- 客户端发 ClientHello,支持协议版本和加密套件;
- 服务端发 ServerHello,选择协议和套件,并发送证书;
- 客户端验证证书,生成预主密钥并加密发送;
- 双方生成会话密钥,完成握手;
- 加密通信开始。
TLS 版本与前向保密
题目 1(基础):
TLS1.3 相比 TLS1.2 有哪些改进?
答案:
- 简化握手,减少 RTT;
- 默认启用前向保密(PFS);
- 弃用不安全加密算法(如 RC4、MD5)。
题目 2(场景题):
攻击者获取服务器私钥,是否可以解密历史 HTTPS 会话?
答案:
- TLS1.2+使用 PFS 或 TLS1.3:不能解密历史会话;
- 非 PFS 情况:可解密历史通信。
题目 3(考点延伸):
证书链、CA、OCSP 的作用是什么?
答案:
- 证书链验证身份的可信性;
- CA 签发证书,保证合法性;
- CRL/OCSP 用于撤销检查,防止使用被吊销的证书。
常用网络工具
ping、traceroute
题目 1(基础):
ping 命令的作用是什么?
答案:
- 检测网络连通性;
- 测量往返时间(RTT);
- 使用 ICMP 回显请求。
题目 2(场景题):
ping 成功但网页访问失败,可能原因是什么?
答案:
- HTTP/HTTPS 服务未启动或端口被阻塞;
- 防火墙允许 ICMP、阻止 TCP;
- DNS 解析失败。
题目 3(考点延伸):
traceroute 的作用是什么?
答案:
- 显示数据包经过的路由节点;
- 帮助定位网络延迟或故障点。
tcpdump、wireshark
题目 1(基础):
tcpdump 和 Wireshark 的作用是什么?
答案:
- 抓包、分析网络流量;
- tcpdump 命令行,Wireshark 图形化。
题目 2(场景题):
用户访问 HTTP 网站超时,用 tcpdump 如何分析?
答案:
- 抓取客户端和服务器通信包;
- 检查 SYN/ACK 是否正常返回;
- 检查是否有丢包、重传或拒绝连接。
题目 3(考点延伸):
tcpdump 常用参数有哪些?
答案:
-i指定接口;-n不解析域名;-s指定抓包长度;port或host过滤特定流量。
ss、netstat、iftop
题目 1(基础):
netstat 和 ss 有什么区别?
答案:
- ss 更快、替代 netstat;
- 显示 TCP/UDP 连接、监听端口、套接字状态;
- 支持高级过滤。
题目 2(场景题):
服务器高负载时,如何用 iftop 排查流量?
答案:
- iftop 实时显示网络带宽使用情况;
- 可按源/目的 IP 排序,找到流量大户;
- 可结合 tcpdump 精细抓包分析。
题目 3(考点延伸):
netstat/ss 可以查看哪些信息?
答案:
- 本地和远端 IP/端口;
- TCP 状态(ESTABLISHED、TIME_WAIT);
- 使用的程序 PID/名称;
- 统计数据(包数、字节数)。
模块 2:Linux
常用命令(top、ps、df、du、netstat、ss、lsof、journalctl)
题目 1(基础):
top 命令显示了哪些关键指标?
答案:
- CPU 使用率(us、sy、id、wa);
- 内存使用情况(total、used、free、buffers/cache);
- 进程信息(PID、USER、%CPU、%MEM、COMMAND);
- 负载平均值(load average)。
题目 2(场景题):
服务器 CPU 占用过高,如何使用 top 和 ps 排查?
答案:
top查看占用 CPU 高的进程;ps aux --sort=-%cpu查看 CPU 排名前几的进程;- 结合
lsof查看进程打开的文件; - 判断是否为异常进程或应用逻辑问题。
题目 3(考点延伸):
df 与 du 的区别是什么?
答案:
df显示文件系统剩余空间(按分区统计);du显示目录或文件占用的实际空间;df查看磁盘整体使用,du查看具体目录。
权限管理(rwx、chmod、chown、ACL、SUID/SGID/sticky bit)
题目 1(基础):
Linux 文件权限 r、w、x 分别代表什么?
答案:
- r:可读;
- w:可写;
- x:可执行;
- 权限分为 用户、用户组、其他 三类。
题目 2(场景题):
用户 A 无法执行某脚本,文件权限显示 -rw-r--r--,如何解决?
答案:
- 脚本缺少执行权限;
- 使用
chmod +x script.sh添加执行权限; - 若需要指定特定用户或组执行,可使用 SUID/SGID 或修改所有者。
题目 3(考点延伸):
SUID、SGID 和 sticky bit 的作用是什么?
答案:
- SUID:执行文件时以文件所有者权限运行;
- SGID:新建文件继承目录组或执行文件以文件组权限运行;
- Sticky bit:目录下文件只能被所有者或 root 删除。
进程管理(kill、jobs、fg、bg、nohup、tmux)
题目 1(基础):
Linux 中如何查看所有进程?
答案:
ps aux显示所有进程;top实时监控;htop图形化显示(如安装)。
题目 2(场景题):
后台运行的任务被意外终止,如何保证任务继续执行?
答案:
- 使用
nohup command &或disown; - 使用
tmux或screen启动会话保持任务; - 可通过
jobs、fg、bg管理作业。
题目 3(考点延伸):
kill 命令中不同信号作用是什么?
答案:
kill -9:强制终止(不可捕获);kill -15:正常终止,可捕获处理;kill -HUP:重新加载配置。
文件系统(ext4、inode、硬/软链接、挂载)
题目 1(基础):
inode 在文件系统中的作用是什么?
答案:
- 保存文件元数据(权限、所有者、时间戳、数据块地址);
- 文件名存储在目录结构中与 inode 对应;
- 修改文件名不影响 inode。
题目 2(场景题):
硬链接和软链接有什么区别?
答案:
| 特性 | 硬链接 | 软链接 |
|---|---|---|
| 指向对象 | inode | 文件路径 |
| 可跨文件系统 | ❌ | ✅ |
| 删除原文件 | 链接仍可访问数据 | 链接失效 |
题目 3(考点延伸):
如何挂载新磁盘并永久生效?
答案:
- 分区:
fdisk或parted; - 格式化:
mkfs.ext4 /dev/sdx1; - 临时挂载:
mount /dev/sdx1 /mnt; - 永久挂载:编辑
/etc/fstab添加挂载信息。
IO 模型(阻塞、非阻塞、I/O 多路复用)
题目 1(基础):
Linux 中常见 IO 模型有哪些?
答案:
- 阻塞 IO:调用阻塞,等待完成;
- 非阻塞 IO:立即返回,需轮询;
- I/O 多路复用:
select、poll、epoll; - 信号驱动 IO、异步 IO(AIO)。
题目 2(场景题):
高并发服务器使用阻塞 IO,会遇到什么问题?如何优化?
答案:
- 问题:线程/进程数受限,CPU 利用率低,阻塞等待影响性能;
- 优化:使用 epoll 或异步 IO,实现单线程处理大量连接。
题目 3(考点延伸):
epoll 相比 select 有哪些优势?
答案:
- 支持大量 fd(文件描述符);
- O(1) 查询事件;
- 支持水平触发(LT)和边缘触发(ET);
- 减少内核/用户空间复制开销。
网络排查(ping、tcpdump、iftop)
题目 1(基础):
ping 命令用于什么?
答案:
- 检测网络连通性;
- 测量延迟(RTT);
- 使用 ICMP 回显请求。
题目 2(场景题):
网络访问慢,如何用 iftop 和 tcpdump 排查?
答案:
iftop:实时显示带宽使用情况,找出流量大 IP;tcpdump:抓取异常流量或丢包数据包;- 分析网络瓶颈或异常连接。
题目 3(考点延伸):
ss 和 netstat 的作用是什么?
答案:
- 查看 TCP/UDP 连接、监听端口;
- 查看套接字状态和对应进程 PID;
- ss 更快,可替代 netstat。
性能调优(ulimit、sysctl、内存管理、I/O 调度)
题目 1(基础):
ulimit 的作用是什么?
答案:
- 限制用户进程资源:最大打开文件数、最大内存、最大进程数等;
- 可防止单用户消耗过多系统资源。
题目 2(场景题):
高并发应用报 “Too many open files”,如何解决?
答案:
- 增加用户文件描述符限制:
ulimit -n 65535; - 修改
/etc/security/limits.conf永久生效; - 检查应用是否正确关闭文件。
题目 3(考点延伸):
Linux I/O 调度器有哪些?如何选择?
答案:
- cfq:适合桌面系统;
- deadline:实时/数据库系统;
- noop: SSD 设备,最少调度;
- 可通过
cat /sys/block/sda/queue/scheduler查看并切换。
systemd(systemctl、服务管理)
题目 1(基础):
systemctl 用于什么?
答案:
- 管理 systemd 服务:启动、停止、重启、状态查询;
- 管理开机启动项。
题目 2(场景题):
某服务无法启动,日志提示依赖未满足,如何排查?
答案:
- 查看服务状态:
systemctl status service; - 查看依赖关系:
systemctl list-dependencies service; - 查看 journal 日志:
journalctl -u service; - 修复依赖或配置后重新启动。
题目 3(考点延伸):
systemd 启动流程简述。
答案:
- PID 1 启动 systemd;
- 读取
/etc/systemd/system配置; - 启动 target(类似 runlevel);
- 按依赖顺序启动服务单元。
安全(SELinux、AppArmor)
题目 1(基础):
SELinux 的作用是什么?
答案:
- 提供强制访问控制(MAC),限制进程对资源访问;
- 安全策略:enforcing、permissive、disabled。
题目 2(场景题):
应用访问文件被拒绝,但权限正常,如何排查?
答案:
- 检查 SELinux 状态:
getenforce; - 查看审计日志
/var/log/audit/audit.log; - 临时切换 permissive 或调整策略解决。
题目 3(考点延伸):
AppArmor 与 SELinux 区别是什么?
答案:
- SELinux:基于标签的强制访问控制,粒度更细;
- AppArmor:基于路径控制,策略易于配置,但粒度相对粗;
- SELinux 更复杂、AppArmor 更易上手。
好的,我们继续生成 模块 3:MySQL 的完整面试题库,每个小要点至少三题(基础题、场景题、考点延伸题),并给出详细解答。
模块 3:MySQL
慢查询优化(slow_query_log、EXPLAIN、performance_schema)
题目 1(基础):
如何开启 MySQL 慢查询日志?
答案:
- 配置
my.cnf:
1 | [mysqld] |
- 启动后,记录执行时间超过
long_query_time的 SQL; - 可通过
mysqldumpslow分析日志。
题目 2(场景题):
查询执行很慢,如何定位瓶颈?
答案:
- 查看慢查询日志,找出耗时 SQL;
- 使用
EXPLAIN SELECT ...查看执行计划(全表扫描、索引使用情况); - 使用
performance_schema监控查询、锁、IO、等待事件; - 针对慢查询优化:添加索引、改写 SQL、分表分库。
题目 3(考点延伸):
EXPLAIN 输出中 key、type、rows 字段分别代表什么?
答案:
- key:使用的索引;
- type:访问类型(ALL、index、range、ref、eq_ref、const);
- rows:估计扫描行数;
- 通过这些信息判断是否全表扫描或索引失效。
索引(B+ 树结构、聚簇索引 vs 非聚簇索引)
题目 1(基础):
InnoDB 默认索引结构是什么?
答案:
- B+ 树;
- 主键索引为聚簇索引,数据和索引在一起存储;
- 辅助索引为非聚簇索引,叶子节点存主键。
题目 2(场景题):
查询使用了索引但速度仍慢,可能原因是什么?
答案:
- 索引失效:函数操作、隐式类型转换、
like %xxx; - 数据分布不均衡导致索引选择不理想;
- 覆盖索引未命中,需要回表。
题目 3(考点延伸):
聚簇索引和非聚簇索引的区别?
答案:
| 特性 | 聚簇索引 | 非聚簇索引 |
|---|---|---|
| 数据存储 | 叶子节点存数据 | 叶子节点存主键 |
| 查询效率 | 范围查询快 | 单值查询快 |
| 占用空间 | 较大 | 较小 |
事务(ACID、隔离级别、并发问题、MVCC)
题目 1(基础):
MySQL 支持哪些事务隔离级别?
答案:
- 读未提交(Read Uncommitted):可能脏读;
- 读已提交(Read Committed):避免脏读,但可能不可重复读;
- 可重复读(Repeatable Read,默认):避免脏读和不可重复读,但可能幻读;
- 串行化(Serializable):完全避免并发问题,但性能最低。
题目 2(场景题):
两条并发事务读写同一行数据,出现不可重复读,如何解决?
答案:
- 设置事务隔离级别为可重复读或串行化;
- 使用锁(行锁)保证一致性;
- 使用 MVCC(InnoDB 默认)避免读阻塞。
题目 3(考点延伸):
MVCC 的实现原理是什么?
答案:
- 利用 undo log 保存数据旧版本;
- read view 决定事务可见数据版本;
- 隐藏列存储事务 ID,保证快照读;
- 保证读写不阻塞,提高并发。
锁(表锁、行锁、共享锁、排他锁、间隙锁、Next-Key 锁、乐观锁、悲观锁)
题目 1(基础):
InnoDB 支持哪些锁类型?
答案:
- 行锁(Record Lock)、表锁;
- 共享锁(S):可读但不可写;
- 排他锁(X):读写都阻塞;
- Next-Key 锁 = 行锁 + 间隙锁(防止幻读)。
题目 2(场景题):
大量更新出现死锁,如何排查并解决?
答案:
- 使用
SHOW ENGINE INNODB STATUS\G查看死锁信息; - 确认事务操作顺序一致,避免交叉锁;
- 对热点数据加索引,减少锁粒度;
- 考虑乐观锁(版本号)替代悲观锁。
题目 3(考点延伸):
乐观锁与悲观锁的区别?
答案:
- 乐观锁:假设无冲突,通过版本号/时间戳检查冲突,适合读多写少;
- 悲观锁:假设会冲突,先加锁,适合写多场景。
存储引擎(InnoDB、MyISAM)
题目 1(基础):
InnoDB 与 MyISAM 区别?
答案:
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事务 | 支持 | 不支持 |
| 锁机制 | 行锁 | 表锁 |
| MVCC | 支持 | 不支持 |
| 外键 | 支持 | 不支持 |
题目 2(场景题):
MyISAM 表频繁更新大表导致锁争用,如何优化?
答案:
- 改用 InnoDB 支持行锁;
- 分表分库降低单表压力;
- 优化索引减少全表扫描。
题目 3(考点延伸):
InnoDB 事务日志有哪些?作用?
答案:
- redo log:保证持久性(Crash 恢复);
- undo log:回滚事务,实现 MVCC;
- binlog:主从复制和数据恢复。
日志(redo log、undo log、binlog)
题目 1(基础):
redo log 的作用是什么?
答案:
- 保证事务提交的持久性;
- 写入磁盘前采用预写日志(WAL),事务提交后再刷新数据页。
题目 2(场景题):
数据库突然宕机,如何利用日志恢复?
答案:
- 利用 redo log 恢复已提交事务;
- 利用 undo log 回滚未提交事务;
- binlog 可用于主从同步或点时间恢复。
题目 3(考点延伸):
binlog 有哪些格式?
答案:
- STATEMENT:记录 SQL 语句,体积小,但可能出现不可重复执行问题;
- ROW:记录每行数据变化,精确但体积大;
- MIXED:混合模式,根据情况选择。
模块 4:Java
基本类型与包装类
题目 1(基础):
Java 有哪八种基本数据类型及其包装类?
答案:
| 类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
题目 2(场景题):
Integer a = 100; Integer b = 100; a == b 是 true 还是 false?为什么?
答案:
- true;
- 因为 JVM 缓存了 -128~127 的 Integer 对象;
- 超出范围则
==比较不同对象引用返回 false。
题目 3(考点延伸):
自动装箱/拆箱可能带来哪些性能或空指针风险?
答案:
- 装箱:基本类型 → 包装类对象,增加对象创建开销;
- 拆箱:包装类 → 基本类型;
- null 拆箱会抛出 NullPointerException。
Object 类
题目 1(基础):
Object 类常用方法有哪些?
答案:
equals():比较对象内容;hashCode():返回对象哈希值;toString():对象字符串表示;clone():浅拷贝对象;wait()/notify()/notifyAll():线程通信。
题目 2(场景题):
两个对象 a 和 b 内容相同但 a == b 返回 false,如何让 a.equals(b) 返回 true?
答案:
- 重写
equals()方法,按属性判断对象内容是否相等; - 通常同时重写
hashCode()保证哈希一致性。
题目 3(考点延伸):
clone() 和深拷贝、浅拷贝区别?
答案:
- 浅拷贝:对象属性引用仍指向原对象;
- 深拷贝:对象属性也复制新对象;
clone()默认浅拷贝,需手动实现深拷贝。
String
题目 1(基础):
为什么 String 是不可变对象?
答案:
- String 存储在字符串常量池中;
- 通过不可变性保证线程安全;
- 修改操作会生成新对象,原对象不变。
题目 2(场景题):
大量字符串拼接性能低,如何优化?
答案:
- 使用
StringBuilder(非线程安全,效率高)或StringBuffer(线程安全,略慢); - 避免频繁生成临时 String 对象。
题目 3(考点延伸):
StringPool 是如何工作的?
答案:
- 字符串常量池保存编译期确定的字符串;
- 相同字面量只存一份,节省内存;
new String("abc")会生成新对象,不在池中。
异常(Checked vs Unchecked、try-with-resources)
题目 1(基础):
Checked 与 Unchecked 异常区别?
答案:
- Checked:编译器检查,必须处理或抛出(如 IOException);
- Unchecked:运行时异常,不强制捕获(如 NullPointerException、ArrayIndexOutOfBoundsException)。
题目 2(场景题):
如何保证文件操作后资源被正确关闭?
答案:
- 使用
try-with-resources自动关闭实现AutoCloseable接口的资源;
1 | try (FileInputStream fis = new FileInputStream("file.txt")) { |
题目 3(考点延伸):
异常的传播机制是怎样的?
答案:
- 异常沿调用栈向上抛出;
- 捕获最接近的匹配
catch块; - finally 块保证无论是否抛异常都执行资源释放。
并发(synchronized、ReentrantLock、CAS、原子类、ThreadLocal、Thread、Runnable、Callable、线程池)
题目 1(基础):
synchronized 与 ReentrantLock 区别?
答案:
| 特性 | synchronized | ReentrantLock |
|---|---|---|
| 是否可重入 | 是 | 是 |
| 公平锁 | 不支持 | 支持 |
| 手动释放锁 | 否 | 是 |
| 支持条件变量 | 否 | 是(Condition) |
题目 2(场景题):
多线程累加共享变量出现错误,如何解决?
答案:
- 使用
synchronized或ReentrantLock保护共享变量; - 使用
AtomicInteger等原子类; - 避免同时修改非线程安全对象。
题目 3(考点延伸):
Thread、Runnable、Callable 的区别?
答案:
- Thread:继承 Thread 类实现线程;
- Runnable:实现接口,适合资源共享,不能返回值;
- Callable:实现接口,可返回值并抛异常;
- Runnable 可通过
FutureTask转 Callable 使用。
题目 4(线程池):
ThreadPoolExecutor 核心参数及作用?
答案:
- corePoolSize:核心线程数;
- maximumPoolSize:最大线程数;
- keepAliveTime:空闲线程存活时间;
- workQueue:任务队列;
- RejectionPolicy:拒绝策略(Abort、CallerRuns、Discard、DiscardOldest)。
集合(List、Set、Map、并发集合)
题目 1(基础):
ArrayList 与 LinkedList 区别?
答案:
| 特性 | ArrayList | LinkedList |
|---|---|---|
| 底层结构 | 动态数组 | 双向链表 |
| 随机访问 | O(1) | O(n) |
| 插入删除 | 慢(数组搬移) | 快(链表操作) |
题目 2(场景题):
HashMap 的 get() 方法能否判断 key 是否存在?
答案:
- 不能;因为 value 可能为 null;
- 使用
containsKey()判断 key 是否存在。
题目 3(考点延伸):
ConcurrentHashMap 如何保证线程安全?
答案:
- Java 8 采用 CAS + 链表/红黑树 + 分段锁 机制;
- 读操作无锁,写操作仅锁局部桶,提高并发性能;
- 避免全局锁。
JVM 内部结构(运行时内存区域、类加载、双亲委派、OOM)
题目 1(基础):
JVM 堆和方法区区别?
答案:
- 堆:存对象实例,垃圾回收主要区域;
- 方法区(元空间):存类元信息、静态变量、常量;
- 堆可调节大小,方法区可使用 Metaspace。
题目 2(场景题):
出现 java.lang.OutOfMemoryError: Metaspace,可能原因及解决?
答案:
- 原因:类加载过多、内存泄漏(动态生成类未卸载);
- 解决:增加 Metaspace 大小,检查类加载逻辑,避免动态类泄漏。
题目 3(考点延伸):
双亲委派机制为什么重要?
答案:
- 保证核心类优先由父类加载器加载,避免类冲突;
- 防止加载不安全的自定义类覆盖核心类;
- 提高类加载安全性和稳定性。
GC(垃圾回收)
题目 1(基础):
常见垃圾回收算法有哪些?
答案:
- 引用计数;
- 标记清除;
- 标记整理;
- 复制算法。
题目 2(场景题):
新生代 Minor GC 和老年代 Full GC 的区别?
答案:
- Minor GC:回收新生代对象,频繁、快速;
- Full GC:回收整个堆(新生代 + 老年代),耗时长;
- 调优:控制对象存活时间,减少 Full GC。
题目 3(考点延伸):
G1、CMS、ZGC、Shenandoah 各自特点?
答案:
- CMS:并发标记清理,减少停顿;
- G1:分代 + 区域化管理,控制停顿时间;
- ZGC、Shenandoah:低延迟 GC,适合大内存应用。
模块 5:Web
HTTP(请求方法、状态码、Header)
题目 1(基础):
常用 HTTP 请求方法有哪些?分别作用是什么?
答案:
- GET:获取资源,不应有副作用;
- POST:提交数据,可能创建或修改资源;
- PUT:更新或创建资源;
- DELETE:删除资源;
- PATCH:部分更新资源;
- HEAD:只获取响应头,不返回正文;
- OPTIONS:获取支持的方法。
题目 2(场景题):
浏览器请求页面返回 304 状态码,意味着什么?如何处理?
答案:
- 304 Not Modified:客户端缓存未过期,资源未修改;
- 浏览器直接使用缓存,减少带宽和加载时间;
- 通过 ETag 或 Last-Modified 进行缓存验证。
题目 3(考点延伸):
HTTP 常用 Header 及作用?
答案:
- 请求头:
Content-Type(请求类型)、Authorization(身份验证)、Accept(可接受类型); - 响应头:
Content-Type、Cache-Control、Set-Cookie、Location(重定向); - Header 用于控制缓存、安全、数据格式等。
HTTPS(TLS 加密)
题目 1(基础):
HTTPS 与 HTTP 区别?
答案:
- HTTPS 在 HTTP 基础上使用 TLS/SSL 加密;
- 确保数据传输机密性、完整性、身份认证;
- HTTPS 端口默认 443,HTTP 端口 80。
题目 2(场景题):
浏览器访问 HTTPS 页面提示证书错误,可能原因?
答案:
- 证书过期;
- 证书不被信任(非 CA 签发);
- 域名不匹配;
- 证书链不完整。
题目 3(考点延伸):
TLS 握手流程简述。
答案:
- 客户端发起握手,发送支持的加密套件;
- 服务端返回证书及选定加密套件;
- 客户端验证证书,生成对称密钥并加密发送;
- 服务端解密,握手完成,双方使用对称密钥加密数据。
Cookie、Session、Token
题目 1(基础):
Cookie 与 Session 区别?
答案:
| 特性 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务器 |
| 容量限制 | 小(4KB) | 较大(服务器内存) |
| 安全性 | 容易被篡改 | 相对安全 |
| 生命周期 | 可设置过期 | 默认会话结束清除 |
题目 2(场景题):
实现用户登录状态保持有哪些方式?
答案:
- Cookie + Session:服务器存储 Session,客户端保存 SessionID;
- JWT(Token):无状态认证,客户端存储 Token,每次请求携带验证;
- Redis 保存 Token,提高分布式场景一致性。
题目 3(考点延伸):
Token 相比 Session 的优势?
答案:
- 无状态,易扩展分布式系统;
- 不依赖服务器内存;
- 支持自包含信息,减少数据库查询。
RESTful API 设计
题目 1(基础):
RESTful API 设计原则有哪些?
答案:
- 资源为中心(URI 表示资源);
- 使用 HTTP 方法表示操作(GET、POST、PUT、DELETE);
- 无状态请求;
- 返回合适 HTTP 状态码;
- 可使用 JSON/XML 表示数据。
题目 2(场景题):
设计用户管理接口,哪些 URL 和方法符合 RESTful 规范?
答案:
| 操作 | URL | 方法 |
|---|---|---|
| 查询用户 | /users/{id} | GET |
| 创建用户 | /users | POST |
| 更新用户 | /users/{id} | PUT |
| 删除用户 | /users/{id} | DELETE |
题目 3(考点延伸):
RESTful 与 RPC 风格 API 区别?
答案:
- RESTful:以资源为中心,使用标准 HTTP 方法;
- RPC:以动作或函数为中心,通常 POST 调用;
- RESTful 易于缓存、可扩展,符合 Web 标准。
跨域(CORS、JSONP)
题目 1(基础):
什么是跨域请求?
答案:
- 浏览器同源策略限制不同域、协议或端口的请求访问资源;
- 跨域请求需特殊处理。
题目 2(场景题):
前端请求跨域接口报错,如何解决?
答案:
- CORS:服务端设置
Access-Control-Allow-Origin等 Header; - JSONP:通过
<script>标签请求跨域 GET 接口; - 代理转发:前端请求同源接口,由后端转发到目标域。
题目 3(考点延伸):
CORS 的简单请求与预检请求区别?
答案:
- 简单请求:GET/POST(Content-Type 为 application/x-www-form-urlencoded、multipart/form-data、text/plain),直接发送;
- 预检请求:复杂请求(PUT、DELETE 或自定义 Header),浏览器先发 OPTIONS 请求确认。
缓存(Cache-Control、ETag、Last-Modified)
题目 1(基础):
HTTP 缓存机制有哪些?
答案:
- 强缓存:浏览器直接使用缓存,
Cache-Control或Expires; - 协商缓存:浏览器与服务器确认资源是否更新,
ETag、Last-Modified。
题目 2(场景题):
前端请求频繁导致服务器压力大,如何优化?
答案:
- 设置合理缓存策略,减少重复请求;
- 使用 ETag 或 Last-Modified 验证资源更新;
- 对静态资源 CDN 缓存加速。
题目 3(考点延伸):
Cache-Control 指令常见有哪些?
答案:
no-cache:必须向服务器验证;no-store:不缓存;max-age:最大缓存时间;public:可被共享缓存;private:只能被浏览器缓存。
WebSocket、SSE、长轮询
题目 1(基础):
WebSocket 与 HTTP 有何区别?
答案:
- WebSocket:全双工通信,客户端和服务器可主动发送消息;
- HTTP:请求-响应模式,客户端发起请求;
- WebSocket 建立后可持续连接,减少轮询开销。
题目 2(场景题):
实现实时聊天应用,如何选择通信方式?
答案:
- 需要高频率双向通信:WebSocket;
- 只需服务端推送,客户端偶尔获取:SSE;
- 无 WebSocket 支持,低频通信:长轮询。
题目 3(考点延伸):
长轮询与 WebSocket 性能差异?
答案:
- 长轮询:每次请求结束立即重新发送,频繁 HTTP 建立连接,开销大;
- WebSocket:一次连接可持续通信,CPU 和网络开销小;
- 高并发或低延迟场景推荐 WebSocket。
模块 6:框架
6.1 Spring(IoC 容器、Bean 生命周期、AOP)
题目 1(基础):
Spring 的 IoC 容器是什么?
答案:
- IoC(Inversion of Control,控制反转):对象创建、依赖管理交给容器;
- 容器管理 Bean 的生命周期和依赖注入;
- 支持 XML、注解、JavaConfig 等配置方式。
题目 2(场景题):
如何自定义 Bean 初始化和销毁方法?
答案:
- 方法一:在
@Bean(initMethod="init", destroyMethod="destroy")中指定; - 方法二:实现
InitializingBean.afterPropertiesSet()和DisposableBean.destroy(); - 方法三:使用
@PostConstruct和@PreDestroy注解。
题目 3(考点延伸):
Spring AOP 的实现原理?
答案:
- JDK 动态代理:接口代理,生成代理对象实现接口;
- CGLIB:继承目标类生成子类代理(非接口类);
- 代理对象拦截方法调用,织入切面逻辑(Before、After、Around)。
6.2 Spring Boot(自动配置原理、Starter 模块、配置优先级、Actuator)
题目 1(基础):
Spring Boot 自动配置原理是什么?
答案:
- 通过
@EnableAutoConfiguration注解触发; - 根据类路径存在的依赖、条件注解(
@ConditionalOnClass、@ConditionalOnMissingBean)自动创建 Bean; - 避免手动繁琐配置,提高开发效率。
题目 2(场景题):
同一个配置项在多个地方定义,Spring Boot 如何选择?
答案:
- 优先级:命令行 >
application.yml/application.properties> 外部配置文件 >@Value/@ConfigurationProperties默认值; - Spring Boot 按顺序覆盖配置,确保灵活性。
题目 3(考点延伸):
Spring Boot Actuator 能做什么?
答案:
- 健康检查
/actuator/health; - 监控应用指标
/actuator/metrics; - 查看环境变量
/actuator/env; - 支持自定义端点,结合 Prometheus/Grafana 可观测性。
6.3 Spring MVC(DispatcherServlet、拦截器、异常处理)
题目 1(基础):
Spring MVC 的请求处理流程?
答案:
- 请求到
DispatcherServlet; - 根据
HandlerMapping找到 Controller 方法; HandlerAdapter执行方法;- 返回
ModelAndView; ViewResolver渲染视图;- 返回响应给客户端。
题目 2(场景题):
需要在 Controller 执行前后做统一处理,比如日志或权限,如何实现?
答案:
- 使用 Spring MVC 拦截器
HandlerInterceptor; preHandle前置处理,postHandle后置处理,afterCompletion请求完成处理;- 可用于统一日志记录、权限校验、性能监控。
题目 3(考点延伸):
Spring MVC 如何统一处理异常?
答案:
- 使用
@ControllerAdvice+@ExceptionHandler; - 也可继承
ResponseEntityExceptionHandler; - 可返回统一错误响应 JSON,方便前端处理。
6.4 MyBatis(SQL 映射、动态 SQL、缓存、N+1 问题)
题目 1(基础):
MyBatis 的核心功能是什么?
答案:
- SQL 映射:Java 对象与数据库表对应;
- 动态 SQL:通过
<if>、<where>等标签生成 SQL; - 支持 XML 和注解方式配置;
- 支持一级缓存、二级缓存提高性能。
题目 2(场景题):
查询用户及其订单列表出现 N+1 问题,如何优化?
答案:
- 使用关联查询(JOIN)减少 SQL 次数;
- 使用
collection或association在 MyBatis 中一条 SQL 查询完成多表关联; - 可通过批量查询再在内存组装数据。
题目 3(考点延伸):
MyBatis 一级缓存和二级缓存区别?
答案:
| 特性 | 一级缓存 | 二级缓存 |
|---|---|---|
| 范围 | SqlSession | Mapper/namespace |
| 生命周期 | SqlSession 级别 | Mapper 级别,可跨 SqlSession |
| 默认开启 | 是 | 需配置 <cache/> |
好的,我们继续生成 模块 7:分布式 的完整面试题库,每个小要点至少三题(基础题、场景题、考点延伸题),并给出详细解答。
模块 7:分布式
7.1 Spring Cloud(服务注册发现、负载均衡、网关、熔断限流)
题目 1(基础):
Spring Cloud 的服务注册与发现机制是什么?
答案:
- 使用 Eureka 或 Nacos 作为注册中心;
- 服务启动时注册自身信息(IP、端口、元数据);
- 客户端通过服务名称查询可用实例,实现服务调用;
- 支持心跳检测,保证服务可用性。
题目 2(场景题):
微服务调用经常出现实例不可用或延迟,如何优化?
答案:
- 使用 Ribbon 或 Feign 实现客户端负载均衡;
- 引入 Hystrix 或 Sentinel 实现熔断、降级、限流;
- 结合 Spring Cloud Gateway 做统一路由、限流;
- 监控服务健康状态,剔除不可用实例。
题目 3(考点延伸):
负载均衡策略有哪些?
答案:
- 轮询(Round Robin);
- 随机(Random);
- 最小并发请求(Least Connections);
- 权重轮询(Weighted Round Robin);
- Ribbon 默认支持多种策略,可自定义。
7.2 分布式核心要点(雪花算法、JWT/OAuth2、Redis、MQ、分布式事务、CAP/BASE、一致性协调、可观测性)
雪花算法(分布式唯一 ID)
题目 1(基础):
雪花算法生成 ID 原理是什么?
答案:
- 64 位二进制结构:1 位符号 + 41 位时间戳 + 10 位机器 ID + 12 位序列号;
- 高性能生成唯一、递增 ID,避免数据库瓶颈;
- 可支持分布式系统多节点生成。
题目 2(场景题):
为什么需要雪花算法而不是自增 ID?
答案:
- 自增 ID 在多节点下会冲突,需要数据库集中管理;
- 雪花算法分布式生成,无需依赖中心 DB,性能高;
- 支持水平扩展。
题目 3(考点延伸):
雪花算法生成的 ID 可能存在问题吗?
答案:
- 系统时间回退可能导致重复 ID;
- 序列号溢出需等待下一毫秒;
- 需保证机器 ID 唯一,否则可能重复。
JWT / OAuth2(无状态认证)
题目 1(基础):
JWT 有哪三个部分?
答案:
- Header:算法类型、Token 类型;
- Payload:用户信息、过期时间等;
- Signature:签名,保证数据完整性。
题目 2(场景题):
前后端分离项目如何使用 JWT 实现登录?
答案:
- 登录成功生成 JWT,返回给前端;
- 前端每次请求携带 Token;
- 服务端通过验证签名和过期时间确认身份,无需存储会话。
题目 3(考点延伸):
JWT 的安全问题及解决方法?
答案:
- 不可存储敏感信息(如密码);
- 使用 HTTPS 避免中间人攻击;
- 过期时间控制 Token 生命周期;
- 可使用刷新 Token 机制。
Redis(数据结构、持久化、集群、分布式锁、缓存问题)
题目 1(基础):
Redis 常用数据结构有哪些?
答案:
- String、Hash、List、Set、ZSet(有序集合);
- 支持快速读写、计数、排行榜、缓存。
题目 2(场景题):
高并发下如何实现 Redis 分布式锁?
答案:
- 使用
SETNX key value NX PX 10000原子操作; - 使用 Redisson 客户端封装安全的分布式锁;
- 确保过期时间防止死锁。
题目 3(考点延伸):
缓存问题(穿透、击穿、雪崩)如何解决?
答案:
- 穿透:请求不存在数据,可缓存空对象;
- 击穿:热点 key 过期并发请求,可加互斥锁;
- 雪崩:大量 key 同时过期,分散过期时间或使用随机过期;
- 使用合理 TTL、双级缓存策略。
MQ(削峰填谷、解耦、异步、消费语义)
题目 1(基础):
消息队列常用场景?
答案:
- 流量削峰填谷;
- 系统解耦;
- 异步处理;
- 异步通知、日志处理、订单系统等。
题目 2(场景题):
Kafka、RocketMQ、RabbitMQ 消费语义有何区别?
答案:
| 消费语义 | 描述 |
|---|---|
| at-most-once | 消息可能丢失,但不会重复 |
| at-least-once | 消息可能重复,但不丢失 |
| exactly-once | 消息不丢失也不重复(事务或幂等性实现) |
题目 3(考点延伸):
如何保证 MQ 消息顺序消费?
答案:
- Kafka 分区顺序消费,保证同一分区内顺序;
- RabbitMQ 使用单队列 + 单消费者;
- 避免多线程并行消费同一顺序队列。
分布式事务(2PC、XA、Saga、补偿、Seata)
题目 1(基础):
2PC(两阶段提交)流程?
答案:
- 准备阶段:协调者询问各参与者能否提交;
- 提交阶段:所有参与者同意提交则正式提交,否则回滚;
- 保证原子性,但性能低,阻塞资源。
题目 2(场景题):
电商系统跨服务扣库存和创建订单,如何保证分布式事务?
答案:
- 方案 1:2PC/XA,保证强一致性;
- 方案 2:Saga 事务 + 补偿事务,保证最终一致性;
- 方案 3:使用 Seata 框架管理分布式事务,简化开发。
题目 3(考点延伸):
分布式事务与本地事务区别?
答案:
- 本地事务:单数据库,ACID 保证强一致性;
- 分布式事务:跨服务或数据库,需要协调机制,通常追求最终一致性,性能开销大。
CAP / BASE 理论
题目 1(基础):
CAP 理论是什么?
答案:
- Consistency(强一致性)、Availability(可用性)、Partition tolerance(分区容错);
- 分布式系统最多同时保证两项。
题目 2(场景题):
电商秒杀系统为什么选择 AP 系统而非 CP 系统?
答案:
- 秒杀系统追求高可用和快速响应;
- 可接受最终一致性;
- AP 系统保证可用性和分区容错,牺牲短时间一致性。
题目 3(考点延伸):
BASE 理论如何理解?
答案:
- Basically Available(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性);
- 弥补 CAP 理论的实际应用场景,实现高可用分布式系统。
一致性协调(Zookeeper、etcd)
题目 1(基础):
Zookeeper 的主要功能?
答案:
- 分布式协调服务;
- 提供选举、配置管理、命名服务、分布式锁等;
- 使用 ZAB 协议保证顺序一致性。
题目 2(场景题):
多个微服务如何利用 Zookeeper 实现分布式锁?
答案:
- 使用临时顺序节点;
- 获取最小序号节点的客户端获得锁;
- 锁释放后通知下一个等待客户端。
题目 3(考点延伸):
etcd 与 Zookeeper 有何区别?
答案:
- etcd:使用 Raft 协议,API 简洁,HTTP/JSON 接口;
- Zookeeper:ZAB 协议,Java 原生客户端,功能丰富;
- 都可实现配置管理、分布式锁、服务注册。
可观测性(ELK、Prometheus、Grafana、Jaeger)
题目 1(基础):
可观测性三要素?
答案:
- Metrics(指标);
- Logs(日志);
- Tracing(分布式调用链)。
题目 2(场景题):
服务出现性能瓶颈,如何定位?
答案:
- 使用 Prometheus 收集指标(CPU、内存、请求延迟);
- Grafana 可视化监控;
- ELK 分析日志,定位错误或异常;
- Jaeger 查看分布式调用链,找出慢链路。
题目 3(考点延伸):
为什么微服务系统需要可观测性?
答案:
- 系统复杂,单点问题难定位;
- 提前发现异常,提高可靠性;
- 支持容量规划和优化决策。
好的,我们继续生成 模块 8:运维/容器化 的完整面试题库,每个小要点至少三题(基础题、场景题、考点延伸题),并附详细解答。
模块 8:运维/容器化
Docker(镜像、容器、Dockerfile)
题目 1(基础):
Docker 镜像和容器有什么区别?
答案:
- 镜像:静态文件,包含应用及运行环境;
- 容器:镜像运行后的实例,独立进程环境,可读写文件系统;
- 镜像不可修改,容器可写。
题目 2(场景题):
如何构建一个轻量化的 Docker 镜像?
答案:
- 使用官方基础镜像(Alpine、Debian Slim);
- 多阶段构建减少临时文件;
- 清理缓存和不必要文件;
- 合理拆分层,减少镜像体积。
题目 3(考点延伸):
Dockerfile 常用指令有哪些?
答案:
- FROM:基础镜像;
- COPY/ADD:复制文件到镜像;
- RUN:构建期间执行命令;
- CMD/ENTRYPOINT:容器启动命令;
- EXPOSE:暴露端口;
- ENV:设置环境变量;
- WORKDIR:工作目录。
Kubernetes(Pod、Deployment、Service、Ingress、ConfigMap、Secret、StatefulSet)
题目 1(基础):
Kubernetes 中 Pod、Deployment、Service 有何作用?
答案:
- Pod:最小调度单元,封装容器及资源;
- Deployment:管理 Pod 副本,保证期望状态;
- Service:提供访问入口,实现负载均衡,暴露 Pod。
题目 2(场景题):
如何在 Kubernetes 中配置应用数据库连接信息?
答案:
- ConfigMap:存储非敏感配置;
- Secret:存储敏感信息(密码、Token),支持加密;
- Pod 通过环境变量或挂载卷读取配置。
题目 3(考点延伸):
StatefulSet 与 Deployment 有何区别?
答案:
| 特性 | Deployment | StatefulSet |
|---|---|---|
| Pod 名称 | 随机 | 稳定,序号递增 |
| 数据持久化 | 不保证 | 与 Pod 一一对应的持久卷 |
| 场景 | 无状态应用 | 有状态应用(数据库、缓存) |
部署策略(滚动更新、蓝绿、金丝雀)
题目 1(基础):
Kubernetes 中滚动更新是什么?
答案:
- Deployment 默认策略;
- 逐步替换旧 Pod,保证服务不中断;
- 可配置最大不可用和最大超额副本数。
题目 2(场景题):
如何在生产环境中安全发布新版本?
答案:
- 蓝绿部署:同时保留旧版本和新版本,流量切换后回退简单;
- 金丝雀发布:先小部分用户访问新版本,验证稳定后全量切换;
- 滚动更新:逐步替换 Pod,减少宕机。
题目 3(考点延伸):
滚动更新与蓝绿部署优缺点?
答案:
- 滚动更新:平滑升级,不占用额外资源,但回退复杂;
- 蓝绿部署:快速回退,但需要双份资源,成本高。
CI/CD(Jenkins、GitLab CI、ArgoCD)
题目 1(基础):
CI/CD 的核心作用是什么?
答案:
- 持续集成(CI):自动构建、测试代码,提高开发效率;
- 持续交付/部署(CD):自动发布、部署到环境,保证快速、可重复交付;
- 提高软件质量和发布速度。
题目 2(场景题):
如何实现微服务应用自动化部署?
答案:
- Jenkins/GitLab CI 构建镜像、执行测试;
- Docker Push 镜像到 Registry;
- ArgoCD 或 Helm 部署更新 Kubernetes 集群;
- 结合监控报警和回滚策略保证安全。
题目 3(考点延伸):
CI/CD 常见挑战有哪些?
答案:
- 多环境一致性问题;
- 构建/部署失败回滚处理;
- 依赖管理和版本控制;
- 流水线安全、权限控制;
- 微服务依赖顺序和配置管理。
高可用(多 AZ、故障切换、自动伸缩)
题目 1(基础):
高可用的核心指标是什么?
答案:
- SLA(Service Level Agreement):服务可用性目标;
- 容错能力:单点故障不影响系统整体;
- 自动故障切换和自愈能力。
题目 2(场景题):
Web 服务在单 AZ 宕机时如何保证可用?
答案:
- 多可用区部署(Multi-AZ);
- 使用负载均衡器自动切换健康节点;
- 自动伸缩(HPA/VPA)保证服务压力可控;
- 数据库采用主备或集群模式,保证数据可用性。
题目 3(考点延伸):
Kubernetes 如何实现自动伸缩?
答案:
- HPA(Horizontal Pod Autoscaler):根据 CPU/内存或自定义指标自动增加/减少 Pod 副本;
- VPA(Vertical Pod Autoscaler):动态调整 Pod 资源请求;
- Cluster Autoscaler:动态扩缩集群节点。
监控与告警(SLO/SLI/SLA,Prometheus+Grafana)
题目 1(基础):
SLO、SLI、SLA 含义?
答案:
- SLI(Service Level Indicator):服务级别指标,如延迟、错误率;
- SLO(Service Level Objective):服务指标目标值;
- SLA(Service Level Agreement):与用户约定的服务可用性协议,包含处罚条款。
题目 2(场景题):
如何监控微服务性能并触发告警?
答案:
- 使用 Prometheus 收集指标(CPU、内存、请求延迟、错误率);
- Grafana 可视化,创建仪表盘;
- 设置 Alertmanager 告警规则,触发短信/邮件/钉钉通知;
- 可结合自动伸缩策略缓解高负载。
题目 3(考点延伸):
微服务可观测性与单体系统有何不同?
答案:
- 微服务分布式,链路复杂,需要分布式追踪;
- 指标、日志、追踪需集中采集;
- 故障定位需支持跨服务调用分析;
- SLA/SLO 监控粒度更细。
