2022年的互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,奈何难抽出时间,这套完整的java后端学习路线以及1000+道的Java面试手册我整理了整整1个月,上传到Git上目前star数达到了30K+
这套互联网Java工程师面试题包括了:MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Springboot、SpringCloud、MQ、Kafka面试专题(共946页,32W字)
在写这个文章之前,我花了点时间,自己臆想了一个电商系统,基本上算是麻雀虽小五脏俱全,我今天就用它开刀,一步步剖析,我会讲一下我们可能会接触的技术栈可能不全,但是够用,最后给个学习路线。
Tip:请多欣赏一会,每个点看一下,看看什么地方是你接触过的,什么技术栈是你不太熟悉的,我觉得还算是比较全的,有什么建议也可以留言给我。
不知道大家都看了一下没,现在我们就要庖丁解牛了,我从上到下依次分析。
你可能会会好奇,你不是讲后端学习路线嘛,为啥还有前端的部分,我只能告诉你,傻瓜,肤浅。
我们可不能闭门造车,谁告诉你后端就不学点前端了?
前端现在很多也了解后端的技术栈的,你想我们去一个网站,最先接触的,最先看到的是啥?
没错就是前端,在大学你要是找不到专门的前端同学,去做系统肯定也要自己顶一下前端的,那我觉得最基本的技术栈得熟悉和了解吧,我现在也是偶尔会开发一下我们的管理系统主要是VUE和React。
在这里我列举了我目前觉得比较简单和我们后端可以了解的技术栈,都是比较基础的。
作为一名后端了解部分前端知识还是很有必要的,在以后开发的时候,公司有前端那能帮助你前后端联调更顺畅,如果没前端你自己也能顶一下简单的页面。
HTML、CSS、JS、Ajax我觉得是必须掌握的点,看着简单其实深究或者去操作的话还是有很多东西的,其他作为扩展有兴趣可以了解,反正入门简单,只是精通很难很难。
在这一层不光有这些还有Http协议和Servlet,request、response、cookie、session这些也会伴随你整个技术生涯,理解他们对后面的你肯定有不少好处。
Tip:我这里最后删除了JSP相关的技术,我个人觉得没必要学了,很多公司除了老项目之外,新项目都不会使用那些技术了。
前端在我看来比后端难,技术迭代比较快,知识好像也没特定的体系,所以面试大厂的前端很多朋友都说难,不是技术多难,而是知识多且复杂,找不到一个完整的体系,相比之下后端明朗很多,我后面就开始讲后端了。
互联网发展到现在,涌现了很多互联网公司,技术更新迭代了很多个版本,从早期的单机时代,到现在超大规模的互联网时代,几亿人参与的春运,几千亿成交规模的双十一,无数互联网前辈的造就了现在互联网的辉煌。
微服务,分布式,负载均衡等我们经常提到的这些名词都是这些技术在场景背后支撑。
单机顶不住,我们就多找点服务器,但是怎么将流量均匀地打到这些服务器上呢?
负载均衡,LVS
我们机器都是IP访问的,那怎么通过我们申请的域名去请求到服务器呢?
DNS
大家刷的抖音,B站,快手等等视频服务商,是怎么保证同时为全国的用户提供快速的体验?
CDN
我们这么多系统和服务,还有这么多中间件的调度怎么去管理调度等等?
zk
这么多的服务器,怎么对外统一访问呢,就可能需要知道反向代理的服务器。
Nginx
这一层做了反向负载、服务路由、服务治理、流量管理、安全隔离、服务容错等等都做了,大家公司的内外网隔离也是这一层做的。
我之前还接触过一些比较有意思的项目,所有对外的接口都是加密的,几十个服务会经过网关解密,找到真的路由再去请求。
一层的知识点其实也不少,你往后面学会发现分布式事务,分布式锁,还有很多中间件都离不开zk这一层,我们继续往下看。
这一层有点东西了,算是整个框架的核心,如果你跟我帅兵一样以后都是从事后端开发的话,我们基本上整个技术生涯,大部分时间都在跟这一层的技术栈打交道了,各种琳琅满目的中间件,计算机基础知识,Linux操作,算法数据结构,架构框架,研发工具等等。
我想在看这个文章的各位,计算机基础肯定都是学过的吧,如果大学的时候没好好学,我觉得还是有必要再看看的。
为什么我们网页能保证安全可靠的传输,你可能会了解到HTTP,TCP协议,什么三次握手,四次挥手。
还有进程、线程、协程,什么内存屏障,指令乱序,分支预测,CPU亲和性等等,在之后的编程生涯,如果你能掌握这些东西,会让你在遇到很多问题的时候瞬间get到点,而不是像个无头苍蝇一样乱撞(然而丙丙还做得不够)。
了解这些计算机知识后,你就需要接触编程语言了,大学的C语言基础会让你学什么语言入门都会快点,我选择了面向对象的JAVA,但是也不知道为啥现在还没对象。
JAVA的基础也一样重要,面向对象(包括类、对象、方法、继承、封装、抽象、 多态、消息解析等),常见API,数据结构,集合框架,设计模式(包括创建型、结构型、行为型),多线程和并发,I/O流,Stream,网络编程你都需要了解。
代码会写了,你就要开始学习一些能帮助你把系统变得更加规范的框架,SSM可以会让你的开发更加便捷,结构层次更加分明。
写代码的时候你会发现你大学用的Eclipse在公司看不到了,你跟大家一样去用了IDEA,第一天这是什么玩意,一周后,真香,但是这玩意收费有点贵,那免费的VSCode真的就是不错的选择了。
代码写的时候你会接触代码的仓库管理工具maven、Gradle,提交代码的时候会去写项目版本管理工具Git。
代码提交之后,发布之后你会发现很多东西需要自己去服务器亲自排查,那Linux的知识点就可以在里面灵活运用了,查看进程,查看文件,各种Vim操作等等。
系统的优化很多地方没优化的空间了,你可能会尝试从算法,或者优化数据结构去优化,你看到了HashMap的源码,想去了解红黑树,然后在算法网上看到了二叉树搜索树和各种常见的算法问题,刷多了,你也能总结出精华所在,什么贪心,分治,动态规划等。
这么多个服务,你发现HTTP请求已经开始有点不满足你的需求了,你想开发更便捷,像访问本地服务一样访问远程服务,所以我们去了解了Dubbo,Spring cloud。
了解Dubbo的过程中,你发现了RPC的精华所在,所以你去接触到了高性能的NIO框架,Netty。
代码写好了,服务也能通信了,但是你发现你的代码链路好长,都耦合在一起了,所以你接触了消息队列,这种异步的处理方式,真香。
他还可以帮你在突发流量的时候用队列做缓冲,但是你发现分布式的情况,事务就不好管理了,你就了解到了分布式事务,什么两段式,三段式,TCC,XA,阿里的全局事务服务GTS等等。
分布式事务的时候你会想去了解RocketMQ,因为他自带了分布式事务的解决方案,大数据的场景你又看到了Kafka
我上面提到过zk,像Dubbo、Kafka等中间件都是用它做注册中心的,所以很多技术栈最后都组成了一个知识体系,你先了解了体系中的每一员,你才能把它们联系起来。
服务的交互都从进程内通信变成了远程通信,所以性能必然会受到一些影响。
此外由于很多不确定性的因素,例如网络拥塞、Server 端服务器宕机、挖掘机铲断机房光纤等等,需要许多额外的功能和措施才能保证微服务流畅稳定的工作。
Spring Cloud 中就有 Hystrix 熔断器、Ribbon客户端负载均衡器、Eureka注册中心等等都是用来解决这些问题的微服务组件。
你感觉学习得差不多了,你发现各大论坛博客出现了一些前沿技术,比如容器化,你可能就会去了解容器化的知识,像 Docker,Kubernetes(K8s) 等。
微服务之所以能够快速发展,很重要的一个原因就是:容器化技术的发展和容器管理系统的成熟。
这一层的东西呢其实远远不止这些的,我不过多赘述,写多了像个劝退师一样,但是大家也不用慌,大部分的技术都是慢慢接触了,工作中慢慢去了解,去深入的。
好啦我们继续沿着图往下看,那再往下是啥呢?
数据库可能是整个系统中最值钱的部分了,在我码文字的前一天,刚好发生了微盟程序员删库跑路的操作,删库跑路其实是我们在网上最常用的笑话,没想到还是照进了现实。
这里也提一点点吧,36小时的故障,其实在互联网公司应该是个笑话了吧,权限控制没做好类似rm -rf 、fdisk、drop等等这样的高危命令是可以实时拦截掉的,备份,全量备份,增量备份,延迟备份,异地容灾全部都考虑一下应该也不至于这样,一家上市公司还是有点点不应该。
数据库基本的事务隔离级别,索引,SQL,主被同步,读写分离等都可能是你学的时候要了解到的。
上面我们提到了安全,不要把鸡蛋放一个篮子的道理大家应该都知道,那分库的意义就很明显了,然后你会发现时间久了表的数据大了,就会想到去接触分表,什么TDDL、Sharding-JDBC、DRDS这些插件都会接触到。
你发现流量大的时候,或者热点数据打到数据库还是有点顶不住,压力太大了,那非关系型数据库就进场了,Redis当然是首选,但是MongoDB、memcache也有各自的应用场景。
Redis使用后,真香,真快,但是你会开始担心最开始提到的安全问题,这玩意快是因为在内存中操作,那断点了数据丢了怎么办?你就开始阅读官方文档,了解RDB,AOF这些持久化机制,线上用的时候还会遇到缓存雪崩击穿、穿透等等问题。
单机不满足你就用了,他的集群模式,用了集群可能也担心集群的健康状态,所以就得去了解哨兵,他的主从同步,时间久了Key多了,就得了解内存淘汰机制……
他的大容量存储有问题,你可能需要去了解Pika….
image
image
其实远远没完,每个的点我都点到为止,但是其实要深究每个点都要学很久,我们接着往下看。
等你把几种关系型非关系型数据库的知识点,整理清楚后,你会发现数据还是大啊,而且数据的场景越来越多多样化了,那大数据的各种中间件你就得了解了。
你会发现很多场景,不需要实时的数据,比如你查你的支付宝去年的,上个月的账单,这些都是不会变化的数据,没必要实时,那你可能会接触像ODPS这样的中间件去做数据的离线分析。
然后你可能会接触Hadoop系列相关的东西,比如于Hadoop(HDFS)的一个数据仓库工具Hive,是建立在 Hadoop 文件系统之上的分布式面向列的数据库HBase 。
写多的场景,适合做一些简单查询,用他们又有点大材小用,那Cassandra就再合适不过了。
离线的数据分析没办法满足一些实时的常见,类似风控,那Flink你也得略知一二,他的窗口思想还是很有意思。
数据接触完了,计算引擎Spark你是不是也不能放过……
传统关系型数据库和NoSQL非关系型数据都没办法解决一些问题,比如我们在百度,淘宝搜索东西的时候,往往都是几个关键字在一起一起搜索东西的,在数据库除非把几次的结果做交集,不然很难去实现。
那全文检索引擎就诞生了,解决了搜索的问题,你得思考怎么把数据库的东西实时同步到ES中去,那你可能会思考到logstash去定时跑脚本同步,又或者去接触伪装成一台MySQL从服务的Canal,他会去订阅MySQL主服务的binlog,然后自己解析了去操作Es中的数据。
这些都搞定了,那可视化的后台查询又怎么解决呢?Kibana,他他是一个可视化的平台,甚至对Es集群的健康管理都做了可视化,很多公司的日志查询系统都是用它做的。
看了这么久你是不是发现,只是一直在介绍每个层级的技术栈,并没说到具体的一个路线,那是因为我想让大家先有个认知或者说是扫盲吧,我一样用脑图的方式汇总一下吧
线程
JVM内存区域
JVM运行时内存
垃圾回收与算法
JAVA四种引用类型
GC分代收集算法VS分区收集算法
GC垃圾收集器
JAVA IO/NIO
JVM类加载机制
接口继承关系和实现
List
Arayist (数组)Vector (数组实现、线程同步)Linklist (链表)
set
HahSet Cah陶)TreeSet (仁叉树)LnkHashSet(HashSet+ LinkedHashMap)
Map
HashMap (数组+链表+红黑树)ConcurrentHashMapHashTable (线程安全)TreeMap (可排序)LinkHashMap (记录插入顺序)
JAVA并发知识库
JAVA线程实现/创建方式
4种线程池
线程生命周期(状态)
终止线程4种方式
sleep与wait区别
start与run区别
JAVA后台线程
JAVA锁
线程基本方法
线程上下文切换
同步锁与死锁
线程池原理
JAVA阻塞队列原理
CyclicBarrier. CountDownlatch、 Semaphore的用法
volatile关键字的作用 (变量可见性、禁止重排序)
如何在两个线程之间共享数据
ThreadLocal作用(线程本地存储)
synchronized和ReentrantLock的区别
ConcurrentHashMap并发
Java中用到的线程调度
进程调度算法
什么是CAS (比较并交换-乐观锁机制-锁自旋)
什么是AQS (抽象的队列同步器)
![image](//upload-images.jianshu.io/upload_images/24195226-1c4be5f1d7b237d8?imageMogr2/auto-orient/strip|imageView2/2/w/1200)
JAVA异常分类及处理
JAVA反射
JAVA注解
JAVA内部类
JAVA泛型
JAVA序列化创建可复用的Java对象
JAVA复制
Spring特点
Spring核心组件
Spring常用模块
Spring主要包
Spring常用注解
Spring第三方结合
Spring I0C原理
Spring APO原理
Spring MVC原理
Spring Boot原理
JPA原理
Mybatis缓存
Tomcat架构
![image](//upload-images.jianshu.io/upload_images/24195226-0bb6a412ea825ff3?imageMogr2/auto-orient/strip|imageView2/2/w/1200)
服务注册发现
客户端注册(zookeeper)第三方注册(独立的服务Registrar)客户端发现服务端发现ConsulEurekaSmartStackEtcd
API网关
请求转发响应合并协议转换数据转换.安全认证
配置中心
zookeeper配置中心配置中心的数据分类
事件调度(kafka)
服务跟踪(starter-sleuth)
Hystrix断路器机制
服务熔断(Hystrix)
API管理
Netty原理
Netty高性能
多路复用通讯方式异步通讯NIO零拷贝(DIRECT BUFFERS使用堆外直接内存)内存池(基于内存池的缓冲区重用机制)
Netty RPC实现
概念关键技术核心流程
RMI实现方式
实现步骤
Protoclol Buffer
特点
Thrift
网络7层架构
TCP/IP原理.
网络访问层(Network Access Layer)网络层(Internet Layer)传输层(Tramsport Layer-TCP/UDP)应用层(Application Layer)
TCP三次握手/四次挥手
数据包说明三次握手四次挥手
HTTP原理
传输流程HTTP状态HTTPS
CDN原理
分发服务系统负载均衡系统:管理系统:
SIf4j
Log4j
LogBack
LogBack优点
ELK
Zookeeper概念
Zookeeper角色
Zookeeper工作原理(原子广播)
Znode有四种形式的目录节点
Kafka概念
Kafka数据存储设计
生产者设计
消费者设计
概念
RabbitMQ架构
Exchange类塑料
概念
列式存储
Hbase核心概念
Hbase核心架构
Hbase的逻辑
HBase vs Cassandra
概念
特点
概念
数据模型
Cassandra- 致Hash和虚拟节点)
Gossip协议
数据复制
数据写请求和协调者
数据读请求和后台修复
数据存储(CommitLog. MemTable、 SSTable)
二级索引(对要索引的value 摘要,生成RowKey)
数据读写
image
设计原则
厂方法模式
抽象工厂模式
单例模式
建造者模式
原型模式
适配器模式
装饰器模式
代理模式
外观模式
桥接模式
组合模式
享元模式
模板方法模式
观察者模式
迭代的模式
责任链模式
命令模式
备忘录模式
状态模式
访问者模式
中介者模式
解释器模式
四层负载均衡vs七层负载均衡
负载均衡算法/策略 LVS
Keepalive
Nginx反向代理负载均衡
HAProxy
存储引擎
索引
数据库三范式.
数据库是事务.
存储过程(特定功能的SQL语句集)
触发器(-段能自动执行的程序)
数据库并发策略
数据库锁
基于Redis分布式锁
分区分表
两阶段提交协议
三阶段提交协议
柔性事务
CAP
![image](//upload-images.jianshu.io/upload_images/24195226-88d16edbf7ea5848?imageMogr2/auto-orient/strip|imageView2/2/w/1200)
Paxos
Zab
Raft
NWR
Gossip
-致性Hash
二分查找
冒泡排序算法
插入排序算法
快速排序算法
希尔排序算法
归并排序算法
桶排序算法
基数排序算法
剪枝算法
回溯算法
最短路径算法
最大的数组算法
最长公共子序算法
最小生成树算法
![image](//upload-images.jianshu.io/upload_images/24195226-5cb7fa7773e548d4?imageMogr2/auto-orient/strip|imageView2/2/w/1200)
栈(stack)
队列(queue)
链表(Link)
散列表(Hash Table)
排序二叉树
红黑树
B-TREE
位图
AES
RSA
CRC
MD5
缓存雪崩
缓存穿透
缓存预热
缓存更新
缓存降级
概念
HDFS
MapReduce
Hadoop
MapReduce作业的生命周期
概念
核心架构
核心组件
SPARK编程模型
SPARK计算模型
SPARK运行流程
SPARK
RDD流程
SPARK
RDD
![image](//upload-images.jianshu.io/upload_images/24195226-bfbf969a830dce6d?imageMogr2/auto-orient/strip|imageView2/2/w/1200)
概念
集群架构
编程模型(spout->tuple->bolt)
Topology运行
Storm Streaming Grouping
概念
ResourceManager
NodeManager
ApplicationMaster
YARN运行流程
决策树
随机森林算法
逻辑回归
SVM
朴素贝叶斯
K最近邻算法
K均值算法
Adaboost算法
神经网络
马尔可夫
Saas
Paas
laaS
Docker
Openstack
需要资料学习的小伙伴可以前往下方自取!