昨天进行了一次面试,但是问到的基本没有八股,反而是一些其他很实际的问题,回答的不是很好。

QAQ,经验确实是少了。

TCP 协议

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议。

它主要特点有:

  1. 面向连接
    在传输数据之前需要先建立连接。
  2. 可靠传输
    通过确认应答机制、序列号机制、重传机制来保证数据不丢失、不重复、不乱序。
  3. 有序传输
    通过序列号保证数据按顺序到达。
  4. 流量控制
    通过滑动窗口机制控制发送速率,避免接收方处理不过来。
  5. 拥塞控制
    通过慢启动、拥塞避免等机制避免网络拥堵。

三次握手与四次挥手

三次握手用于建立可靠连接:

  1. 客户端发送SYN请求。
  2. 服务端返回SYN+ACK确认。
  3. 客户端发送ACK确认,连接建立。

四次挥手用于断开连接:

  1. 主动方发送FIN请求。
  2. 被动方返回ACK确认。
  3. 被动方发送FIN请求。
  4. 主动方返回ACK确认,连接断开。

前后端的交互流程

  1. 用户在浏览器操作页面,比如点击按钮或提交表单。
  2. 前端通过 Ajax 或 fetch 发送 HTTP 请求到后端接口。
  3. 请求会携带参数,请求方式可能是 GET 或 POST。
  4. 后端 Controller 接收到请求后,调用 Service 处理业务逻辑。
  5. Service 调用 Mapper 操作数据库。
  6. 处理完成后,后端返回 JSON 数据给前端。
  7. 前端接收到响应后,更新页面数据,实现动态渲染。

这里吐槽一下自己太紧张,后端的详细过程都没说出来,前端倒是说差不多了,后端 4-5 步都给略过去了

域名解析的过程

  1. 浏览器先查询本地 DNS 缓存:如果缓存中有对应的 IP 地址,就直接使用。
  2. 查询操作系统缓存
  3. 查询本地 hosts 文件
  4. 如果都没有命中,则向本地 DNS 服务器发起查询(通常是运营商提供的 DNS)。
  5. 本地 DNS 服务器开始递归查询:
    • 先查询根域名服务器
    • 再查询顶级域名服务器(如 .com)
    • 再查询权威域名服务器
    • 最终获得目标服务器的 IP 地址
  6. 本地 DNS 将结果返回给浏览器,并缓存起来。
  7. 浏览器拿到 IP 地址后,开始和服务器建立 TCP 连接。

多应用共 ip 的路由逻辑

如果使用不同端口,操作系统通过端口号将请求分发给不同进程。
如果共用同一个端口,则通过 HTTP 请求头中的 Host 字段进行区分,Web 服务器根据域名匹配对应应用,这种方式称为虚拟主机。

讲一下 JWT 的流程

  1. 用户输入账号密码登录
  2. 后端验证成功后生成 JWT
  3. 将 Token 返回给前端
  4. 前端保存 Token(一般放在 localStorage)
  5. 之后每次请求在请求头中携带 Token
  6. 后端通过拦截器解析 Token 并验证合法性

这个是因为我简历里写了,然后说了一下… 后面还被吐槽,你都用 redis 了还用这玩意…
也确实,我自己除了第一次做项目,后面也没用过。结束后默默的从简历里删除了 JWT

有MySQL 了为什么还要用Redis

MySQL 主要用于数据的持久化存储,而 Redis 是基于内存的缓存数据库,读写速度更快。
在高并发场景下,如果所有请求都直接访问 MySQL,会给数据库带来较大压力。
使用 Redis 作为缓存,可以减少数据库访问次数,提高系统性能和响应速度。

这里我又紧张了,说成了请求次数,被狠狠指出来了

Java线程池的作用

线程池的作用是管理和复用线程,避免频繁创建和销毁线程带来的性能开销,从而提高系统性能和稳定性。

业务价值

线程池的业务价值在于提升系统并发处理能力、提高接口响应速度、控制资源使用,避免因线程过多导致系统崩溃,从而提高系统稳定性。

具体忘了问什么了,大概是这方面

线上运行的java应用,如何在终端查看报错日志

一般线上 Java 应用都会把日志输出到日志文件中,比如 logs 目录下的 xxx.log 文件。
可以通过 Linux 命令查看日志,比如使用 tail、cat 或 less 命令。

一般使用 tail 和 grep 直接查看错误日志