技术栈Notes
第一阶段
一、MyBatis
1. Mybatis框架分析
(1)mybatis框架架构图
(2)整体执行流程图
(3)sqlSession执行流程图
2. MyBatis源码分析
(1)Config文件加载流程
(2)mapper文件加载流程
(3)SQLSource创建流程
(4)获取BoundSql流程
(5)参数映射流程
(6)结果集映射流程
3. 设计模式
构造者模式
简单工厂模式
工厂方法模式
抽象工厂模式
单例模式
4. 手写Mybatis
实现配置文件加载流程
实现封装jdbc的执行流程
二、Spring
1. 核心模块介绍
(1)核心容器模块
core模块
beans模块
context模块
expression模块
(2)AOP和设备模块
(3)数据访问及集成模块
(4)web模块
(5)报文消息模块
(6)test测试模块
2. 核心接口讲解
(1)BeanFactory接口体系
(2)BeanDefinition接口体系
(3)ApplicationContext接口体系
3. 源码分析
(1)IOC源码解析
- IOC初始化流程
- BeanDefinition加载注册流程
- DI依赖注入流程
(2)aop流程
- aop标签解析流程
- AspectJAwareAdvisorAutoProxyCreator类的作用
- AspectJExpressionPointcut类的作用
- AspectJPointcutAdvisor类的作用
- 动态代理对象创建流程
- AspectJAwareAdvisorAutoProxyCreator类的实现
- AspectJExpressionPointcut类的实现
(3)tx流程
- spring事务的实现原理
- PlatformTransactionManager的接口体系
- TransactionStatus接口
4. 设计模式
(1)创建型
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 单例模式
- 原型模式
(2)结构型
- 代理模式
- jdk动态代理模式
- cglib动态代理模式
- 装饰模式
- 组合模式
(3)行为型
5. 手写框架
(1)IOC模块
- 实现IOC初始化流程
- 实现BeanDefinition的加载注册
- 实现DI依赖注入
(2)AOP模块
6. 常见分析
- BeanFactory和FactoryBean的区别
- BeanFactoryPostProcessor和BeanPostProcessor的区别
- 循环依赖和循环构造问题如何解决
三、SpringMVC
1. 架构分析
(1)11步执行流程图
(2)六大组件介绍
- DispatcherServlet
- HandlerMapping
- HandlerAdapter
- Handler
- ViewResolver
- View
2. 源码分析
(1)DispatcherServlet初始化流程
- HandlerMapping初始化流程
- HandlerAdapter初始化流程
(2)DispatcherServlet执行流程
(3)HandlerMapping执行流程
- 解析@Controller和@RequestMapping流程
(4)HandlerAdapter执行流程
- 参数设置流程
- 结果映射流程
3. 手写springmvc
源码分析里的几个组件和流程的实现
四、MySQL
1. SQL语法顺序和解析顺序的理解
2. MySQL架构分析和执行流程分析
(1)逻辑架构图
连接器
服务管理
连接池
SQL接口
解析器
查询优化器
查询缓存
可插拔存储引擎:MyISAM、InnoDB、Memory
(2)执行流程图
- 简单执行流程
- 详细执行流程
(3)物理存储结构
- 日志文件
- 错误日志
- 二进制日志
- 通用查询日志
- 重做redo日志
- 回滚undo日志
- 中继日志
- 数据文件
- InnoDB数据文件
- MyISAM数据文件
3. 索引篇
(1)索引基础
索引介绍
- 什么是索引
- 索引优势
- 索引劣势
索引分类
- 单列索引
- 组合索引
- 全文索引
- 空间索引
索引使用
- 索引创建
- 索引删除
- 索引查看
(2)索引原理
- 索引存储结构
- B树与B+树
- 非聚集索引(MyISAMEMStore索引)
- 聚集索引(InnoDB)
- 多用组合索引
- 组合索引的优势
- 最左前缀原则
- 索引使用场景
- 使用索引情况
- 不使用索引情况
- 索引失效分析
- 查看执行计划
- explain查看执行计划
- 参数说明
- select_type
- simple
- primary
- subquery
- union
- type
- const
- eq_ref
- ref
- range
- index
- all
- extra
- using index
- using where
- using index condition
- ICP的理解
- index filter的理解
- using filesort
- select_type
- 多个索引使用案例分析
- 查看执行计划
4. 锁和事务篇
(1)锁的介绍
- 表级锁
- 行级锁
- 行锁
- MDL元数据锁
(2)行锁原理分析
- 简单SQL的加锁分析
- RC级别下的主键索引、唯一索引、非唯一索引、无索引分析
- RR级别下的主键索引、唯一索引、无唯一索引、无索引分析
- 复杂SQL的加锁分析
- where条件如何拆分
- index key
- index filter
- table filter
- where条件如何拆分
- 死锁原理分析
- 两个session的两条SQL产生死锁分析
- 两个session的一条SQL产生死锁分析
(3)事务流程分析
- 回滚流程undo
- 重做流程redo
(4)InnoDB架构分析
- 架构图分析
- 内存结构分析
- Buffer Pool
- data page和index page
- insert buffer
- adaptive hash index
- lock info
- data dictionary
- Redo log buffer
- double write
- Buffer Pool
- 磁盘文件分析
- 系统表空间和用户表空间文件
- 重做日志文件和归纳文件(?)
- 重做日志的落盘机制
(5)InnoDB一致性非锁定读
- 一致性非锁定读的机制
- MVCC(多版本并发控制)原理
- InnoDB的MVCC实现
(6)InnoDB事务分析
- 原子性、一致性、持久性原理分析
- 隔离性原理分析
- 事务并发问题理解
- 当前读和快照读
- 一致性非锁定读理解
- InnoDB的MVCC实现
5. 性能分析篇
(1)性能分析思路
(2)慢查询日志分析
- 何时开启慢查询日志
- 设置慢查询日志超时时间
- 分析慢查询日志的工具
(3)查询计划分析
(4)profile性能分析
6. 性能优化篇
(1)服务器层面优化
- innodb_buffer_pool_size设置
- 内存预热
- innodb_log_file_size设置
- 选择SSD磁盘提高读写能力
(2)SQL设计层面优化
- 中间表的设计
- 冗余字段的设计
- 拆表字段
- 拆表数据(分库分表)
(3)SQL语句优化
- limit优化
- 索引优化
- 如何创建索引并正确使用组合索引
- order by group by与索引设计的关联
- 其他优化项
7. 主从复制和读写分离集群
(1)主从复制集群
- 主从复制原理
- binlog和relay日志
- 主从复制实践
(2)读写分离集群
- 原理分析
- 读写分离实践
8. 分库分表篇
(1)分库分表策略
- 数据切分方案
- 数据切分规则
- 收切分原则
- 分库分表要解决的问题
- 分布式事务问题
- 分布式主键ID问题
- 跨库join问题
- 跨库count、order by、group by问题
(2)MyCat集群
- 架构介绍
- 核心概念介绍
- 十种常见分片规则
- MyCat集群搭建与分库分表应用
- MyCat读写分离方式设置
- 用户购物下单实践
五、Redis
1. Redis五种数据类型及使用场景分析
2. Redis事务
(1)Redis事务分析
(2)事务失败的处理
3. 持久化原理及性能分析
(1)rdb方式
- 快照触发时机
- 设置快照规则
- 快照实现原理
- 优缺点分析
(2)aof方式
- 同步磁盘数据分析
- aof重写原理分析
- 文件损坏如何恢复
(3)如何选择rdb和aof
4. 主从复制
原理分析
主从配置的实现原理
- 全量同步
- 增量同步
5. 哨兵机制
哨兵进程的作用分析
故障判断原理分析
- ODOWN
- SDOWM
- 法定人数理解
6. cluster集群
Redis集群策略
架构分析
容错机制
redis cluster集群搭建
数据迁移
7. 与lua整合
如何编写包含redis api的lua脚本
Redis整合lua脚本
8. Redis消息模式
队列模式
发布订阅者模式
9. 分布式锁
分布式锁的实现方式
注意事项
分布式锁实战与高并发测试
10. 常见缓存问题与解决方案
带来的问题都是:加大数据库压力
缓存穿透
现象:数据库和缓存中都不存在的数据,查询这种不存在的数据的现象
解决方案:
- 布隆过滤器 BloomFilter(有比较小的误判的概率,会认为一个不存在的数据存在,即允许这样的请求执行)
- 缓存数据的ID
缓存击穿
现象:大量请求查询同一个key,而这个key正好失效了,就会导致大量请求打到数据库上
解决方案:在查询数据库的逻辑前加排他锁,获取锁的线程可以查询,并将结果放入缓存(释放锁后,其他线程在获取锁前再读一次缓存,double check)
缓存雪崩
现象:大量的key在同一时间失效,或者缓存宕机了
解决方案:
- 使用缓存集群,降低服务宕机的概率
- 本地缓存+限流&降级
热点数据集中失效
现象:一般会给key设置失效时间,热点数据请求比较多,会都打到数据库上
解决方案:
- 热点数据和非热点数据设置不同的失效时间
- 采用缓存击穿的方案,查询数据库加排他锁
- 设置为永不失效,采用定时任务对快失效的热点数据进行更新失效时间,进行续租
缓存双写一致性
六、MongoDB
第二阶段
一、Zookeeper
1. 简介
重要概念讲解
Paxos算法
ZAB协议
CAP原则
2. 源码解析
Watcher核心机制
Leader选举
3. 应用场景
注册中心
分布式锁
分布式队列
负载均衡
配置维护
命名服务
DNS服务
分布式同步
集群管理
二、网络通信
RPC
原理与本质
- RPC理论
- RPC基于序列化信息通信
RPC解决什么问题
- 解决SOA编程模式问题……?
RPC实例实战
- RPC基于socket相连
- RPC基于动态代理调用透明化
RPC模块化演进
- 通过设计模式实现RPC模块单一职责
Netty
IO模型原理
- NIO事件驱动流性能优化
- BIO和OIO堵塞流问题
- AIO异步流使用场景
线程模型
- NioEventLoop线程模型
驱动模式
- ServerBootstrap启动原理
- Bootstrap启动原理
Codec框架
- tcp黏包、拆包
- encode编码器
- decode解码器
通道
- channelHandler
- channelInboundHandler
- ChannelInitializer
- ByteToMessageDecoder
- channelOutboundHandler
- MessageToMessageEncoder
- LineEncoder
责任链模式 channelPipeline
上下文 channelHandlerContext
配置构建模式 channelConfig
内部类 unsafe
主从模型 BossGroup&WorkerGroup
零拷贝 zero-copy
字节容器 ByteBuf原理
Netty实战 websocket聊天
三、Dubbo
入门
Dubbo分布式服务模块划分
高可用
容错机制
服务降级
服务限流
服务暴露延迟
结果缓存应用
多版本控制
多注册中心
高级应用
Dubbo负载均衡策略与自定义实现
仅订阅与仅注册
提供者的异步调用、异步执行
Dubbo源码解析
- Dubbo的SPI
- Dubbo对spring配置文件的加载与解析
- provider的服务暴露
- Consumer的服务消费
四、Nginx
五、消息中间件
消息中间件在分布式架构中的应用场景:业务解耦/最终一致性/广播/错峰流控
JMS:Java Message Service,Java消息服务。试图通过提供公共Java API,隐藏单独MQ产品供应商提供的实际接口,跨越壁垒,解决互通问题。
AMQP:Advanced Message Queue Protocol,高级消息队列,2006年提出。是应用层协议的一个开放标准,基于此协议的客户端与消息中间件可传递消息,不受产品、开发语言等条件的限制。
四个项目都是开源的
产品 | 启动时间&开发者 ,开源时间 | 语言 | 吞吐量 | 时效性 | 可用性 | 消息可靠性 | 说明 |
---|---|---|---|---|---|---|---|
ActiveMQ | 2004LogicBlaze,2007Apache | Java | 万级 | 毫秒级 | 高,基于主从架构 | 有较低的概率丢失数据 | 早期活跃、成熟产品,现在用的少。主要用于解耦和异步,较少在大规模吞吐的场景中使用。现在社区不活跃 |
RabbitMQ | 2007RabbitMQ Technologies Ltd | erlang | 万级 | 微秒级 | 高,基于主从架构 | erlang开发,并发能力强,性能极好,延时低。社区活跃 | |
RocketMQ | 2012阿里开源,2016Apache | Java | 十万级 | 毫秒级 | 非常高,分布式架构 | 可以做到0丢失 | 大规模吞入,性能好,分布式扩展方便。社区活跃一般 |
Kafka | 2011LinkedIn,2012Apache | Scala+Java | 十万级 | 毫秒级 | 非常高 | 可以做到0丢失 | 超高吞吐量,极高的可用性和可靠性,分布式任意扩展。大数据领域实时计算、日志采集的事实标准 |
RabbitMQ概念
- 生产者和消费者
- 队列
- 交换器、路由键、绑定
Kafka
- 基于zookeeper实现高可用
- 消息处理过程剖析
- 副本机制与选举原理