菜鸟一面
菜鸟实习生校招
首先:回答问题的时候不要表现得像在背八股文一样,眼睛瞟着一边做出思考的样子,非常像在背八股文。简历上的每一个条目都要弄懂,并且要思考为什么要用这个东西,比如阿里云(用他的优势是什么,为什么不用华为云)。
- 自我介绍:老师您好!我叫fred,…..
- 项目:三个项目中你觉得最有意思的项目是哪个(意思是你最熟悉哪个),答RPC。
- 讲一下RPC
- 远程过程调用(Remote Procedure Call),两个不同的服务器上的服务提供的方法不在同一个内存空间,通过RPC可以帮我们调用某个远程服务器上服务的某个方法,这个过程就像本地调用一样简单,同时我们不需要关注底层网络编程的具体细节。
- RPC原理:①客户端、②客户端stub(代理类)主要做的事情很简单,就是把你调用方法、类、方法参数等信息传递到服务端、③网络传输(socket、Netty、Jetty)、④服务端stub(指接收到客户端执行方法的请求后,去执行对应的方法然后返回结果给客户端的类)、⑤服务端
- 本RPC项目的结构:
- Netty是什么
- Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。
- Netty相比于其他网络传输优势在哪?
- API使用简单,学习成本低。
- 功能强大,内置了多种解码编码器,支持多种协议。
- 性能高,对比其他主流的NIO框架,Netty的性能最优。
- 社区活跃,发现BUG会及时修复,迭代版本周期短,不断加入新的功能。
- Dubbo、Elasticsearch都采用了Netty,质量得到验证。
- Netty如何实现长连接,为什么不用短连接要用长连接,心跳包的收发过程。
- 减少连接建立和断开的开销: 建立和断开连接都需要消耗资源,包括网络带宽、CPU 时间和内存等。使用长连接可以减少这些开销,因为连接在一段时间内保持打开状态,而不需要频繁地进行建立和断开操作。
- 提高性能和效率: 长连接可以减少因连接建立和断开所带来的延迟,从而提高数据传输的效率和性能。特别是对于实时通信、推送服务等应用场景,长连接能够更快地实现消息的实时传输。
- 实现长连接的关键在于保持连接的活跃状态,以防止连接由于长时间没有数据传输而被关闭。在实际应用中,通常会采用心跳机制来维持连接的活跃状态。心跳包是定期发送的小型数据包,用于检测连接的状态和保持连接的活跃性。
- TCP/IP三次握手,四次挥手:见小林coding
- 序列化是什么,有哪些序列化方式,为什么用kryo,不用其他的
- 序列化:把对象转化为可传输的字节序列过程称为序列化。
- 序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。
- 因为我们单方面的只把对象转成字节数组还不行,因为没有规则的字节数组我们是没办法把对象的本来面目还原回来的,所以我们必须在把对象转成字节数组的时候就制定一种规则(序列化),那么我们从IO流里面读出数据的时候再以这种规则把对象还原回来(反序列化)。
- 序列化的方式:JDK(不支持跨语言)、JSON、XML、Hessian、Kryo(不支持跨语言)、Thrift、Protobuff、FST(不支持跨语言)
- kryo优势:高性能,序列化后数据量小,速度快,灵活性强,支持自定义序列化器
- 基于Json的序列化器缺陷:某个类的属性反序列化时,如果属性声明为Object,就会造成反序列化出错, 会把Object类型反序列化成String类型,并且,JSON 序列化器是基于字符串(JSON 串)的,占用空间较大且速度较慢。
为什么要把对象序列化成二进制发送,不序列化可以发送吗,一定要序列化成二进制吗
同步阻塞调用
git的rebase操作
TreadLocal
深拷贝和浅拷贝:
- 浅拷贝创建一个新对象,但新对象内部的元素是对原始对象中元素的引用。也就是说,新对象与原始对象共享子对象或属性(共享同一块内存)。
- 深拷贝创建一个新对象,并递归地复制所有子对象或属性。新对象与原始对象完全独立,修改新对象不会影响原始对象。
无锁队列
中序遍历应用场景
一个请求从前端到后端的执行流程
线程池的参数
总结:先搞清楚简历上的每一个关键词,并延伸,多思考为什么这么做,而不是这个东西的原理,比如使用kryo相比于JSON序列化的优势,之后再补充
菜鸟一面
https://payfish.github.io/2024/04/23/菜鸟一面/