<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[badly的博客]]></title><description><![CDATA[努力成就非凡]]></description><link>https://blog.youkuaiyun.com/liereli</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; liereli]]></copyright><item><title><![CDATA[git统计个人代码行数]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/119349792</link><guid>https://blog.youkuaiyun.com/liereli/article/details/119349792</guid><author>liereli</author><pubDate>Tue, 03 Aug 2021 14:45:17 +0800</pubDate><description><![CDATA[git log --since="开始日期" --before="结束日期" --author="提交账号" --pretty=tformat: --numstat | awk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }'



执行之后可见如下结果：

added lines: 19697 rem]]></description><category></category></item><item><title><![CDATA[基于java socket来进行网络通信的小例子]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/108251297</link><guid>https://blog.youkuaiyun.com/liereli/article/details/108251297</guid><author>liereli</author><pubDate>Thu, 27 Aug 2020 06:12:01 +0800</pubDate><description><![CDATA[在之前分析zookeeper源码的过程当中，有两个地方使用到了基于java socket进行通信的地方

第一个地方是在集群启动时，集群节点之间会发起leader投票选举，此时zookeeper底层是基于java socket来进行网络通信的，感兴趣的小伙伴可以看手把手带你撸zookeeper源码-zookeeper启动(三)(zookeeper选举时是如何基于socket建立连接的)这篇文章

第二个地方是当集群中新加入一个zk节点或者某个节点宕机恢复启动的时候，需要恢复数据，并且从leader中同步..]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-客户端如何发送数据到zk集群服务端的]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/108248550</link><guid>https://blog.youkuaiyun.com/liereli/article/details/108248550</guid><author>liereli</author><pubDate>Wed, 26 Aug 2020 22:50:53 +0800</pubDate><description><![CDATA[接上篇文章继续分析手把手带你撸zookeeper源码-zookeeper客户端如何和zk集群创建连接



上篇文章我们分析到了org.apache.zookeeper.ClientCnxn.SendThread#primeConnection 这个方法里面的代码，我粘贴几行比较重要的代码如下


// 创建链接请求的对象
 ConnectRequest conReq = new ConnectRequest(0, lastZxid,
                    sessionTimeout..]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper客户端如何和zk集群创建连接]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/108229850</link><guid>https://blog.youkuaiyun.com/liereli/article/details/108229850</guid><author>liereli</author><pubDate>Tue, 25 Aug 2020 22:46:35 +0800</pubDate><description><![CDATA[上篇文章手把手带你撸zookeeper源码-zookeeper集群如何接收客户端的连接的分析了zk集群通过监听2181端口，通过NIO的方式来等待客户端的连接，这篇文章我们主要分析一下看看客户端如何去和zk集群创建连接的

客户端的入口类是org.apache.zookeeper.ZooKeeper, 如果大家通过原生的代码使用zookeeper客户端和服务段建立连接的时候，就是首先需要实例化一个Zookeeper对象，然后传递zk集群的节点ip和端口号，设置超时时间，以及监听器


public Zo..]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper集群如何接收客户端的连接的]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/108170804</link><guid>https://blog.youkuaiyun.com/liereli/article/details/108170804</guid><author>liereli</author><pubDate>Sat, 22 Aug 2020 18:05:37 +0800</pubDate><description><![CDATA[截止到目前为止, zookeeper集群启动时如何进行leader选举以及正常启动、故障恢复时zookeeper如何去恢复内存数据, 如何去leader中同步数据，这两大点都已经分析完了，感兴趣的小伙伴可以去看一下之前的文章手把手带你撸zookeeper源码系列目录

接下里该分析客户端连接集群的代码了，如: 客户端如何和客户端建立的连接、会话是如何创建的、zk集群如何去维护会话的、客户端的创建、删除、修改、查询等操作、持久化节点、临时节点、以及监听通知如何实现的、写请求如何转发到leader上然后lea.]]></description><category></category></item><item><title><![CDATA[记不住的四种位运算]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/108130782</link><guid>https://blog.youkuaiyun.com/liereli/article/details/108130782</guid><author>liereli</author><pubDate>Thu, 20 Aug 2020 19:30:22 +0800</pubDate><description><![CDATA[运算表

符号
			描述
			运算规则
		&amp;
			与
			
			1 &amp; 1 = 1

			1 &amp; 0 = 0

			0 &amp; 1 = 0

			0 &amp; 0 = 0
			
		|
			或
			
			1 | 1 = 1

			1 | 0 = 1

			0 | 1 = 1

			0 | 0 = 0
			
		^
			异或
			
			1 ^ 1 = 0

			1 ^ 0 = 1

			0 ^ 1 = 1

			0 ^ 0 = 0
	]]></description><category></category></item><item><title><![CDATA[深入java底层源码, 揭开ArrayList神秘面纱]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/108091661</link><guid>https://blog.youkuaiyun.com/liereli/article/details/108091661</guid><author>liereli</author><pubDate>Wed, 19 Aug 2020 07:23:49 +0800</pubDate><description><![CDATA[一般情况下，当我们想用一个List集合时，首先想到的是ArrayList，其次就是LinkedList，但是我相信大部分小伙伴在项目中用到的ArrayList远比LinkedList，为什么呢？什么样的情况下优先选择ArrayList，什么样的情况下优先选择LinkedList? 哪种数据结构在什么样的条件下的性能更好？以及为什么在阿里开发规范中对集合要强调必须要初始化大小呢？还有为什么在并发情况下去remove数据的时候会出现ConcurrentModificationException呢？等等，我们将先]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper集群之间如何进行ping探活机制]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/108031532</link><guid>https://blog.youkuaiyun.com/liereli/article/details/108031532</guid><author>liereli</author><pubDate>Sun, 16 Aug 2020 07:24:59 +0800</pubDate><description><![CDATA[上两篇文章

手把手带你撸zookeeper源码-zookeeper故障重启时如何恢复数据(一)

手把手带你撸zookeeper源码-zookeeper故障重启时如何恢复数据(二)

已经详细的把zookeeper故障重启时如何恢复数据给详细的剖析完了，这篇文章我们继续剖析一下在leader和follower数据同步完成之后，leader还会继续做哪些事情，以及如何实现ping机制的

在上篇文章讲到leader同步完数据之后，会发送一个UPTODATE的通知给follower，表示数据已经同步完毕，fo]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper故障重启时如何恢复数据(二)]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/108022874</link><guid>https://blog.youkuaiyun.com/liereli/article/details/108022874</guid><author>liereli</author><pubDate>Sat, 15 Aug 2020 18:10:49 +0800</pubDate><description><![CDATA[上篇文章手把手带你撸zookeeper源码-zookeeper故障重启时如何恢复数据(一)分析了在zookeeper启动的时候从本地日志文件中如何恢复数据，先获取快照文件中的数据然后反序列化到内存中，接着再对日志文件进行增量逐条回放，本篇文章详细分析一下在启动的时候如何和leader建立连接，然后从leader中如何同步数据到本地内存的



如果当前存在一个zookeeper集群，现在不管是对原有的zookeeper进行重启，还是新加入一台zookeeper节点，此时zookeeper要么是obse...]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper故障重启时如何恢复数据(一)]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/107992115</link><guid>https://blog.youkuaiyun.com/liereli/article/details/107992115</guid><author>liereli</author><pubDate>Thu, 13 Aug 2020 22:31:23 +0800</pubDate><description><![CDATA[在之前的文章手把手带你撸zookeeper源码-zookeeper中follower启动的时候会做什么?有分析过一部分follower启动时会调用syncWithLeader(zxid)方法, 此时方法会从leader中同步数据，但是回过头来看，感觉分析的不够深入，所以准备单独拉取出来一篇文章，来分析一下当follower启动时如何恢复数据的



其实当一个zookeeper进程启动加入现有集群时，会有以下几种情况:

1、当前zookeeper是新增的服务器, 然后作为observer角色加入集群...]]></description><category></category></item><item><title><![CDATA[Java基础面试题看过来]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/107901805</link><guid>https://blog.youkuaiyun.com/liereli/article/details/107901805</guid><author>liereli</author><pubDate>Sun, 09 Aug 2020 22:38:07 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper的sessionId生成策略和follower调用链初始化]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/107891259</link><guid>https://blog.youkuaiyun.com/liereli/article/details/107891259</guid><author>liereli</author><pubDate>Sun, 09 Aug 2020 12:07:36 +0800</pubDate><description><![CDATA[继上篇文章手把手带你撸zookeeper源码-zookeeper中follower启动的时候会做什么?，分析到了follower启动之后和leader建立了链接，并且把自己本地最新的zxid发送给leader，然后leader根据follower发送过来的zxid来判断如何把最新的数据同步给follower



今天继续分析Learner.syncWithLeader()方法中的代码, 首先我们来看下面的一行代码


zk.createSessionTracker();

看字面意思是创建会话跟踪器，..]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper中follower启动的时候会做什么?]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/107875454</link><guid>https://blog.youkuaiyun.com/liereli/article/details/107875454</guid><author>liereli</author><pubDate>Sat, 08 Aug 2020 11:17:22 +0800</pubDate><description><![CDATA[上篇文章手把手带你撸zookeeper源码-zookeeper通信序列化协议，简单说了一下zookeeper的jute序列化通信协议，写了一个简单的demo，以及如何避免粘包和拆包的，也顺带写了一点有关dubbo的序列化协议和如何自己自定义序列化协议



回到上上篇文章手把手带你撸zookeeper源码-zookeeper确定好角色后会做什么？主要分析了zookeer中leader启动的时候都会做些什么事，分析到了leader启动的时候会对server.x=zk1:2888:3888，中的2888端...]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper通信序列化协议]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/107826354</link><guid>https://blog.youkuaiyun.com/liereli/article/details/107826354</guid><author>liereli</author><pubDate>Wed, 05 Aug 2020 22:31:23 +0800</pubDate><description><![CDATA[上篇文章分析到了zookeeper集群之间通信时用到了jute序列化协议，本篇文章来简单了解jute如何序列化和反序列化以及如何解决粘包拆包的问题的

今天上网看了一下查了一下zookeeper jute，其实网上也有很多这方面的资料，我就简单的写了一个demo先来展示一下，最后给大家一点自己如何自定义传输协议，如何解决粘包拆包的问题


...]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper确定好角色后会做什么？]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/107774543</link><guid>https://blog.youkuaiyun.com/liereli/article/details/107774543</guid><author>liereli</author><pubDate>Mon, 03 Aug 2020 23:14:56 +0800</pubDate><description><![CDATA[接上文手把手带你撸zookeeper源码-zookeeper启动(五)leader选举投票归档-确认当前zk服务的角色

上篇文章主要分析了leader选举的最终阶段，根据zk集群的相互投票之后，进行投票归档，然后判断某个zk获得投票数是否大于集群数量的一半，如果未超过一半，则继续下一轮的投票选举，如果有某个zk有超过一半的选票，则leader确定，然后其他zk服务则为follower或者observer

不知道大家有没有搭建过三台zk的集群，如果你是按照myid从小到大依次启动三台服务器，一般情况下都.]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper启动(五)leader选举投票归档-确认当前zk服务的角色]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/107745945</link><guid>https://blog.youkuaiyun.com/liereli/article/details/107745945</guid><author>liereli</author><pubDate>Sun, 02 Aug 2020 16:12:59 +0800</pubDate><description><![CDATA[接上文手把手带你撸zookeeper源码-zookeeper启动(四)leader选举投票发送以及响应



本篇文章主要来看看当每个zk接收到其他服务器发送过来的投票之后，接下来会怎么处理


 //投票归档
                        recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch));

                        if (termPredicate(rec..]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper启动(四)leader选举投票发送以及响应]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/107738185</link><guid>https://blog.youkuaiyun.com/liereli/article/details/107738185</guid><author>liereli</author><pubDate>Sun, 02 Aug 2020 06:26:02 +0800</pubDate><description><![CDATA[上篇文章手把手带你撸zookeeper源码-zookeeper启动(三)(zookeeper选举时是如何基于socket建立连接的)写了zookeeper集群之间如何基于socket建立的连接，连接建立完毕之后，接下来就是开始发送投票和接收投票，然后对投票结果进行整理，最终选定哪台服务器是leader，哪个是follower

本篇文章我们接着看一下投票数据是如何发送出去的，以及如何接收到其他zk服务器发送过来的投票数据

结合上篇文章所讲，我们知道，QuorumCnxManager.toSend()...]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码系列目录]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/107738119</link><guid>https://blog.youkuaiyun.com/liereli/article/details/107738119</guid><author>liereli</author><pubDate>Sat, 01 Aug 2020 22:45:29 +0800</pubDate><description><![CDATA[手把手带你撸zookeeper源码(前言)
	
	
	手把手带你撸zookeeper源码(配置文件)
	
	
	手把手带你撸zookeeper源码(如何启动一个zookeeper服务)
	
	
	手把手带你撸zookeeper源码-从源码角度分析zookeeper启动时都做了什么？
	
	
	手把手带你撸zookeeper源码-zookeeper启动(二)
	
	
	手把手带你撸zookeeper源码-zookeeper启动(三)(zookeeper选举时是如何基于socket建立连接的)
	
...]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper启动(三)(zookeeper选举时是如何基于socket建立连接的)]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/107732477</link><guid>https://blog.youkuaiyun.com/liereli/article/details/107732477</guid><author>liereli</author><pubDate>Sat, 01 Aug 2020 17:37:08 +0800</pubDate><description><![CDATA[接上文手把手带你撸zookeeper源码-zookeeper启动(二)



结合上两篇文章写的zookeeper启动时，都干了些什么，画了一张图，把涉及到的组件都在图中给展示出来，大家可以参考一下



在这个图片中把之前写的源码中的所有组件都给包括了，以及每个组件是做什么用的，接下来我们会一步步的去梳理整个zookeeper源码，也会把这张图给进一步完善，最终形成一个完整的zookeeper架构原理图的

上篇文章最后，我们知道调用到QuorumPeer.start方法中，在这个方法中做了好几件事，..]]></description><category></category></item><item><title><![CDATA[手把手带你撸zookeeper源码-zookeeper启动(二)]]></title><link>https://blog.youkuaiyun.com/liereli/article/details/107676650</link><guid>https://blog.youkuaiyun.com/liereli/article/details/107676650</guid><author>liereli</author><pubDate>Wed, 29 Jul 2020 23:11:12 +0800</pubDate><description><![CDATA[接上文手把手带你撸zookeeper源码-从源码角度分析zookeeper启动时都做了什么？

先说点题外话，因为我想着把整个zookeeper源码分析作为系列文章来写，所以每一篇文章只会分析一部分源码，而不是长篇大论去粘贴源码，然后哪个方法进入哪个方法，然后一带而过。而是抓住主线，然后去分析主要方法，用我的理解，用通俗的语言通过书面的形式表达出来，希望对想学习zookeeper源码的你有帮助

先抛出个目标，本篇文章主要写一下zookeeper集群之间是如何建立连接的？

先贴一下上文最后的一段代码，有.]]></description><category></category></item></channel></rss>