面试题手册

梳理高频技术问题,帮助你按主题复习和查漏补缺。

服务端阅读 05月29日 22:48

常见的 DNS 记录类型有哪些?各自什么作用?

7 种必知记录:A——域名→IPv4 地址;AAAA——域名→IPv6 地址;CNAME——域名→另一个域名(别名);MX——邮件服务器地址+优先级;NS——指定域名的权威 DNS 服务器;TXT——任意文本(SPF/DKIM/域名验证);SOA——主权威服务器信息+序列号+TTL。辅助记录:SRV(指定服务端口和主机)、PTR(反向解析 IP→域名)、CAA(指定允许的证书颁发机构)。追问CNAME 和 A 记录能共存吗?不能。同一域名要么 CNAME 要么 A。CNAME 意味着这个域名完全由目标域名定义,再设 A 记录就矛盾了。但子域可以:example.com 用 A,www 用 CNAME 指向 example.com。MX 优先级数字越小越优先吗?是的。优先级 10 的比 20 的先尝试。常用配置:主服务器优先级 10,备用 20。TXT 记录的 SPF 怎么写?v=spf1 include:_spf.google.com ~all——允许 Google 邮件服务器代发,其他标记为软失败。~all=软失败,-all=硬拒绝,+all=全部允许(别用)。SOA 记录的序列号有什么用?从 DNS 服务器用序列号判断 zone 是否更新——序列号变大则拉取新数据。常用格式:YYYYMMDDNN。改了 zone 文件必须递增序列号。SRV 记录什么时候用?指定某服务运行在哪台机器的哪个端口。SIP/LDAP/Kerberos 等协议用 SRV 发现服务器。HTTP 不用 SRV(浏览器不支持)。
服务端阅读 05月29日 22:48

如何监控 DNS 服务的性能和可用性?

三层监控:可用性(能否解析)用 dig/nslookup 定时探测;性能(解析耗时)用 dig +stats 看 Query time,P99 超阈值告警;正确性(解析结果是否正确)对比实际 IP 和预期 IP。工具:Prometheus + Blackbox Exporter 做探测采集,Grafana 展示,Alertmanager 告警。关键指标:解析成功率、平均/P99 延迟、NXDOMAIN 比例(异常高可能是 DNS 劫持)、缓存命中率。追问Blackbox Exporter 怎么配 DNS 探测?prometheus.yml 中配 job:modules: [dnstcp],targets: [8.8.8.8]。用 dnsprobedurationseconds 画延迟图,probe_success 画可用性。如何区分 DNS 服务故障和网络故障?同时监控 ICMP ping 延迟和 DNS 解析延迟。ping 正常但 DNS 超时=DNS 服务问题。ping 也超时=网络问题。多节点探测可定位故障范围。缓存命中率怎么监控?CoreDNS 暴露 corednscachehitstotal 和 corednscachemissestotal,命中率 = hits/(hits+misses)。命中率低说明穿透到上游太多,考虑增大缓存或调 TTL。DNS 监控的告警阈值怎么设?可用性 100ms 告警(正常内网 < 10ms,公网 < 50ms)。NXDOMAIN 比例突增告警。按实际基线调整。如何监控 DNS 劫持?对比多个 DNS 服务器对同一域名的解析结果,不一致则可能被劫持。用 DNSSEC 验证签名。监控 NXDOMAIN 比例突增。
服务端阅读 05月29日 22:48

DNS 在微服务架构中怎么做服务发现?

DNS 服务发现就是用域名代替硬编码 IP:服务 A 调用 service-b.namespace.svc.cluster.local,DNS 返回 service-b 的 IP。Kubernetes 内置 CoreDNS 实现了这套机制——每个 Service 自动注册 DNS 记录。优点:零代码改造、语言无关、兼容现有 HTTP 客户端。缺点:DNS 缓存导致服务上下线有延迟(默认 TTL 30s)、无法做健康检查和负载均衡策略定制。追问DNS 服务发现和 Consul/Nacos 有什么区别?DNS 发现只做域名→IP 映射,无健康检查、无权重路由、无配置中心。Consul/Nacos 是专用服务发现:实时健康检查、权重负载均衡、灰度发布、配置热更新。K8s 中小规模用 DNS 足够,大规模+精细化流量管理用 Istio/Consul。DNS 缓存导致服务下线延迟怎么办?缩短 TTL(K8s CoreDNS 默认 5s)+ 客户端缩短 DNS 缓存时间。根本方案:配合 K8s 就绪探针,Pod 先标记 NotReady 再优雅关闭。Headless Service 和普通 Service 有什么区别?普通 Service 分配 ClusterIP,DNS 返回 VIP。Headless Service 不分配 VIP,DNS 直接返回所有 Pod IP——客户端自己做负载均衡。适合 StatefulSet 场景。跨命名空间的服务发现怎么写?service-b.other-namespace.svc.cluster.local,完整 FQDN 指定命名空间。同命名空间可简写 service-b。DNS 服务发现能做金丝雀发布吗?单独用 DNS 不行——DNS 只能返回一组 IP,无法按比例分配流量。需要 Istio VirtualService 或 Deployment 配合 label selector 切换版本。
服务端阅读 05月29日 22:48

cURL 如何发送和接收 JSON 数据?

发送 JSON:curl -X POST URL -H "Content-Type: application/json" -d '{"key":"value"}'。必须加 Content-Type 头,否则服务器按 form-data 解析。单引号包裹 JSON 防 shell 解析双引号。接收 JSON:curl -s URL | jq . 格式化输出,或 jq .field 提取字段。从文件发送:-d @data.json。追问单引号里怎么写单引号?Shell 中单引号不能嵌套。方案:把 JSON 写进文件用 -d @body.json(最推荐);混引号;或用双引号+转义。jq 常用操作有哪些?格式化:jq .;提取字段:jq .name;数组过滤:jq '.[] | select(.status=="active")';计数:jq length;构造新对象:jq '{name: .user}';jq -e 让 false/null 返回 exit code 1。如何验证 JSON 响应是否符合预期?curl -s URL | jq -e '.status==200 and .data.id != null'——条件为 true 输出 true 且 exit 0,为 false 输出 false 且 exit 1。更复杂的验证用 JSON Schema:ajv validate -s schema.json。PATCH 请求发 JSON 局部更新怎么写?curl -X PATCH URL -H "Content-Type: application/json" -d '{"name":"new name"}'。只传要改的字段。需确认 API 支持PATCH 语义——有些 API 的 PATCH 实际是 PUT 行为。如何发送 JSON 数组?curl -X POST URL -H "Content-Type: application/json" -d '{"items":[{"id":1},{"id":2}]}'。批量操作 API 常用这种格式。
服务端阅读 05月29日 22:48

cURL -X 参数什么作用?PUT/DELETE/PATCH 怎么用?

-X 指定 HTTP 方法,默认 GET。-X POST/PUT/DELETE/PATCH 分别发送对应请求。POST 提交数据用 -d;PUT 全量更新用 -X PUT -d data;DELETE 删资源用 -X DELETE;PATCH 局部更新用 -X PATCH -d partial_data。注意:-d 默认就是 POST,-X POST 可省略。但 PUT/DELETE/PATCH 必须显式指定 -X。追问-X POST 和 -d 有什么区别?-d 发送 POST body 数据,自动设 Content-Type: application/x-www-form-urlencoded。只有 -d 没有 -X 时 cURL 自动用 POST。-X POST 只改方法不改 body,需配合 -d。怎么发 JSON 格式的请求?加 -H "Content-Type: application/json" -d '{"key":"value"}'。不加 Content-Type 服务器可能按 form-data 解析。单引号包裹 JSON 防 shell 解析双引号。PUT 和 PATCH 实际区别?PUT 全量替换——传整个对象,没传的字段被清空。PATCH 局部更新——只传要改的字段。API 设计规范遵循这个语义。DELETE 请求能带 body 吗?技术上可以但 RFC 不推荐。需要带条件的删除用 URL 参数:DELETE /api/users/123?force=true。幂等性是什么?多次调用结果一样。GET/PUT/DELETE 幂等,POST/PATCH 非幂等。PUT 幂等因为每次全量覆盖到同一状态。
服务端阅读 05月29日 22:48

cURL 如何处理 HTTPS 和 SSL/TLS 证书验证?

默认 cURL 验证 SSL 证书(CA 证书+域名匹配+有效期),验证失败报 SSL certificate problem。跳过验证:-k 或 --insecure(仅测试用,生产禁用)。指定 CA 证书:--cacert /path/to/ca.pem。客户端证书(mTLS):--cert client.pem --key client.key。指定 TLS 版本:--tlsv1.2 或 --tlsv1.3。查看证书信息:curl -vI URL 2>&1 | grep SSL。追问为什么 -k 不安全?-k 跳过证书验证 = 不验证服务器身份,中间人可以伪造任何 HTTPS 站点。你在 -k 模式下输入的密码/Token 全部暴露。仅用于测试环境和自签名证书。自签名证书怎么正确处理?把自签名 CA 导入系统信任库,或用 --cacert 指定自签名 CA 文件。这样 cURL 正常验证而不需要 -k。mTLS 是什么场景?双向 TLS:服务器验证客户端证书+客户端验证服务器证书。企业 API 网关、K8s apiserver、零信任网络常用。如何查看证书链和过期时间?curl -vI URL 2>&1 | grep -E "subject:|expire:|issuer:"。或用 openssl s_client。TLS 1.2 和 1.3 有什么区别?1.3 握手从 2-RTT 降到 1-RTT,移除了不安全的密码套件,强制前向保密。cURL 7.54+ 支持 TLS 1.3。
服务端阅读 05月29日 22:48

DNS 解析失败怎么排查和解决?

四步排查:1.确认是否 DNS 问题——ping IP 能通但 ping 域名不行 = DNS 问题;2.定位故障环节——dig +trace 逐级查询看卡在哪一级;3.检查本地——resolv.conf 配置、本地 DNS 缓存、hosts 文件覆盖;4.检查网络——防火墙是否封 UDP 53。常见原因:DNS 服务器宕机、TTL 过期记录被删、CNAME 指向不存在的域名、防火墙拦截。追问dig 和 nslookup 有什么区别?dig 输出详细(TTL、权威服务器、耗时),支持 +trace 逐级追踪。nslookup 交互式,输出简洁但信息少。排查问题优先 dig。NXDOMAIN 和 SERVFAIL 有什么区别?NXDOMAIN = 域名不存在(权威服务器明确说没有),SERVFAIL = 服务器故障(超时/拒绝/DNSSEC 验证失败)。前者是正常响应,后者需要排查。DNSSEC 验证失败怎么办?检查 DS 记录是否正确发布、DNSKEY 是否轮换但 DS 未更新、系统时间是否正确。临时绕过:dig +nodnssec,不推荐生产环境。内网 DNS 解析失败但公网正常?检查内网 DNS 是否配了 forwarders、内网 zone 文件是否正确加载、是否有 Split DNS 配置不一致。常见坑:忘了配反向解析 PTR。移动端 DNS 解析失败怎么排查?切换 WiFi/蜂窝确认是否特定网络问题。运营商 DNS 劫持/过滤很常见,换 8.8.8.8 或 1.1.1.1 排除运营商问题。
服务端阅读 05月29日 22:48

Service Worker 的生命周期有哪些阶段?

四个阶段:注册(register)→ 安装(install)→ 等待(waiting)→ 激活(activate)→ 运行中。register 触发下载 SW 文件,install 事件中预缓存资源,install 成功后进入 waiting 等待旧 SW 退出,activate 时清理旧缓存。跳过等待:skipWaiting() 让新 SW 立即激活,clients.claim() 立即接管页面。默认不跳过——已打开的页面继续用旧 SW 直到关闭。追问为什么要有 waiting 阶段?安全考虑。已打开的页面可能依赖旧 SW 的缓存结构,强制切换可能导致缓存未命中白屏。waiting 确保所有旧页面关闭后才切换。skipWaiting 什么时候该用?紧急修复(如缓存 bug 导致白屏)时用。常规更新不建议——如果新 SW 的缓存 key 和旧的不同,skipWaiting 后页面可能加载失败。SW 什么时候会被销毁?空闲约 30 秒后浏览器自动终止 SW 线程节省内存。下次 fetch/push/sync 事件再唤醒。所以 SW 里不要用全局变量存状态——唤醒后变量重置。持久状态存 IndexedDB。页面关闭后 SW 还活着吗?可能活着(有 push/sync 事件时),也可能被终止。不能假设 SW 常驻。注册失败怎么排查?检查:SW 文件路径是否正确、是否在 HTTPS 下(localhost 例外)、SW 文件是否有语法错误、scope 是否覆盖目标页面。DevTools Application > Service Workers 面板会显示错误。
服务端阅读 05月29日 22:48

cURL 支持哪些协议?FTP/SFTP 怎么用?

cURL 支持 20+ 协议:HTTP/HTTPS/FTP/SFTP/SCP/SMTP/IMAP/LDAP/RTSP 等。FTP 上传:curl -T local.txt ftp://server/remote.txt --user user:pass。SFTP 下载:curl sftp://server/file.txt --user user:pass -o local.txt,用 --key ~/.ssh/id_rsa 指定私钥。SFTP 比 FTP 安全,FTP 明文传输密码不推荐生产使用。追问FTP 和 SFTP 有什么区别?FTP 明文传输(密码和数据都裸奔),端口 21+20。SFTP 基于 SSH 加密,端口 22。FTPS 是 FTP+TLS。新项目一律用 SFTP。如何断点续传?下载续传:curl -C - -O URL(自动检测断点)。上传续传:curl -C - -T file ftp://server/。HTTP 不支持续传上传。如何列 FTP 目录?curl ftp://server/path/ --user user:pass(尾部斜杠表示列目录)。加 -l 只列文件名。cURL 和 scp 命令的区别?scp 语法简单(scp file user@host:path),cURL 支持多协议和断点续传。scp 更直观,cURL 更灵活。如何批量上传文件?用 glob:curl -T "file[01-99].txt" ftp://server/dir/。或 shell 循环。大文件加 --limit-rate 1M 限速。
服务端阅读 05月29日 22:48

cURL 如何处理 HTTP 认证?Basic Auth/Bearer/OAuth 怎么用?

三种认证:Basic Auth——curl -u user:pass URL(密码明文 base64 编码必须配合 HTTPS);Bearer Token——curl -H "Authorization: Bearer TOKEN" URL;OAuth 2.0——先 curl token 端点拿 access_token,再带 token 请求 API。cURL 无内置 OAuth 流程,需手动实现 token 获取和刷新。追问-u 和 -H Authorization 有什么区别?-u user:pass 自动生成 Authorization: Basic 头,更简洁。-H 手动写原始头,适合精确控制。安全做法:用环境变量 -u user:$API_KEY 避免密码出现在 shell history。Bearer Token 过期了怎么刷新?脚本模式:先 curl refreshtoken 端点拿新 accesstoken,替换环境变量,再请求 API。生产建议用 SDK 自动刷新。OAuth 2.0 授权码流程怎么用 cURL 实现?分三步:1.浏览器访问授权 URL 手动授权拿 code;2.curl -X POST token-url 换 token;3.curl -H "Authorization: Bearer TOKEN" 请求资源。第 1 步必须浏览器完成。API Key 和 Bearer Token 有什么区别?API Key 是静态字符串,不过期除非手动轮换。Bearer Token 有过期时间,由 OAuth 签发,可精细控制权限范围(scope)。API Key 适合服务间调用,Bearer Token 适合用户级授权。.netrc 文件有什么用?存储登录凭证:machine api.example.com login user password pass。cURL 加 -n 自动读取,不用 -u 传密码。chmod 600 保护文件权限。