微服务,网络,分布式内容讲解
树图思维导图提供 面经讲解 在线思维导图免费制作,点击“编辑”按钮,可对 面经讲解 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:61935604ecda2fab40305ea824e81fde
面经思维导图模板大纲
JVM存储模型
线程共享区
方法区
堆
新生代
from
to
老年代
线程隔离区
虚拟机栈
本地方法栈
程序计数器
JVM内存结构
JVM内存
java heap 堆
对象实例
数组
字符串常量池
静态变量
线程分配缓冲区
java stacks 栈
本地内存
垃圾收集器
ZGC
G1
CPU占用高排查
arthas
top -H p pid
jstack
什么时候Full GC
K8S
Rancher
Docker
Rancher
非关系型
MongoDB
MongoDB 索引选择B-树
聚合性数据库
关系型
mysql
存储引擎
脏读、幻读和不可重复读
索引B+树
mysql优化
主从集群
读写分离
分库分表
水平分表
按照hash或range策略,拆分数据存储
垂直分表
拆分字段存储,主表扩展表
垂直分库
以表为依据,按照业务归属不同,将不同的表拆分到不同的库中
热点数据上缓存
sql优化
慢sql开启
explain执行计划
show profile
默认关闭,最近15次运行情况
sql优化规则
基于索引来查找
避免索引列上使用函数和运算,索引失效
like中%尽量放在右边
最左原则,联合索引模糊匹配,从左往右命中越多越好
尽量使用sql用到索引排序
查询有效列信息,避免使用*
永远小结果集驱动大结果集
postgresql
高速缓存
redis
缓存常见问题
雪崩
缓存时间随机值
加固缓存
限流降级
击穿
互斥锁机制,一个线程去查
预加载缓存
不过期缓存
穿透
缓存空值
布隆过滤器
参数校验
部署模式
主从模式
主写从读,不会重新选举
哨兵模式
主挂了会重新选举
哨兵集群管理,哨兵不与redis部署一起
集群模式
分片,存储不同内容
主从和哨兵结合,至少3m3s
多个集群,每个集群有主从
节点通过hash槽确定位置,16384,环形,key通过CRC16校验
redis和mysql数据一致
延迟双删(删->写->消息队列删)
延迟双删(删->写->删)+加锁
写->删(重试)
实时性好
写->binlog(canel)->删
最终一致性好
写->消息队列->删
6.0之前是单线程,6.0只有只有网络请求处理是多线程,主要操作键值对读取写入都是由一个主线程单线程完成
基本数据类型
String
简单动态字符串
预分配
O(1)获取字符串长度
二进制安全
兼容C语言字符串函数
List
双向链表
压缩列表
Hash
哈希表
压缩列表
Set
哈希表
数组
ZSet:有序,每个元素有评分
跳表
多层的有序链表
压缩列表
基本数据结构
Memcache
搜索引擎
ElasticSearch
RocketMQ
RabbitMQ
Kafka
Hadoop
MapReduce
HBase
Hive
Spark
HDFS
Zabbix
gitlab
girrt
SVN
Canal
愚公
jira
禅道
seata
四种事务模式
XA
1PC不提交事务,锁定资源
依赖数据库机制回滚,事务性数据库
强一致性
性能差
AT(默认)
1PC直接提交,不锁定资源
依赖数据快照回滚
最终一致性
可能脏写,引入全局锁读写隔离
TCC
1PC直接提交,无锁
不生成快照,没有全局锁,性能好
依赖补偿操作,可用于非事务性数据库
代码侵入,实现Try,Confirm,Cancel,复杂
最终一致性
Confirm,Cancel幂等处理
SAGA
1PC直接提交,无锁
异步调用,吞吐高
依赖补偿业务,自己编写
不用编写TCC
适合长复杂事务
时效性差
脏写
事后:dirty undo log日志,及时捕获告警
事前:全局锁@GlobalLock
分布式锁
redis(AP),性能高
SETNX key value expire key seconds del key
成功失败都要释放锁,超时释放锁
LUA脚本:原子性
看门狗:执行期间不断刷新获取锁,保证没有死锁
zookeeper(CP),性能中
原理:一个目录下只有一个唯一文件名
文件名按照顺序建立,是否获取最小的
数据库锁,性能低
悲观锁:for update
乐观锁:版本号
网络四元组
服务网格
SideCar
负载均衡
服务发现
熔断
。。。
常用网格产品:Linkerd、Envoy、Istio、Conduit
Spring boot
自动装配机制的原理
@SpringBootApplication
@EnableAutoConfiguration
三个核心关键技术
Starter ,@Configuration 配置类,@Bean
classpath:META-INF/spring.factories ,SpringFactoriesLoader
ImportSelector 对这些配置类的动态加载
Dubbo
Dubbo请求失败
快速失败
失败安全
失败自动恢复,重试
并行多个处理策略
广播调用策略
高性能RPC架构
三层模式
Business
RPC
Remoting
负载均衡策略
加权随机
最小活跃数
一致性hash
加权轮询
最短响应时间
Dubbo和Spring Cloud
核心要素
Spring Cloud通过整合子项目可以顺利完成组件融合
Dubbo需要通过实现各种filter进行定制,开发成本和技术难度高
通信协议
Dubbo,单一长连接和netty的NIO异步通讯,Hession序列化,适合小数据量大并发
Spring Cloud,Http协议和Rest API,在通信速度上Dubbo略胜
服务依赖方式
Dubbo依赖较重,版本管理机制,程序侵入少
Spring Cloud使用JSON交互,省略了版本管理,为跨平台调用提供基础
组件运行流程
Dubbo每个组件需要部署在单独服务器上
Spring Cloud所有请求通过网关zuul访问内部服务,由注册中心(Eureka)和Ribbon进行服务发现和负载均衡
初始定位和生态
Spring Cloud是微服务架构下的一站式解决方案,依托Spring 生态
Dubbo起初关注服务调用和治理,生态相对不足但逐渐丰富
服务治理能力
Spring Cloud服务治理能力相对较弱
Dubbo提供企业级的服务治理能力
通信协议
Spring Cloud与http绑定,在性能和其他RPC体系互通上存在障碍
Dubbo提供灵活的通信协议选择,支持多种序列化编码协议
微服务集群规模
Spring Cloud适合小规模微服务集群
Dubbo可以在超大规模集群中实现水平扩容,应对集群增长带来的问题
多语言支持
Spring Cloud主要围绕JAVA生态
Dubbo支持多语言异构的微服务体系
远程调用方式
Spring Cloud中Feign基于http协议,接口规范统一,通信效率较低
自定义通信协议,数据传输性能好
双亲委派机制
原理:先父类加载,不能再子类
加载流程(从上往下)
启动类加载器
扩展类加载器
应用系统类加载器
自定义类加载器
作用
避免重复加载一个类
确保核心类库的安全,不被自定义类替代
不同的类加载器可以为相同名称的类创建额外的命名空间
打破双亲委派
原因:不能向下委派,不能不委派
实现模块化和动态更新
解决类库版本冲突问题
运行时修改类
支持Web应用的独立部署和更新
方法
通过SPI机制,使用ServiceLoader.load去加载,classpath:META-INF/service
受加载范围限制,父类加载器无法加载需要拿到的文件,需要委托子类去加载
通过自定义类加载器,继承ClassLoader类,重写loadClass方法
重写方法中不让他执行双亲委派,打破双亲委派
工具
OSGI
Tomcat
Java Agent
URLClassloader
Spring Bean生命周期
创建前准备阶段
创建实例阶段
依赖注入阶段
容器缓存阶段
销毁实例阶段
Spring如何解决循环依赖
三级缓存
一级缓存:所有成熟完整的Bean,Spring容器(属性赋值,属性注入,初始化)
二级缓存:实例化半成品Bean实例或半成品代理对象bean,提前暴露单例的bean
三级缓存:工厂对象lambda表达式,可以产生bean对象提前暴露的引用
解决前提条件
互相依赖的Bean必须是单例
依赖注入的方式不能都是构造函数注入的方式
创建流程
不用三级缓存
使用二级缓存,那么对象没有属性赋值、初始化前就创建代理对象是有风险
产生AOP动态代理对象时的风险
创建时机
缓存一致性
性能开销
代码复杂性和可维护性
三级缓存是为了解决在循环依赖以及AOP动态代理同时产生时的风险
被迫的导致Bean对象提前的暴露了引用
多例、构造器注入这两种情况解决不了循环依赖
循环依赖的解决原理是在对象实例化后提前暴露了引用,而这两种情况都还没实例化
不能解决循环依赖的情况
单例的代理bean和多例bean通过setter注入
构造器注入bean
设置了@DependsOn的bean
BeanFactory和FactoryBean
功能不同
BeanFactory
核心接口,一个容器,所有容器的基础,管理和获取Bean,负责bean生命周期
FactoryBean
创建Bean的特殊工厂bean,创建返回其他Bean,提供扩展机制,创建Bean时进行复杂逻辑处理
返回值不同
BeanFactory
根据bean的定义返回bean对象实例,通过getBean方法
FactoryBean
创建和返回其他bean对象,通过getObject方法
配置方式不同
BeanFactory
通过XML或者注解方式配置,定义和管理对象
FactoryBean
需要自定义实现该接口的类,通过XML或者注解方式配置,创建和管理对象
创建时机不同
BeanFactory
获取Bean时动态创建Bean对象,按需创建
FactoryBean
容器初始化时创建,作为普通的Bean管理
IOC
对象的创建和管理由容器来负责,程序员只需要定义对象的依赖关系,由容器来实现对象的创建和组装,即把对象的控制权交给IoC容器
DI 依赖注入
AOP
原理
基于动态代理和字节码操作
流程
1、编译时:AspectJ编译器将切面代码编译成字节码文件
2、运行时:JDK动态代理或CGLIB动态代理生成代理类
3、代理类在目标对象方法前后插入切面代码,实现AOP功能
动态代理
JDK
目标对象实现了接口时
使用JAVA反射包里面的类和接口实现,核心是Proxy类中newProxyInstance方法,三个参数:类加载器,被代理类实现的接口,实现InvocationHandler接口的对象
CGLIB
目标对象没有实现接口时
继承目标类生成子类,覆盖方法实现增强
底层采用ASM字节码生成代理类,比JDK代理反射效率高
场景
日志记录,权限检查,事务管理,异常处理,性能监控,缓存,参数校验转换
Spring MVC
工作流程
Spring bean生命周期执行流程
定义bean
实例化Bean(通过反射)
属性赋值,属性注入(依赖注入)
初始化bean
使用bean
销毁bean
HashMap
hash冲突
线性探测法
链式寻址法
再Hash法
建立公共溢出区
数组+链表(红黑树)结构
ConcurrentHashMap
node加锁
size()方法
竞争不激烈,CAS设置
竞争激励,获取数组某个CAS设置
fail-fast和fail-safe
fail-fast:使用迭代器遍历集合对象,遍历过程中修改了对象内容,会抛出ConcurrentModificationException。遍历期间有个modCount,对数据有改动会导致modCount变化
fail-safe:使用迭代器遍历集合对象,复制原有集合,在复制集合上进行遍历。修改是在原有集合上进行修改
朴素贝叶斯
傅里叶变换
布隆过滤器
HLL(HyperLogLog)
BitMap(位图)
散列算法
密码加密 —— bcrypt、MD5、SHA-256、盐
局部敏感(文本去重)
simhash
检查两项内容相似度
Google判断网页是否已收集
老师判断学生论文是否从网上抄袭
不希望用户上传有版权的内容,与小说《哈利波特》类似
minhash
KShingle
排序
堆排序
归并排序
插入排序
冒泡排序
快速排序
查找
二分
HDFS
Go-FastDFS
FastDFS
Minio
树
B树
所有结点存数据
B+树
叶子结点存数据,叶子结点双向链表连接
红黑树
两个结点
链表
数组
哈希
JUC
锁
synchronized
锁升级
非公平锁
lock
ReentrantLock
可重入锁
可重入锁和偏向锁
自旋锁
依赖CAS实现
死锁
四个条件
互斥
请求和保持
一次性申请所有资源
不可抢占
获取不到就释放自己资源
循环等待
按序申请资源
线程池7大核心参数
详解
CAS
ABA问题
AtomicStampedReference
CPU消耗过大
分散竞争点,多个cell
AQS
组成部分
同步状态(state)
等待队列(CLH 队列)
独占模式和共享模式
观察者模式
工厂模式
适配器模式
单例模式
树图思维导图提供 904名中国成年人第三磨牙相关知识、态度、行为和病史的横断面调查 在线思维导图免费制作,点击“编辑”按钮,可对 904名中国成年人第三磨牙相关知识、态度、行为和病史的横断面调查 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:10b9a8a2dd2fb4593f8130ef16c320fc
树图思维导图提供 销售经理半年规划 在线思维导图免费制作,点击“编辑”按钮,可对 销售经理半年规划 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:e614d6bcf03e9318109240a18697c5d1