👏 重大更新!!!重磅!
- JavaGuide 在线阅读版(新版,推荐
👍 ):https://javaguide.cn/ - JavaGuide 在线阅读版(老版):https://snailclimb.gitee.io/javaguide/#/
- 《JavaGuide 面试突击版》PDF 版本下载
- 介绍:关于 JavaGuide 的相关介绍请看:关于 JavaGuide 的一些说明 。
- 贡献指南 :欢迎参与 JavaGuide的维护工作,这是一件非常有意义的事情。
- PDF版本 : 《JavaGuide 面试突击版》PDF 版本 。
- 图解计算机基础 :图解计算机基础 PDF 下载 。
- 知识星球 : 简历指导/Java学习/面试指导/面试小册。欢迎加入我的知识星球 。
- 面试专版 :准备面试的小伙伴可以考虑面试专版:《Java面试进阶指北 》 (质量很高,专为面试打造,星球用户免费)
- 转载须知 :以下所有文章如非文首说明皆为我(Guide哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
⛽️
推荐
Java
基础
知识点/面试题 : (必看
重要知识点详解 :
- 为什么 Java 中只有值传递?
- 什么是反射机制?反射机制的应用场景有哪些?
- 代理模式详解:静态代理+JDK/CGLIB 动态代理实战
- 常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?
- BigDecimal解决浮点数运算精度丢失问题
- 泛型连环炮
集合
知识点/面试题 :
- Java 集合常见知识点&面试题总结(上) (必看
👍 ) - Java 集合常见知识点&面试题总结(下) (必看
👍 ) - Java 容器使用注意事项总结
源码分析 :
并发
知识点/面试题 : (必看
重要知识点详解 :
- 线程池 :Java 线程池详解、Java 线程池最佳实践
- ThreadLocal 关键字解析
- Java 并发容器总结
- Atomic 原子类总结
- AQS 原理以及 AQS 同步组件总结
- CompletableFuture入门
👍 )
JVM (必看 JVM 这部分内容主要参考 JVM 虚拟机规范-Java8 和周志明老师的《深入理解Java虚拟机(第3版)》 (强烈建议阅读多遍!)。
新特性
- Java 8 :Java 8 新特性总结(翻译)、Java8常用新特性总结
- Java9~Java15 : 一文带你看遍 JDK9~15 的重要新特性!
小技巧
计算机基础
操作系统
网络
数据结构
图解数据结构:
- 线性数据结构 :数组、链表、栈、队列
- 图
- 堆
- 树 :重点关注红黑树、B-,B+,B*树、LSM树
其他常用数据结构 :
算法
算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的:
常见算法问题总结 :
另外,GeeksforGeeks 这个网站总结了常见的算法 ,比较全面系统。
数据库
MySQL
总结:
重要知识点:
- MySQL数据库索引总结
- 事务隔离级别(图文详解)
- MySQL三大日志(binlog、redo log和undo log)详解
- InnoDB存储引擎对MVCC的实现
- 一条 SQL 语句在 MySQL 中如何被执行的?
- 字符集详解:为什么不建议在MySQL中使用 utf8 ?
- 关于数据库中如何存储时间的一点思考
Redis
搜索引擎
用于提高搜索效率,功能和浏览器搜索引擎类似。比较常见的搜索引擎是 Elasticsearch(推荐) 和 Solr。
系统设计
系统设计必备基础
RESTful API
我们在进行后端开发的时候,主要的工作就是为前端或者其他后端服务提供 API 比如查询用户数据的 API 。RESTful API 是一种基于 REST 构建的 API,它是一种被设计的更好使用的 API。
相关阅读:RestFul API 简明教程
命名
编程过程中,一定要重视命名。因为好的命名即是注释,别人一看到你的命名就知道你的变量、方法或者类是做什么的!
相关阅读: Java 命名之道 。
常用框架
如果你没有接触过 Java Web 开发的话,可以先看一下我总结的 《J2EE 基础知识》 。虽然,这篇文章中的很多内容已经淘汰,但是可以让你对 Java 后台技术发展有更深的认识。
👍 )
Spring/SpringBoot (必看 知识点/面试题 :
重要知识点详解 :
MyBatis
Spring Cloud
安全
认证授权
《认证授权基础》 这篇文章中我会介绍认证授权常见概念: Authentication,Authorization 以及 Cookie、Session、Token、OAuth 2、SSO 。如果你不清楚这些概念的话,建议好好阅读一下这篇文章。
-
JWT :JWT(JSON Web Token)是一种身份认证的方式,JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。相关阅读:
-
SSO(单点登录) :SSO(Single Sign On) 即单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统。举个例子我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东家电等子系统。相关阅读:SSO 单点登录看这篇就够了!
数据脱敏
数据脱敏说的就是我们根据特定的规则对敏感信息数据进行变形,比如我们把手机号、身份证号某些位数使用 * 来代替。
敏感词过滤
系统需要对用户输入的文本进行敏感词过滤如色情、政治、暴力相关的词汇。
相关阅读:《Java定时任务大揭秘》
定时任务
最近有朋友问到定时任务相关的问题。于是,我简单写了一篇文章总结一下定时任务的一些概念以及一些常见的定时任务技术选型:《Java定时任务大揭秘》
分布式
CAP 理论和 BASE 理论
CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性) 这三个单词首字母组合。
BASE 是 Basically Available(基本可用) 、Soft-state(软状态) 和 Eventually Consistent(最终一致性) 三个短语的缩写。BASE 理论是对 CAP 中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于 CAP 定理逐步演化而来的,它大大降低了我们对系统的要求。
相关阅读:CAP 理论和 BASE 理论解读
Paxos 算法和 Raft 算法
Paxos 算法 诞生于 1990 年,这是一种解决分布式系统一致性的经典算法 。但是,由于 Paxos 算法非常难以理解和实现,不断有人尝试简化这一算法。到了2013 年才诞生了一个比 Paxos 算法更易理解和实现的分布式一致性算法—Raft 算法。
相关阅读:
RPC
RPC 让调用远程服务调用像调用本地方法那样简单。
Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读:
API 网关
网关主要用于请求转发、安全认证、协议转换、容灾。
相关阅读:
分布式 id
在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。比如数据量太大之后,往往需要对数据进行分库分表,分库分表后需要有一个唯一 ID 来标识一条数据或消息,数据库的自增 ID 显然不能满足需求。相关阅读:为什么要分布式 id ?分布式 id 生成方案有哪些?
分布式事务
分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
分布式协调
ZooKeeper :
前两篇文章可能有内容重合部分,推荐都看一遍。
高性能
消息队列
消息队列在分布式系统中主要是为了解耦和削峰。相关阅读: 消息队列常见问题总结。
- RabbitMQ : RabbitMQ 入门
- RocketMQ : RocketMQ 入门、RocketMQ 的几个简单问题与答案
- Kafka :Kafka 常见问题总结
读写分离&分库分表
读写分离主要是为了将数据库的读和写操作分不到不同的数据库节点上。主服务器负责写,从服务器负责读。另外,一主一从或者一主多从都可以。
读写分离可以大幅提高读性能,小幅提高写的性能。因此,读写分离更适合单机并发读请求比较多的场景。
分库分表是为了解决由于库、表数据量过大,而导致数据库性能持续下降的问题。
常见的分库分表工具有:sharding-jdbc
(当当)、TSharding
(蘑菇街)、MyCAT
(基于 Cobar)、Cobar
(阿里巴巴)...。 推荐使用 sharding-jdbc
。 因为,sharding-jdbc
是一款轻量级 Java
框架,以 jar
包形式提供服务,不要我们做额外的运维工作,并且兼容性也很好。
相关阅读: 读写分离&分库分表常见问题总结
负载均衡
负载均衡系统通常用于将任务比如用户请求处理分配到多个服务器处理以提高网站、应用或者数据库的性能和可靠性。
常见的负载均衡系统包括 3 种:
- DNS 负载均衡 :一般用来实现地理级别的均衡。
- 硬件负载均衡 : 通过单独的硬件设备比如 F5 来实现负载均衡功能(硬件的价格一般很贵)。
- 软件负载均衡 :通过负载均衡软件比如 Nginx 来实现负载均衡功能。
高可用
高可用描述的是一个系统在大部分时间都是可用的,可以为我们提供服务的。高可用代表系统即使在发生硬件故障或者系统升级的时候,服务仍然是可用的 。
相关阅读: 《如何设计一个高可用系统?要考虑哪些地方?》 。
限流
限流是从用户访问压力的角度来考虑如何应对系统故障。
限流为了对服务端的接口接受请求的频率进行限制,防止服务挂掉。比如某一接口的请求限制为 100 个每秒, 对超过限制的请求放弃处理或者放到队列中等待处理。限流可以有效应对突发请求过多。相关阅读:何为限流?限流算法有哪些?
降级
降级是从系统功能优先级的角度考虑如何应对系统故障。
服务降级指的是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。
熔断
熔断和降级是两个比较容易混淆的概念,两者的含义并不相同。
降级的目的在于应对系统自身的故障,而熔断的目的在于应对当前系统依赖的外部系统或者第三方系统的故障。
排队
另类的一种限流,类比于现实世界的排队。玩过英雄联盟的小伙伴应该有体会,每次一有活动,就要经历一波排队才能进入游戏。
集群
相同的服务部署多份,避免单点故障。
超时和重试机制
一旦用户的请求超过某个时间得不到响应就结束此次请求并抛出异常。 如果不进行超时设置可能会导致请求响应速度慢,甚至导致请求堆积进而让系统无法再处理请求。
重试的次数一般设为 3 次,再多的重试次数没有好处,反而会加重服务器压力(部分场景使用失败重试机制会不太适合)。在一次重试失败之后通常会加上一个时间间隔 delay 再进行下一次重试,时间间隔 delay 通常建议是随机的。
并且,为了更好地保护下游,我们还可以结合断路器。
灾备设计和异地多活
灾备 = 容灾+备份。
- 备份 : 将系统所产生的的所有重要数据多备份几份。
- 容灾 : 在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。
异地多活 描述的是将服务部署在异地并且服务同时对外提供服务。和传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者人为灾害。
相关阅读:
开发工具
数据库
- CHINER: 干掉 PowerDesigner,这个国产数据库建模工具很强!
- DBeaver:开源数据库管理工具。
- screw:一键生成数据库文档,堪称数据库界的Swagger
- DataGrip:IDEA官方的这个数据库管理神器真香!
Git
Docker
关于作者
公众号
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。
《Java面试突击》: 由本文档衍生的专为面试而生的《Java面试突击》PDF 版本公众号后台回复 "面试突击" 即可免费领取!