Zookeeper源码分析

浪子不回头ぞ 提交于 2021-02-04 08:21:44

download:Zookeeper源码分析

Zookeeper作为阿里系与Dubbo完美搭配的注册中心,其江湖地位毋容置疑。本课程以最开始图解Zookeeper框架的架构和组件作为课程总起,进而“分而治之”各个击破Zookeeper框架的各个组件源码,如:序列化,数据模型,持久化,Client和Server架构、选举流程等,最后通过总结快速梳理所得。
适合人群
有代码洁癖的中高级Java工程师
从事分布式系统设计和开发的极客
认可“源码驱动式”学习方式的学生党
技术储备要求
Java基础扎实,对IO/NIO网络通信等知识有一定了解
了解序列化、持久化、多线程
了解zookeeper的一般使用命令

char const const pc = "123abc"; //这个pc指向的地址和内容都不变,极端状况
printf("pc content is %c\n",
pc);//用于输出 指向的特定字符
printf("pc string content is %s\n" , pc);//用于输出整个字符串(缘由????)

/9.a指针函数(本质是一个函数,返回值是一个指针) b函数指针(函数名是一个指针)的区别/
/
//类型标识符 函数名(参数表)
a.int* f(x,y); 指针函数

b.int (f) (int x); //声明一个函数指针
  f=func; //将func函数的首地址赋给指针f(回调函数的变相运用)

/

/ 函数指针的应用实例------回调函数(写一个通用的数比拟的回调函数,应用于不同的数据类型) 转换表(简化袖珍式计算器不用switch) /
printf("--------------------------分割开来------------------------------\n");

/* 数组指针(定义 int (*p)[n])

()优先级高,首先阐明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也能够说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度

  • 指针数组(定义 int p[n])
    []优先级高,先与p分离成为一个数组,再由int*阐明这是一个整型指针数组,它有n个指针类型的数组元素
  •  
  • */
    printf("--------------------------9------------------------------\n");

    /10. static修饰部分变量的运用/
    printf("--------------------------10------------------------------\n");
    /* 1.该静态部分变量n在全局数据辨别配内存,而不是栈里面;

    • 2.静态部分变量在程序执行到该对象的声明处时被初次初始化,即以后的函数调用不再停止初始化;
    • 3.静态部分变量普通在声明处初始化,假如没有显式初始化,会被程序自动初始化为0;
    • 4.它一直驻留在全局数据区,直到程序运转完毕。但其作用域为部分作用域,当定义它的函数或语句块完毕时,其作用域随之完毕;*/
      teststatic();
      teststatic();
      teststatic();

    /*11. 逻辑移位 算数移位(算数左移和逻辑左移的结果分歧,只要负数的两种右移的值不一样,

    • 详细是逻辑右移还是算数右移 与编译器有关(经过这个能够判别编译器的类型,补1支持算数,补0逻辑,这个能够区别在C言语停止移植的时分作用严重),
    • 从下面的结果来看 这个是逻辑数补充1的)*/
      printf("--------------------------11------------------------------\n");
      int h = -2;
      int h1 = h >> 1;
      int h2 = h >> 5;
      int h3 = h >> 10;
      printf("h1 = %d\n",h1);
      printf("h2 = %d\n",h2);
      printf("h3 = %d\n",h3);

    /char 类型的变量右移操作状况思索越界和计算机内存的原反补码状况 能够用下面的几组值来肯定本编译器能否默许为char有符号型/
    char sq = 153; //在C言语中默许的根底数据构造是signed ---char截取低八位1001101-----由于首位是1,因而是一个负数的补码(计算机中都是以补码存在,整数的原反补相同,负数的不同),移位之后1110011(负数补码-源码,符号位不变,后面的数据位取反加一)
    printf("sq = %d\n",sq >> 4);//-7的缘由在上面 解释(重要)

    char sq1 = 127; //没有越界,能够
    printf("sq1 = %d\n",sq1 >> 4);//7

    char sq2 = 128; //同153
    printf("sq2 = %d\n",sq2 >> 4);//-8

    int h0 = -2;//-2的 有符号形右移(0x1111111111111110),右移超越1位之后时钟是-1,务必留意这一点(负数的逻辑右移是重点)
    printf("左移时,末位补0,右移时,首位补1。\n");
    Show(h0);
    printf("左移4位后:");
    Show(h0 << 4);
    printf("右移4位后:");
    Show(h0 >> 4);

    short n1 = -1280;
    printf("左移时,末位补0,右移时,首位补1。\n");
    Show(n1);
    printf("左移4位后:");
    Show(n1 << 4);
    printf("右移4位后:");
    Show(n1 >> 4);

    / 12. 位运算经典实例常用 三种位操作/
    printf("--------------------------12------------------------------\n");
    /应用复合赋值符优势(value的值只计算一次,打字错误的可能性更小)把特定的位 设置为1 把特定的位设置为 0/
    int value = 0;
    value |= 1 << 1; //特定位置1
    printf("value = %d \n",value);

    value &= ~(1 << 1);//特定位置0
    printf("value = %d \n",value);

    value = 3;
    value &= 1 << 1; //提取特定位置1的值,其他位置清零
    printf("value = %d \n",value);

    / 13. 左值 右值(左值意味着计算机内存中一个位置 右值意味着一个值 数组的名不能作为左值,左值能够作为右值运用,反过来是不能够的)/
    printf("--------------------------13------------------------------\n");
    int a13 = 12;
    int b13 = 13;
    //b13 + 1 = a13;非法的右值作为左值
    b13 = a13;
    printf("b13 = %d \n",b13);

    / 14. 指针的地址和内容/
    printf("--------------------------14------------------------------\n");

    /非法运用,NULL解援用()和编译器有关,因而比拟好的编程习气是在运用之前,首先判别指针 != NULL在运用,不然程序有潜在的风险
    int
    p = NULL;
    printf("p = %d \n",p);
    */

    //int g = 0;
    //int p = &g;
    int
    p = 0;
    if (p != NULL)//指针解援用的标准用法
    {
    printf("p = %d \n",p);
    }
    //printf("p = %x \n",p);

    /15. 指针的指针 /
    printf("--------------------------15------------------------------\n");
    int p1 = 12;// p1作为左值的时分表示内存地址,存储12的位置,当做为右值是表示存储的内容12
    int *p2 = &p1;
    int p3 = &p2;//指针的指针
    //int
    p4 = p2;//非法,
    if (&p2 != p2)//&p2和&p1一样(指针变量p2和普通的变量p1都是变量,&表示得到p2在内存中的地址) p2 == &p1(该内存中存储的值),以上两种表达方式,左值右值的代表的含义不一样

第1章 【開宗明義】縱觀全貌
經過思想導圖樹立全课程骨架,理解课程豐厚的學問點。

1-1 Zookeeper源码序章【只學有用的】試看
1-2 環境搭建
1-3 散佈式環境搭建1
1-4 散佈式環境搭建2
第2章 ZooKeeper之序列化組件源码解析【透視現象,直擊實質】
本章内容主要引見了序列化的目的、序列化的思想,同時對zookeeper序列化jute與java serialized停止了比擬,可以更深入的理解到序列化的實質,以及後續工作當選择序列化的規範。

2-1 章序-探究java-serialized序列化實質【抛砖引玉】
2-2 jute序列化其實能夠很简單【简單但不失精要】
2-3 大PK:zk-jute VS java-serialized【沒有比照就沒有傷害】試看
2-4 序列化-中心歸結【大纲掣領】
第3章 係統模型【九層之台,起於壘土】
本章内容從節點信息、權限信息、通知機製等三個方面引見了zookeeper的根底數據模型,並理解節點樹形構造的構建、權限緩存的完成方式、通知機製的觸發與注册

3-1 章序-數據模型【抛砖引玉】
3-2 概論-watch通知機製
3-3 概論-ACL-part1
3-4 概論-ACL-part2
3-5 深度探究datatree節點處置流程
3-6 datatree耐久化的中心-序列化與反序列化
3-7 係統模型-中心歸結【大纲掣領】
第4章 耐久化【高手過招必備】
本章細致地引見了zookeeper的兩種耐久化方式FileTxnLog和Snapshot,同時引見了兩者如何協同完成數據的耐久化,以及數據快速内存化,完成宕機時不丢數據,宕機後快速恢復的目的

4-1 章序-耐久化學習纲要與目的【抛砖引玉】
4-2 耐久化-概览
4-3 圖解耐久化類關係【千言萬语不如一圖奏效】試看
4-4 耐久化-不可不晓得的snapshot
4-5 耐久化-snapshot-加载也很有考究
4-6 耐久化-FileTxnLog之數據加载與截斷
4-7 耐久化-FileTxnSnapLog之耐久化與數據加载
4-8 耐久化-中心歸結【大纲掣領】
第5章 客戶端設計 【多快穩準是不變的請求】
本章主要引見了如何在不運用框架的前提下設計一個長衔接的網络客戶端,同時包括如何維持長衔接、客戶端api如何完成異步和同步、網络通訊構造

5-1 章序-客戶端【抛砖引玉】
5-2 圖解客戶端中心類關係【一圖勝千言】
5-3 一步步搞懂客戶端的啟動【UML時序圖理清流程】
5-4 客戶端-向高手學習同步與異步的完成方式
5-5 客戶端-小小的watch與背後的音訊流轉-事情注册與觸發
5-6 客戶端-中心技術歸結【大纲掣領】
第6章 效勞器啟動 【由浅入深,先學好單機版,才幹控製集群版】
本章分別從單機和集群兩種角度來引見了zookeeper的啟動步骤,包括數據的快速加载、清算機製;同時解說下在單機版效勞啟動後,事務懇求與非事務懇求的流程剖析以及通知機製

6-1 效勞端-概要阐明
6-2 效勞端-單機版效勞啟動流程
6-3 效勞端-集群版效勞啟動流程,其實沒有想象的那麼難
6-4 效勞端-義務链還是很普遍的,單機版業務處置流程
6-5 效勞端-單機版非事務懇求剖析
6-6 效勞端-單機版事務懇求剖析
6-7 效勞端-全流程贯穿watch事情與注册
6-8 效勞端-中心技術匯總
第7章 會話管理 【無處不在的會話其實沒那麼難】
效勞端是如何管理客戶端;長衔接的客戶端又是如何堅持通訊链路激活的;呈現通訊掉链的狀況又是如何檢測的;效勞端又是如何清算僵屍客戶端的;會話,一個效勞端避不開的話題;本章著重引見了zookeeper會話的狀態、創立、管理以及清算...

7-1 會話創立
7-2 會話管理戰略
7-3 會話管理戰略-源码剖析
7-4 會話激活
7-5 會話-中心技術匯總
第8章 選舉流程 【Zookeeper無法避開的話題】
本章主要引見了zookeeper的重要课題-選舉流程fastleader。fastleader的到底是什麼,各個角色到底是如何選主,選主的規範是什麼,選主的完成方式是什麼

8-1 選舉流程剖析
8-2 主要類阐明
8-3 快速選舉源码剖析-流程剖析
8-4 快速選舉源码剖析-流程剖析2
8-5 快速選舉源码剖析-網络剖析
8-6 選舉-课程總結
第9章 業務處置 【看似驚涛骇浪,實則暗流湧動】
選舉後leader、follower、observer三個角色的數據如何完成同步,事物懇求和非事物懇求在不同節點下是如何處置的,一個事物懇求在不同節點之間到底發作了什麼;本章分別從選舉後初始化的數據同步、運轉期業務處置以及運轉期間的链接激活等幾個方面著手,講述了leader、follower、observer在不同場景下所扮演的角色...

9-1 概要阐明
9-2 數據同步與初始化-概览
9-3 數據同步之-Learner剖析
9-4 數據同步之-LearnerHandler剖析
9-5 二階段提交與zookeeper
9-6 简析二階段提交與zookeeper
9-7 各requestprocessor解析
9-8 Leader事務懇求處置剖析
9-9 Follower與Observer懇求處置剖析
9-10 本章中心匯總
第10章 Zookeeper的散佈式鎖的完成
本章先引見散佈式鎖相關學問,進一步解說Zookeeper散佈式鎖的完成,最後停止優化。

10-1 散佈式鎖概論
10-2 散佈式鎖源码完成
10-3 散佈式鎖源码完成2
10-4 散佈式鎖的優化
第11章 Zookeeper客戶端Curator
本章解說Zookeeper客戶端Curator。從根底的CURD開端進階到watch通知機智,最後對前面的散佈式鎖停止復盤。

11-1 初識curator
11-2 Curator增删改查
11-3 watch通知
11-4 再論散佈式鎖
第12章 效勞端拓展
本章節補充效勞端拓展相關學問點: 效勞端啟動與加载調試、非事務懇求調試、效勞端事務懇求調試、客戶端音訊發送調試、 客戶端事情觸發調試、 watch事情效勞端處置調試等

12-1 效勞端啟動與加载調試
12-2 效勞器端非事務懇求調試
12-3 效勞端事務懇求調試
12-4 客戶端音訊發送調試
12-5 客戶端事情觸發調試
12-6 watch事情效勞端處置調試
第13章 終章回首
停止全课程的總結梳理。

13-1 全课程總結
本课程持續更新中

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!