hello,大家好,我是lrk。
我是2021年十月跳槽的,这篇面经拖了这么久,也是很不好意思。
先简单自我介绍一下吧,我是94年出生,2017年从一所物理专业本科院校,毕业之后去了一家通信公司做运维管理后台,一做就是四年。
是很漫长的四年啊,要不是遇到老师,可能也就在那家公司如此下去了。

学习经历

2.1 儒猿前的学习
在遇到儒猿之前,我其实私底下也有很努力的学习。但是由于找不到门路,蒙头瞎学,时间花了很多但是收效甚微,出去面试更是颗粒无收。我记得我第一年工作的时候,热情高涨,对着一本《自己动手写Java虚拟机》,猛敲代码,将作者用go语言实现的JVM系统,自己用Java实现了一遍。
(找了一下,竟然还被我找到了,这是地址 https://github.com/lrklrk1/JINJVM.git
这本书我这里还是推荐大家去看看,有空可以敲一敲,对实际工作未必有真正的帮助,但是能让大家对编码&代码运行有个粗浅的理解。

2.2 学习的儒猿专栏
我一开始是先学的面试突击第一季,JVM,后来学的MySQL,然后是亿级流量,后面才看的面试突击二三季。
至于再后来出的一些课程,因为我加入架构班,也就没有学了。
这里提一句,现在儒猿专栏新出的课程我都有在看的, 真的质量很高,认认真真学啊,同学们。吹水十分钟,不如学习五分钟。
2.3 架构班学了哪些课程
1、全网稀缺的 Maven 讲解:Maven 企业级实战
2、全网稀缺的 Git 讲解:Git 企业级实战
3、从 0 开始开发 10w 行代码的电商系统
4、Spring Cloud Netflix 源码深度剖析
5、企业级分布式锁原理剖析与开源框架源码剖析
6、企业级分布式事务原理剖析与开源框架源码剖析
7、并发、网络、Netty源码
8、自研分布式海量小文件存储系统
9、ZooKeeper 分布式协调系统的架构设计与源码剖析
10、支撑每日 10 亿数据量的 Kafka 内核原理剖析
11、Kafka 架构设计与内核源码深度剖析

3、面试公司和结果
我面试的公司不算多,准备好出去面试之后,先面了一些小公司,大华,海康之类。这些公司没有什么难度,海康我面到二面就不去面了, 真的没有什么技术。
后来面了网易,最终拿了offer,然后面了阿里的淘系营销部门,也顺利拿到了offer。
面试公司也是很浪费精力的,如果对自己的技术比较自信的同学,完全可以从中型互联网公司开始面起。

面试题

我觉得大华,网易和阿里三家公司面试还是很有自己特点的。
大华的面试比较偏八股,网易比较偏向基础,阿里偏向项目。

大华面试题

一面:
(1) 项目相关:
1、说一下你的项目 什么是最终一致性
2、怎么通过kafka + zk保证最终的一致性
3、一致性方案当中,用到的是zk的什么节点
4、怎么保证顺序消费kafka
5、怎么保证在不同的partition中消费也是顺序的
6、怎么不丢失消息
7、怎么不重复发送消息

(2)并发相关:
1、vloatile原理:可见性,顺序性
2、AQS原理,如何加锁,入队,如何顺序唤醒,什么是condition,怎么notify

(3)mysql InnoDB相关:
1、 说下事务是怎么做的?
2、 一个插入语句具体怎么做的?
3、一个修改语句具体是怎么做的?
4、undo log有什么用、redo log有什么用 、binlog有什么用
5、有哪些锁,分别是什么时候用的
6、什么是mvcc,什么是快照读,什么是当前读

(4)spring cloud相关:
1、用过哪些组件
2、feign与restTemplate的区别
3、eureka server的底层原理
4、feign的原理
5、如果eureka server挂了,还能够继续进行微服务间调用嘛
6、分布式事务: byte tcc之外还有哪些分布式事务框架

(5)Spring Boot相关:
1、Spring Boot启动原理

(6)Reids Cluster相关:
1、主备复制原理 主数据未同步到备上,主就挂了,数据丢失怎么办?

(7)GC相关:
1、有哪几种GC G1和CMS的区别
2、怎么设置的GC
3、怎么确定GC参数配比

二面:(记得的)
团队组织结构 feign的原理 开发流程规范 担任角色,做了什么,这些问题没什么好说的, 直接喷出去就好了。
由于和一面面试官聊的比较开心,后来加了微信。发现他最近也跳槽了,去了南京的阿里,成为我的同事。

网易面试题

一面:
1. 自我介绍
2. 项目介绍,最终一致性的项目遇到的问题
3. 针对项目问问题
4. 怎么做接口幂等
5. 怎么做最终一致性,完整流程
6. 做过的最高的tps是多少,如果tps如果下降了,怎么定位
7. 说一下kafka,说下你的理解
8. 怎么扩大吞吐量
9. 怎么设计一个feign
10. 讲讲你对网络编程的理解,kafka broker reactor
11. http keepalive
12. 502,bad gateway 是什么原因,怎么处理?
13. nignx了解么?

二面:
1. 自我介绍一下
2. 熟悉什么微服务框架
3. 如果要选择一个注册中心,怎么选择?
4. 使用zk和eureka做注册中心,有什么区别
5. AP,CP怎么做到的,详细说说
6. 什么是Feign,为什么要Feign,如果没有Feign有什么问题
7. 抛开Ribbon,Eureka Server自己有负载均衡的方式么
8. Ribbon有哪几种负载均衡策略
9. 看过哪些源码?
10. 对Redis了解么,有基于兴趣看过Redis源码么

  1. Redis为什么快
    12. Redis在6版本之后加入了很多的异步线程机制,这对Redis的单线程工作是否有冲突呢?
    13. Redis的网络模型
    14. Reactor模型是怎么样的?
    15. 同步,非同步,阻塞,非阻塞
    16. Java和C++有个区别,就是一个实现了多继承,为什么Java不实现多继承,棱形问题是什么?
    17. Java的多态怎么理解,什么是运行时多态,什么是编译期多态
    18. Java的方法重载是什么
    19. Java的方法重写是什么
    20. 快排的最差O是什么,为什么
    21. 什么是排序时候的稳定性

三面
1. 自我介绍
2. 说一个你做的最熟悉的项目
3. 项目细节
4. 如果让你优化这个项目你会怎么做
5. 什么是Reactor模型,怎么做的
6. 看过哪些源码
7. 会不会ES
8. 有没有做过全链路监控
9. 会不会dubbo,或者其他的RPC框架代码
10. 平时都会看哪些技术方面的东西,网站,博客,关注哪些开源框架

总结:
网易一面:问题相对比较水,但是时间持续了一个多小时。主要时间是在聊kafka上,我聊的是kafka的源码实现,面试官针对kafka的一些代码细节反复的问题,这个面试官对kafka真的很熟。例如kafka的ack 1,-1,0分别是怎么实现的,会有什么影响;kafka发送端的batch细节;kakfa broker的时间轮是怎么实现的,能说出kafka内部有多少个定时调度任务,随意讲?

二面:偏向于基础,知道的就回答,不知道就说不会。

三面:对于Reactor模型,我是用ZooKeeper 3.5之后的版本之后,和客户端连接使用Reactor模型的设计,和Kafka broker的Reactor模型的设计之间的对比,差异,为什么会有这种差异,来回答的,也占了很长的时间。

阿里面试题

一面: 一个小时的面试,45分钟的项目。 项目启动时慢,刚如何优化 调用的长尾效应明显,该怎么优化
二面:
1、聊一下工作 kafka的理解,有哪些核心的功能
2、kafka的producer和consumer是如何与kafka进行交互的
3、kafka中的reactor模型是如何交互的
4、zookeeper是什么样的cap模型
5、zk实现的是什么一致性 zk的acl机制有了解么
6、full gc是什么,如何在代码层面控制full gc的发生,有哪些规约
7、spring了解么,什么是ioc
8、spring的aop是什么
9、spring的bean在初始化的时候,如果需要调用某些方法,有哪几种策略

三面: 聊了一下项目、爱看什么书、有什么发展上的困惑、对未来的期待

总结:
阿里一面二面之间还有一次笔试,一般不太难。
看到一面有45min的项目面试就知道了,项目不扎实,PASS;项目没亮点,PASS。
基础一定要打牢,基础不牢,地动山摇。
二面基本也是说的源码,以及一些设计的理解,为什么这么设计,有什么好处。最后的Spring问题,我理解就是凑时间的,随意的问了问。

笔记输出

我喜欢对一个大框架的某一部分画一张图,然后细致去看,所以图会有点多。
但都是自己画的,偶尔有错的话,请大家包涵。
6.1 ZooKeeper
Zookeeper源码其他笔记图:https://note.youdao.com/s/KIxECjVr

cacf94db922e1dcbe5874316c48108e.png
6.2 Kafka
kafka源码其他笔记图:https://note.youdao.com/s/L85WdG5w
e03c8d5ecf9d24afd5229796e36bc56.png

6.3 Spring Cloud
eureka源码图:https://note.youdao.com/s/SZXLrAEe
ribbon源码图:https://note.youdao.com/s/YYIglzQE
Feign源码图:https://note.youdao.com/s/77sXEngR
zuul源码图:https://note.youdao.com/s/VXp6H57u
Hystrix源码图:https://note.youdao.com/s/VZzLoUWA

学习方法

大家的学习方法各不相同,要以适合自己的为好。
总的来说就是提高效率,能一遍学会的东西尽量一次学会,然后面试前通过高强度的复习来巩固。

如何规划自己的时间

我是一个喜欢早起学习的人,一般6:30起床,收拾之后就去公司了。每天都是第一个到的,开灯之后开始学习。
学到大约八点之后,去吃个早饭,然后回来继续学到九点半,同事们基本都到了,开始工作。
这里早上的学习时间,大约在2个小时左右。
由于我前东家工作很轻松,真的适合划水,我就疯狂划水,画项目的架构图,一遍一遍重构;看代码,尤其是开源代码,疯狂看。

我上班时间反复看代码的这段时间,总结了一个小方法,例如说,学习ZooKeeper,你懂了核心的原理之后,可以不局限于此。去看看ZooKeeper上的提的bug(Apache有自己的bug平台),你完全可以说自己也发现了,然后在自己公司改完继续用这个版本(哪怕是将已有的fix,merge过来也可以)。
如果更强一点,去看看ZooKeeper每个版本的变更,看看是在往哪个方向进行优化,为什么这么优化,如何在保证核心逻辑稳定的同时扩充新功能的。然后反思该如何设计一个可扩展的框架的。

晚上下班之后,我就会去找个自习室,然后学习一会儿,一般是七点到十点,这里就又是三个小时。
回家之后,就赶紧收拾下睡了,不会再怎么学习了。我比较喜欢看书,偶尔会看看书什么的。
我的周六周日一般都会全部用来学习。去例如仓鼠自习室之类的地方,买个天卡,连着两天呆在自习室。偶尔学累了,就去下面转转圈,然后回来继续学。我座位旁边都是考研的学生,氛围很好。
我的Kafka就是在周末学完的。

专栏和架构班如何学习

我没有什么很好的建议,就是按照课程一直学就好了。
千万别图快,学习进度赶不上发新课的速度,也别急。
我曾经因为贪快,是回炉重学了Spring Cloud课程的。(我知道这个课程挺旧的,但是没关系,不要紧的,这个课老师教了如何去看源码,这才是最精髓的)

学习过程中如何验证自己是否吸收了学习内容

我最常用的方式就看着老师给的课程目录,一般一课时就是一个小问题。
能把所有问题都回答上来,也就可以了。
最后,要结合实战,结合自己的项目。这个没人可以帮你的,加油。
我贴一下我的项目图。学到的技术,只有用到你的项目中,才有价值。不然投入就等于没有产出。

面试技巧

这里其实要说的并没有什么了,我面试前找了架构班的大佬去对了下技术数据的问题,他给了我很详细的指导。非常感谢。总的来说,就是争取每个机会表现自己,你说的越多,越深,越主动,越好。我拿到阿里的offer之后,就没有再去面了,所以面试整体比较短,一个月也就结束了,中间还隔了中秋和国庆两个节日。