DNS 域名解析步骤是什么
当用户在浏览器输入:
java
www.baidu.com
浏览器并不知道服务器 IP,需要先进行 DNS 解析
java
浏览器缓存
→ 操作系统缓存
→ 本地域名服务器(LDNS)
→ 根域名服务器
→ .com 顶级域名服务器
→ baidu.com 权威 DNS
→ 返回 IP
浏览器会先查本地缓存,再查本地域名服务器,递归找到权威 DNS 返回 IP,之后客户端再通过 TCP 和 HTTPS 与服务端建立连接。
多个Docker之间如何通过域名访问
其实本质上:
Docker 内部自带了一套 DNS 服务。
所以:
同一个 Docker Network 下
容器名 = 域名
可以直接互相访问。
Docker 在同一个网络下会自动维护内部 DNS。
容器之间可以直接通过"容器名"通信,不需要写死 IP。
所以在微服务或者多容器场景里,通常使用容器名作为服务域名。
为什么不能直接用 IP
Docker 容器 IP 会变化
比如:
- 重启容器
- 重新部署
- 扩缩容
JWT 编码解码方案
JWT 是什么
一种"无状态"的用户认证方案。由 Header、Payload、Signature 三部分组成
Header 描述算法,Payload 存用户信息,Signature 用于防篡改(载荷部分不加密)
它常用于:
- 登录认证
- 微服务鉴权
JWT 为什么出现
JWT 最大优势是不依赖服务端 Session,非常适合微服务和分布式系统
但它也有缺点,
- Payload 只是 Base64 编码,并不是加密,所以不能存敏感数据。
- 主动失效比较困难,所以工程上通常会结合 Redis过期机制
对未来AI的看法
我认为未来 AI 一定会越来越像"基础设施",就像现在的数据库、中间件、云服务一样,逐渐成为软件系统的一部分。
目前的大模型已经具备很强的通用能力,但真正的难点其实已经不只是"模型本身",而是如何把 AI 工程化落地。
比如我现在自己在做的 RAG 和 Agent 项目里,我会发现真正复杂的部分其实是:
- 知识检索质量
- 多轮上下文管理
- Agent 工作流设计
- 工具调用
- 幻觉控制
- 限流与稳定性
- 成本控制
- 可观测性
而不仅仅是"调 Prompt"。
所以我觉得未来会越来越偏向:
AI + 工程化
而不是单纯"会用模型"。
我不认为 AI 会完全替代开发,而是会改变开发方式。
未来开发者可能更多是:
- 设计系统
- 管理 Agent
- 做工程治理
- 做 AI 能力编排
AI 更像一个"能力放大器"。
所以我现在也在往:
- AI 工程化
- Agent 系统
- RAG 架构
这些方向学习。
如果面试官继续追问
你觉得 AI 最大问题是什么?
- 幻觉
- 成本问题
- 工程稳定性
HTTPS 握手
这个其实就是想问你HTTP升级为HTTPS之后密钥的传输是如何进行的
HTTPS 本质是 HTTP + TLS
TLS 握手阶段会先通过非对称加密安全交换会话密钥,后续真正的数据传输再使用对称加密,因为对称加密性能更高。
同时 HTTPS 通过 CA 证书验证服务器身份,防止中间人攻击。
它主要解决了数据传输中的窃听、篡改以及身份伪造问题。
后端接口优化:如何设计一个好的接口
- 接口路径设计清晰
java
GET /api/users/{id} 查询用户
POST /api/users 新增用户
PUT /api/users/{id} 修改用户
DELETE /api/users/{id} 删除用户
- 统一请求和响应格式
java
{
"code": 200,
"message": "success",
"data": {},
"traceId": "xxx"
}
- 参数校验
java
@NotNull
@NotBlank
@Size
@Valid
-
幂等性设计
-
安全性设计
java
登录鉴权 JWT / Session
权限校验 RBAC
接口限流
参数防篡改
敏感字段脱敏
防 SQL 注入
get,post请求的区别(域前请求)
GET 和 POST 最大区别在于 HTTP 语义不同。
GET 一般用于查询资源,强调幂等和可缓存;POST 一般用于提交数据,通常非幂等。
GET 参数通常放在 URL 中,而 POST 一般放在 Body 中。
另外 GET 通常会被浏览器缓存,而 POST 默认不会。
常见接口攻击
SQL 注入,暴力刷接口,越权访问,文件上传漏洞
HTTP 协议里的缓存
减少网络请求
降低服务器压力
提升响应速度
什么是深分页问题
一般指:
LIMIT offset, size
里的:
offset 特别大
比如:
SELECT *
FROM user
LIMIT 100000,10;
为什么深分页慢
很多人以为:
直接跳到100000
其实不是。
MySQL 实际:
会先扫描前100000条
再丢弃
最后返回10条
深分页优化方案
基于主键范围分页
不推荐
limit 100000,10
推荐
记录上一页最大 ID:
SELECT *
FROM user
WHERE id > 100000
LIMIT 10;
为什么快
因为:
直接走主键索引范围扫描
不需要丢弃大量数据。
MySQL 索引有哪些类型
主键索引
普通索引
联合索引
唯一索引
覆盖索引
JVM的垃圾回收机制(GC)
JVM 自动回收"不再使用的对象"
垃圾回收如何判断对象死亡
可达性分析+引用计数
jvm使用的是可达性分析
什么是 GC Roots
GC 会从:
GC Roots
开始向下找。
如果对象:
不可达
说明:
可以回收
常见垃圾回收器
G1,CMS
垃圾清理算法有哪些
标记清理,复制算法,标记整理,分代清理
如何排查内存泄漏
内存泄漏的典型表现是:
java
Full GC 越来越频繁
老年代使用率持续升高
GC 后内存降不下来
最终 OOM
Full GC
Full GC 是对整个 JVM 堆进行垃圾回收,包括新生代和老年代。
它通常会触发较长时间的 Stop The World,所以线上影响比较大
1.看 GC 情况
重点看:
OU:老年代使用率
FGC:Full GC 次数
FGCT:Full GC 总耗时
2. 导出堆快照
然后用VisualVM进行分析
3.看哪些对象占内存最大
找到:
谁占用内存最多
谁持有了这些对象
为什么 GC 回收不了
4.看 GC Roots 引用链
常见内存泄漏原因
1. 缓存没有淘汰
java
static Map<String, Object> cache = new HashMap<>();
一直 put,不清理
