自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(14)
  • 收藏
  • 关注

原创 springboot的启动流程

首先springboot的最经典的启动类是。

2024-04-07 19:16:06 1027 1

原创 谈谈为什么三重缓存是必要的

早期对象也就是半成品对象,spring利用半成品对象来提前暴露对象,从而解决循环依赖问题。具体可以看上一篇博客。在解决循环依赖的过程中三重缓存的作用是存放一个lamda表达式,这个表达式的作用是把半成品bean放入二层缓存。所以不改变执行顺序的前提下三层缓存不能缺少,但是如果改变逻辑,没创建一个早期对象就创建一个代理对象就可以省去一层缓存,但得不偿失,没有必要。去掉三层缓存的话,spring的bean就只能存放普通bean而不能存放代理bean了。首先,第一层缓存是必须存在的,因为它用来存放bean对象。

2024-03-22 23:30:00 296 1

原创 源码来看Spring三重缓存

getBean返回了半成品的A,调用applyPropertyValues,获得了完整的B对象。此时B也要经过上面CreateBean,doCreateBean,createBeanInstance,populateBean的流程。doCreateBean调用了createBeanInstance方法来创建实例 ,通过不同的构造策略来实例化,比如说构造器注入,或者是通过反射创建对象等等。当调用getObject方法后会调用传递进来的lamda表达式,也就是调用了createBean方法。

2024-03-20 19:53:30 651 1

原创 spring的循环依赖和三层缓存

spring的循环依赖和三层缓存(第三层后面写)

2024-03-19 23:30:00 216

原创 springbean生命周期

springbean的生命周期简单来说就是创建bean、使用bean、销毁bean。但是spring为了框架的拓展性,添加了更多的步骤。

2024-03-17 20:00:00 1609 1

原创 spring的bean创建(一)

最重要的实现类是ApplicationContext ,可以通过ApplicationContext 直接操作容器,比如通过getBean方法直接使用name获取指定的Bean。spring把不同文件定义的bean转换成相同的BeanDefinition,所以设计了一个BeanDefinitionReader接口,只要实现loadBeanDefinitions方法就可以把定义的bean转化成BeanDefinition。键是bean的名字,值是bean对象。

2024-03-14 19:28:52 665 1

原创 从源码了解zookeeper的会话机制

会话也就是session。zookeeper的接口sessionImpl定义了三个属性sessionId session的唯一标识符timeout session的过期时间isClosing session的关闭状态服务端使用SessionTracker来管理session他将session按照过期的时间点放入不同的桶,这样每次只要访问一个桶就可以清除过期session了。所有可能过期的session都在一个桶里。因此zookeeper的session并不是过期则丢弃的,是定时进行清理。

2024-03-12 19:40:36 386 1

原创 zookeeper数据同步源码

leader读取数据包,并从数据包中获取sid和旧的epoch来构建新的epoch并发送,等待follower的回复,ia.readRecord(ackEpochPacket, "packet");如果follower的zxid大于leader,选择TRUNC模式,发送leader最新的commitedLog来让follower回滚。readPacket(qp),从leader发送的信息里获取新的epoch,zxid,myid。向leader发送数据包,包含自己的epoch,zxid,myid。

2024-03-10 08:00:00 366 1

原创 zookeeper的ZAB协议

强一致性,不管你什么是读取哪一台服务器的数据,每一次读取的数据都是一样的,就算有一台服务器的数据发生了改变,他们读取的数据也是一致的。3、其余节点会向leader发送确认信息,确认自己收到了请求如果leader收到的请求大于一半leader才会提交这个更新。4、当一个节点启动后,他会寻找leader,接收leader发送的数据快照,通过日志的形式恢复数据。1、需要有一个leader领导角色,只有leader能接受写请求,leader会把写请求顺序执行。leader生产一个日志,zxid+1,并持久化。

2024-03-07 19:59:21 328

原创 zookeeper的序列化方法

Serializable中没有进行任何操作,仅仅表示这个类需要序列化,在进行网络传输时,当你使用ObjectOutputStream.writeObject时,writeObject会通过反射获取类结构,并把对象转变成字节流。其中二进制最好用,性能高,占用小,但是不同操作系统下大端小端的存储问题使得不一定能跨平台使用。实现serialize(序列化),deserialize(反序列化),自己实现序列化逻辑。在工作中最常用的序列化格式是JSON,JSON可以跨平台跨语言传输。以DataNode为例。

2024-03-06 19:45:34 304 1

原创 从源码了解Curator的InterProcessMutex

昨天自己写了基于zookeeper的分布式锁,发现会有死锁的问题出现。今天来学习Curator的InterProcessMutex了解怎么解决死锁

2024-03-05 23:30:00 349

原创 zookeeper实现分布式锁

zookeeper提供了分布式环境下的一致性解决方案。借此我们可以实现分布式锁,而zookeeper实现的分布式锁可以有两种形式。

2024-03-04 23:45:00 431

原创 从源码了解zookeeper的选举机制

并拿自己的epoch,zxid,myid和投票中的信息对比,对比优先级为epoch>zxid>myid。如果投票信息大于我的信息就用投票信息更新选票,否则使用我的信息更新选票。如果收到的投票的服务器状态是looking,当它的epoch大于我的逻辑时钟说明我丢失了几次选举,之前所有的投票结果作废,清空recvset,如果是同一个epoch的选票放入recvset中,并检查是否超过一半人数,如果超过,并且leader有效,就返回他的选票。如果二者相等,用我推选的leader和投票信息对比,并更新选票。

2024-03-03 14:14:38 341 1

原创 从源码了解zookeeper的选票消息发送机制

执行listener的run方法,实例化了listenerHandlers并调用了submit方法,既run方法,调用路线run->acceptConnections->receiveConnection->handleConnection。这段代码new了一个CnxnManger对象,该对象负责选举中的所有通信,它有一个内部类Listener用于监听所有通信的socket,Listener是继承了ZooKeeperThread。当接受的myid大于自己的myid时开启接受线程和发送线程。

2024-03-02 12:58:04 346

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除