面试岗位为:Java 后端开发实习生
面试时长:30分钟
面试时间:2023年11月10日
- 首先介绍一下项目吧
这里介绍时有一个失误,没有主动把屏幕共享给打开,因为我在面试之前已经在 processon
上画好了项目的流程图,如果把屏幕共享打开的话,给面试官介绍着,会让面试官更容易理解,这个很重要!一定记着用流程图给面试官介绍!
我的两个项目分别是:手写 rpc(Guide哥) 和 API 网关项目(小傅哥),介绍项目时,就介绍一下项目的流程,还给面试官介绍了一下目前在校跟随实验室做项目,有自己校内的也有接的外部的项目
- rpc 是什么?为什么要使用 rpc 通信框架呢?
rpc 是远程过程调用,使用 rpc 是因为 rpc 比较快,使用 rpc 可以自己定义传输协议(tpc协议),避免传输无用的数据,可以有效减少报文体积并且 rpc 是基于二进制流进行传输的,http 是基于文本、json 串
(后边查完资料补充:rpc 通信框架都自带了负载均衡,并且服务上线下线可以做到自动通知,不影响上游调用者,而 http 需要配置 nginx 来实现负载均衡,并且如果新添加/修改 http 请求,需要修改 nginx 配置)
- 什么情况下使用 rpc 呢?
在多个微服务之间使用 rpc 进行调用
(查完资料补充:rpc 一般用于分布式系统中,常用于内部调用,当项目太大,需要解耦服务时,可以使用 rpc 解决服务之间的调用问题)
- 如果此时新增一个服务,需要怎么做可以让其他服务进行调用?
新增一个服务的话,就将服务给注册到 Zookeeper 中去,会根据服务的全限定类名作为一级节点,将该服务的 Netty 通信地址作为一个二级节点存储在全限定类名下,也就是在 com.zqy.test.HelloServiceImpl
下可以有多个节点提供服务,比如192.168.1.1:8000, 192.168.1.2
,那么在其他服务需要调用时,就去 zookeeper 中查询这个节点,以及拿到该节点下的通信地址,并且进行负载均衡
拿到最终需要进行通信的地址。
(这里本来是想说负载均衡使用了源地址哈希,让客户端多次调用可以访问到同一个 rpc 服务,可以建立有状态的会话)
- 鉴权如何做了?
使用 jwt+shiro 进行实现,当请求 API 网关时需要携带 jwt token
,鉴权时会通过 shiro 进行认证操作,通过 subject.login()
之后在 Realm 对 jwt token
进行解码,如果报错了,说明认证失败,拒绝进行后边的操作即可
上边是项目相关的,接下来问了解过 Java 的源码吗?
我说了解过 HashMap 的源码,这一段时间其实一直准备 Redis、MySQL、Netty 相关的面试题,Java 基础的一些源码还没有准备,所以面试 Java 实习生、校招时,一定先把 Java 基础的内容准备好,其实在面试时,距离上次学习 HashMap 面试题已经过去快半年了,基本上忘记完了,在 HashMap 上被拷打了快二十分钟,正常面试就结束了,HashMap 问的有下边几个问题,明天会整理一篇 HashMap 面试题详细的文章出来:
- HashMap 底层结构
- 怎么计算 HashMap 添加元素时的下标呢?
- HashMap 怎么 put 元素?
- 什么时候会扩容呢?
- HashMap 线程安全吗?举一个不安全的例子?
- 如果想保证线程安全的话,该如何做呢?
- ConcurrentHashMap 怎么做的呢?