java 技术体系与原理
2023-02-11 16:24:02 0 举报
AI智能生成
持续更新
作者其他创作
大纲/内容
spring体系
bean的生命周期
beanDefinition
BeanFactoryPostProcessor
扩展 BeanDefinition
Bean 的创建
BeanPostProcessor
before
init
after
动态代理等实现
BeanFactory
ioc
aop
声明式事务管理
BeanDefinition 扩展
Bean 扩展
事件发布机制
遍历listener循环同步或者异步调用
spring boot 自动装配机制
默认扫描
默认容器
默认加载 classpath 路径下 /META-INF/spring.factories文件内容
spring boot starter 的扩展机制
配置文件和属性注入机制以及刷新机制
循环依赖的解决方案
服务器
tomcat
grpc server
服务监管体系
promethues
grafana
分布式组件体系
分布式锁
redisson
lua
watchdog
主从同步导致的分布式锁失效问题
zookeeper
吞吐量比 redisson 低但是绝对可靠
幂等保障
分库分表 client 组件
shardingjdbc
全链路追踪
日志组件
zookeeper
集群角色
leader
follower
observer
集群启动
mysql
索引
B+树
唯一索引/普通索引
索引优化
事务
四大特性ACID
原子性
一致性
隔离性
持久性
事务隔离级别
读未提交
读已经提交
每次执行SQL都创建一个 readview
可重复读
第一次执行sql的时候创建一个readview
串行化
readview实现
活跃事务id列表
在列表中:如果是当前事务id才可见
大于最大事务ID:当前事务之后创建不可见
锁
全局锁 库锁
表锁
行锁
元数据锁
读锁
写锁
慢查询排查
是否命中索引
区分度如何
复杂查询拆解
联合索引优化过多的索引
索引优化
联合索引
长度控制/区分度控制
排序
基于索引排序
未使用索引:创建 sort buffer 快排排序
连表查询
写入流程
查询流程
分布式事务
seata
rocketmq 最终一致性
tcc
海量数据处理
分库分表
路由键的设计
广播表
单独数据源表
hdfs:见分布式文件存储技术
hbase
hbase:meta 维护数据存储关系
zk 存储 hbase:meta 所在 region
region 存储有表完整例簇
数据都是存储在 hdfs 中
写入流程
获取写入 region
写入 hlog 缓冲
写入 memstore
顺序写入 hlog 刷入 hdfs(用于故障恢复当写入hfile后可以进行删除)
本地化率决定写入效率(hdfs 存储与当前region在一个物理机上)
合并 hfile
memstore写满了或者达到时间就会生成一个hfile写入到 hdfs中
hfile 太多了会影响查询效率,所以会定期 merge
查询流程
获取 rowkey 对应的 region 地址
构建 scanner 体系
memstore 有就直接返回
根据 hfile 对应的 scanner 的布隆过滤器快速过滤出目标 scanner
在多个 scanner 中检索出数据
mongodb
代码质量与持续集成
sonarQube代码质量检测
jenkins与gitlab ci
搜索技术
b+树检索
倒排索引检索
ES
云原生
k8s
服务网格
组网技术
服务发现与注册机制
注册中心与配置中心
流量治理
弹性伸缩
计算机网络
tcp
http
http1.1
http2.0
dns
cdn
https
网络编程
nio
netty
io多路复用
select
poll
epoll
socket
容器化相关技术
docker
java 基础
反射
日期
金额计算
集合
map
list
set
编码
ascii
unicode
utf8
utf16
utf16_le
uft_be
字符串
不可变
java9将char[] 改为 bytes[]
char 采用utf8编码占据1-3字节消耗内存过高
对象
对象头
Mark Word
对象的 hashcode
epoch | threadId | age | 偏向状态| 锁状态
元数据指针
数组长度
实列数据
对其填充
基本类型
并发编程
三大特性
原子性
一段代码同一时间只能被一个线程执行
有序性
编译器和处理器可能调整代码得执行顺序
可见性
工作内存中的多级高速缓存导致的数据对其它内核不可见
并发关键字
volatile
保证可见性
保障64位操作在32位系统上的原子性
synchronized
保障原子性
无锁 cas 抢锁
有锁是自己就+1
有锁不是自己自旋抢锁
自旋抢锁失败进入阻塞队列等待被唤醒
保证可见性
保证有序性
lock
保障了并发编程3大特性
读写锁
公平锁
非公平锁
独占锁
cas
内存屏障
保障有序性可以通过 acquire、release 屏障
保障可见性通过 Store、Load 屏障
本质就是禁止操作重排序以及控制工作内存到其他内核的可见性以及写入高速缓存和主内存的顺序
缓存一致性协议
内存屏障需要配合缓存一致性协议 MESI 来工作
并发工具包
CopyOnWriteList
CurrentHashMap
队列
ArrayBlockingQueue
LinkedBlockingQueue
ConcurrentLinkedQueue
线程池
其它
fail fast 和 fail safe
jvm
内存模型
堆
分配
指针碰撞
TLAB线程本地分配缓冲
栈
栈帧
方法区
从永久代的实现改为了元数据区
本地方法栈
程序计数器
类加载机制
双亲委派模型
类动态刷新,自定义类型加载器
类加载
加载
连接
验证
准备
static
0值
final 真实值
解析
符号引用 -> 直接引用
初始化
执行静态代码和赋值动作
垃圾收集算法
整理算法
复制算法
清除算法
垃圾收集器
年轻代
serial
parnew
serial 的多线程版本
全局 stw
回收实现(复制算法的垃圾收集器)
存活对象进入 survivor 区域,超过 15 次进入老年代
大对象达到阈值直接进入老年代
内存分配担保:GC 后存活的对象 > s 区域的大小
老年代
cms
stw 初始标记:枚举根节点
并发标记(与用户线程并行):可达性分析
重新标记
垃圾回收
整理算法
清除算法
混合收集
G1
基础特征
将内存划分为 2048 个 region
region 有年轻的、老年代、大对象角色、survivor
默认占用5%,最大 60%
根据指定的停顿时间优先回收价值含量高的 region
消耗额外的 cpu 资源去维护region价值高地排序
回收过程
年轻代区域回收
region 占用达到一定比例的时候触发年轻代回收全局 stw
存货的进入 survivor 超过 15 次进入老年队
大对象不会进入老年会占用多个 region
老年代回收
初始标记
并发标记
重新标记
垃圾回收
不会一次回收所有的内存(因为G1一般用于大内存)
回收与用户线程反复交替执行,默认交替执行 8 次
如果混合回收区域达到了5%会停止后续的回收
回收算法效率
整体看基于复制算法
局部看基于清除
不存在内存碎片
适用于大内存,低停顿的系统
问题排查
cpu飙高
卡顿
微服务框架
spring cloud
远程调用 feign
feign 的构建
FeignContext
每个服务对应一个独立的 spring 容器
扫描注解与配置填充这个容器
FeignBuilder
协议读取与解析配置
springMvcContract
编解码组件
拦截器
负载均衡
基于容器完整 builder 的初始化
HardCodeTarget
目标调用
请求 url:service/path
接口类型
服务名称
创建代理对象
rabbion 包存在基于负载均衡算法选择一个可用的目标服务器,service=192.168.xx
基于 SpringMVCContract 组件解析生成 methodToHandler
基于 jdk 动态创建创建代理对象注入到 spring 容器中
feign 的调用
调用被 InvocationHandler 动态代理拦截
基于 HardCodeTarget 初步拼接请求
基于 method 找到对应的 handler 来处理请求
如果整合了 ribbon 那么调用对应的 loadBalance() 方法获取一个目标服务
基于 Contract 解析生成完整的调用方式,通过 http client 发起调用(默认是 HttpURLConnection)
负载均衡 rabbion
线性轮询
随机
权重
一致性 hash
最小活跃数
限流熔断 hystrix
线程池隔离
阈值熔断处理
最大并发调用控制
降级逻辑
Eureka 注册中心
server 端
服务启动
读取生成配置文件类 EurekaServerConfig 等配置类
创建 eurekaClient 服务发起网络调用
创建一个集群实例注册表,用于集群结点信息同步
创建 PeerEurekaNodes 集群所有的注册表
初始化从其它节点同步注册数据
服务注册(加写锁)
将服务实列信息放入一个 map 中 ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>
<service,<客户端ID,实例信息>>
多级缓存同步
注册完成后会将 readWriteCacheMap,全量和增量缓存置为无效
多级缓存机制
目的:加速访问
readWriteCacheMap 读写缓存
缓存有效:客户端每隔30S增量抓取
缓存无效(加读锁):从 recentlyChangedQueue 中拉取,然后计算原始注册表 hash 值,客户端merge增量计算hash保证注册表数据一致性
主动过期:服务上下线
被动过期:每隔 180S 过期一次
readOnlyCacheMap 只读缓存
客户端增量抓取读取,没有数据才会去读写缓存查找
每隔 30S 同步一次读写缓存
利弊
多级缓存加速访问
服务上下线延时问题
心跳同步
每隔 30S 一次心跳
根据 service 和客户端 id 找到 Lease 刷新起注册时间即可
服务下线
主动下线
客户端主动下线场景很少删除注册表过期读写缓存即可
故障感知:被动下线
每隔 60 执行一次 EvictionTask
检查注册表中的服务最好注册时间判断是否过期
过期数量大于阈值(总数*0.85)开启网络故障保护机制否则删除注册表中服务和过期读写缓存
客户端感知故障最大时间 60(定时检测) + 30(只读缓存和读写缓存) + 30(定时增量拉取) = 2 分钟
集群同步
每个节点向其它节点同步注册表信息
同步的3层对了批处理机制
只同步客户端注册服务,不同步server再次同步(防止死循环注册)
网络故障保护机制
client 端
服务注册
每隔 30S
全量抓取
初始化的时候全量抓取一次
增量抓取
本地 merge 计算 hash 保障一致性
心跳同步
每隔 30S
spring cloud alibaba
dubbo rpc 框架
分层架构
service
调用与实现的接口
config
ReferenceConfig 调用方
ServiceConfig 发布方
proxy
接口的动态代理实现
registry
注册中心层
cluster
路由层 failover、failfast、failsafe等
monitor
protocol
rpc 装换层 Invocation Result
exchange
交换层请求异步转同步等待响应
transport
传输层一 protocol 为准选用不同的通信方式如 dubbo: netty4
依据通信协议制定内容
serialize
序列化层描述内容改如何传输
服务暴漏
通过 ServiceConfig 暴漏服务
SPI
sentinel 流量治理
nacos 注册/配置中心
数据库检索框架
mybatis
spring data jpa
分布式调度
xxljob
server端
fast 和 slow 2个线程池用来执行调度任务
xxl_job_lock 表加锁,集群同时只能有1台机器执行调度任务
定时任务:从数据库中检索出最近5S内需要执行的任务
没有超时:加入 ring 队列
超时根据不超过5S立即执行
用 fast 调度 ring 队列
client端
启动 netty server 用于接受来自于 server 端的请求
每一个调度任务都由 jobThread 执行
mq
rocketmq
分布式存储 messagequeue
broker 节点集中式存储数据 commitlog
broker 节点分开存储索引文件 consumequeue
高可用 DLedger
多副本冗余机制
raft 算法一致性保障
生产机制
同步发送
异步发送回调通知
批量发送
消息不丢失机制
生产者端
事务消息
broker端
raft 多副本同步算法
消费者端
手动提交偏移量
消费者分配机制
创建 group coordinator
join group
consumber leader 分配消费
结束 reblance
重平衡机制
join group 触发 rebalance
consumber 重新制定分配策略
结束 rebalance 开始消费
顺序消息
分区级别有序
顺序消息写入同一个分区
一个分区只被一个消费者消
内部消费也必须为单线程
kafka
分布式存储
topic
partition
replica->log
logsegment
高可用
直接依赖了 zookeeper 做 ha
partition 所在节点宕机
kafka controller 感知到触发 rebalance
从 isr 列表从头往后取一个可用的即可
broker 宕机
消息不丢失机制
生产端
ack=-1
broker
minIsr >=2
消费者
手动提交偏移量
消费者分配机制
创建 group coordinator
join group
选拔 consumber leader
consumber leader 分配消费策略
通知 group coordinator 通知消费者,结束 rebalance 开始消费
重平衡机制
顺序消息
消息挤压问题处理
消费者数量 < 队列数量则增加消费者
修改代码逻辑快速消费消息然后写入到另外一个队列多的topic
缓存技术
本地缓存 google cache
redis
redis 主从
redis 集群
数据库与缓存一致性保障
缓存设置较短的随机过期时间,再次同步保证一致性
基于 Binlog 同步缓存
缓存雪崩
缓存穿透
缓存击穿
分布式文件存储技术
hdfs
小文件过多导致的性能问题
扩容机制
元数据存储与高可用
namenode 存储文件路径与 block 块的映射关系
active namenode
edits log
接收 standby 的 fsimage 然后清空临界值内的 edits log
过半写入 edits log 到 journal node
journal node
standby namenode
从 journal node 拉取
check point fsimage 然后推送到 active node
数据分包存储机制
数据完整性保障
防篡改
数据高可用机制
客户端文件上传
创建 namenode 文件路径
读取文件 chunk 512字节 + checksum
申请 block 应该存储在哪一台机器以及备份机器节点
将chunk 数据写入 packet
将packet发送到datanode节点
服务器处理文件上传
异步发送给下一个节点后,当前节点进行数据存储
网络安全
xss
csrf
加解密
对称加密
非对称加密
混合加密
数据结构与算法
数组
链表
堆
栈
树
图
算法
分布式一致性算法
raft 协议
zab
paxos
cap与base
hash 算法
一致性 hash 算法
git版本管理规范
git flow 工作流
maven版本管理规范
本地与测试环境 snapshot 包
生产版本 release 包
parent pom 锁定版本
插件
maven 私服
操作系统
linux
磁盘/CPU/内存
用户态与内核态
内存参数调优
最大文件句柄数连接数
最大线程数
置换内存
内存大爷机制
收藏
0 条评论
下一页