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