指令重排序:
https://baijiahao.baidu.com/s?id=1701616903992143186&wfr=spider&for=pc
JVM、JDK、JRE
静态方法为什么不能调用非静态成员?
重载和重写的区别
可变参数
基本数据类型
元空间存放了哪些数据
元空间与堆的关系 https://baijiahao.baidu.com/s?id=1701616903992143186&wfr=spider&for=pc
字符串、字符串常量池原理 https://blog.51cto.com/u_15281317/3008750
指令重排序:
https://baijiahao.baidu.com/s?id=1701616903992143186&wfr=spider&for=pc
JVM、JDK、JRE
静态方法为什么不能调用非静态成员?
重载和重写的区别
可变参数
基本数据类型
元空间存放了哪些数据
元空间与堆的关系 https://baijiahao.baidu.com/s?id=1701616903992143186&wfr=spider&for=pc
字符串、字符串常量池原理 https://blog.51cto.com/u_15281317/3008750
基本数据类型和包装类的区别
基本数据类型和引用类型在JVM中的存储位置:https://blog.csdn.net/guchenjun789/article/details/82903775
包装类的缓存机制
http://redisdoc.com/client_and_server/info.html
主TPS、从TPS、缓存命中、内存使用
Tomcat为什么要打破双亲委派机制
Redis面试题
Redis脑图
https://www.processon.com/view/link/624d3b9a5653bb5d058aad1a#map
布隆过滤器的原理:https://baijiahao.baidu.com/s?id=1681783534561475386&wfr=spider&for=pc
深入理解Redis scan命令:https://blog.csdn.net/Dongguabai/article/details/120431231
手写dubbo
dubbo使用
dubbo整合spring
dubbo服务注册
mysql:
https://github.com/codinglin/StudyNotes/blob/main/MySQL%E5%9F%BA%E7%A1%80%E7%AF%87/MySQL%E5%9F%BA%E7%A1%80%E7%AF%87.md
解析配置文件
是单机?
是集群?
初始化一个NIO或者Netty的通信的工厂类
传递一个端口2181到上面的通信工厂类
将配置很多配置文件中的参数设置的到quorumPeer对象(比如:quorumPeer.setElectionType(config.getElectionAlg()); 这个值默认是3 -》protected int electionAlg = 3;)
quorumPeer.setZKDatabase(new ZKDatabase(quorumPeer.getTxnFactory())); //创建默认节点/zookeeper
看一眼DataTree,其实就是(路径,路径对应的数据)
看一眼DataNode的属性,也就是数据结构
quorumPeer.start();
loadDataBase(); -》zkDb.loadDataBase(); 我们往下跟,会发现加载快照文件和日志文件到内存
startServerCnxnFactory();
cnxnFactory.start(); 绑定2181端口
adminServer.start(); 启动jettyServer,其实就是对外提供了一些状态管理信息,默认8080端口
startLeaderElection()
如果当前节点是LOOKING状态(还没选举,都是LOOKING状态),初始化一个投票
createElectionAlgorithm(3)
listener.start();
初始化ss = new ServerSocket();
绑定选举端口,配置文件中末尾那一列的端口 (选举端口是选举用的,2181是提供给客户端使用的)
ss.accept(); //阻塞在这里,等待其它节点连接。
receiveConnection(client); //处理客户端连接
handleConnection
fle.start();
启动两个线程:wsThread wrThread
我们再看一下上面的两个线程:WorkerSender
看一下run方法:sendqueue.poll, 这里有个阻塞队列,循环拉取消息
如果拉取到了消息:process()
WorkerReceiver线程和上面的类似:manager.pollRecvQueue()
super.start(); // 这个是线程启动,直接看run方法,这里面是选举的核心逻辑
run
LOOKING
lookForLeader
updateProposal // 投自己一票?
sendNotifications //发送选票,就算其它机器没有启动,也会发,只是报错而已
sendqueue.offer(notmsg); //往队列中放选票,往远端去发送消息
recvqueue.poll //获取其它机器给自己的投票
如果一个选票都没有收到
manager.connectAll();
connectOne(sid); 循环和远端的机器去做连接
connectOne(sid, lastProposedView.get(sid).electionAddr)
initiateConnection 最后会调用到这里,和远程机器建立连接
zookeeper学习草稿纸
于 2022-04-06 22:44:02 首次发布