Dubbo源码解析 —— zookeeper连接
前言
上周的dubbo源码解析-远程暴露中讲解了远程暴露的大致过程,但是期间大家也发现了,这个过程涉及到了很多分支,比如 netty
, zookeeper
.当然设计模式就不说了,这个贯穿在整个框架的始终.
但是我也认为,好的源码分析类文章,应该是先整体,后枝干的,就比如如果我们一开始学习 HTML
的时候先把各个标签过一遍,估计可能很多人还没入门就放弃了,比较友好的方式我认为应该是不管三七二十一,先做出一个小的demo,再逐个细节分析.因此我的每周一篇dubbo源码解析也尝试使用该种 先主体,后枝干
的方式.由于 dubbo
涉及到的知识体系(包括一些拓展)比较庞大,所以根据我的估算,以目前一周一篇的形式,到明年的更新不完的.所以可以大胆的关注肥朝的个人简书.
由于本篇涉及到 dubbo
和 zookeeper
的一些知识上的交互,建议简单跑一个 zookeeper
的demo,我也梳理了一下 zookeeper
需要掌握的基本入门知识点.大致如下,如果有兴趣可以留言,后面会陆续更新
插播面试题
- 一般选择什么注册中心,还有别的选择吗?
- dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?(面试高频题)
- 项目中有使用过多线程吗?有的话讲讲你在哪里用到了多线程?(面试高频题)
- zookeeper的java客户端你使用过哪些?
友情提示
由于 服务暴露
这一节的内容几乎是环环相扣的,比如本章节是在上一章节dubbo源码解析-远程暴露中的一个分支的细化讲解.因此不建议跳跃性阅读.建议阅读本篇前先阅读以下几篇
- dubbo源码解析-服务暴露原理
- dubbo源码解析-本地暴露
- dubbo源码解析-远程暴露
前期预热
今天我们要讲的其实就是一行代码.也就是
getRegistry(originInvoker);
的过程.这行代码在上周的 远程暴露
中有提到,细心的你应该有些印象.
![](//upload-images.jianshu.io/upload_images/1041678-611b1fe883def60d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
过程并不复杂,我用一个时序图来理一下思绪
![](//upload-images.jianshu.io/upload_images/1041678-1cfeb7ffd6d8371e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
看到这个时序图是不是感觉太简单了,就三个步骤?优秀的源码都涉及到了大量的设计模式以及面向对象的思想,这里就不得不提一下我之前反复强调的看 继承体系图
了.其实在 newZookeeperRegistry()
的时候,做了很多事,其中就包含了前面提到的高频题.同时看源码也很考验一个人的基础是否扎实,俗话说得好,基础不牢地动山摇.比如下面我给两个非常简单的例子,你输出看看,是否和自己想的一样?
class SubClass extends SuperClass
{
public String name = "SubClass";
}
class SuperClass
{
public String name = "SuperClass";
}
public class Demo
{
public static void main(String[] args)
{
SuperClass clz = new SubClass();
//你觉得这里输出什么?
System.out.println(clz.name);
}
}
public class CodeBlockDemo
{
{
System.out.println("初始化代码");
}
CodeBlockDemo()
{
System.out.println("构造器");
}
static
{
System.out.println("静态代码块");
}
//运行后输出结果?
public static void main(String[] args)
{
{
int a = 10;
//10
System.out.println("局部代码块");
}
new CodeBlockDemo();
new CodeBlockDemo();
new CodeBlockDemo();
}
}
直入主题
从时序图我们从第一个关键词 getRegistry
开始
如果看过上一篇的同学此时对这个抽象方法就很熟悉了,这里又用到了设计模式中的 钩子方法
那么他会调用自己的哪个子类呢?我们来看一下继承体系图
看到这里可能有些同学就有疑惑了, Zookeeper
我认识, Dubbo
我也认识,但是 Multicast
我就不认识了.那么我们回到第一个面试题
一般选择什么注册中心,还有别的选择吗?
这个问题其实我们翻看一下文档,答案迎刃而解.
继续往下走,根据时序图,我们似乎看到了最后一个步骤,那是不是说明本篇接近了尾声?不,还有三个面试题还没解答,现在战斗才刚刚开始
我们来看看 ZookeeperRegistry
的继承体系图
根据继承体系图,我们打好断点往下走,现在我们引出第二个面试题,也是dubbo面试中的高频题
dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?
答案是可以的,为什么呢?我们看下面三个图,我们看到zookeeper的信息会缓存到本地作为一个缓存文件,并且转换成 properties
对象方便使用.
项目中有使用过多线程吗?有的话讲讲你在哪里用到了多线程?
这里的做法是,建立线程池,定时的检测并连接注册中心,如果失败了就重连.其实也就是一个 定时任务执行器
.可能你做了两三年java还没真正在项目中开启过线程,问到这个问题时菊花一紧,但是 定时任务执行器
这种需求在项目中还是很常见的,你可以参考这个例子,把你们的定时任务场景和这里的多线程用法套在一起,云淡风轻的这么一回答,还不是棒棒哒?
继续往下走,我们来看第四个面试题
zookeeper的java客户端你使用过哪些?
我们看一下 zookeeperTransporter
的类图和继承体系图
从继承体系图我们就只有,zookeeper是支持 ZkClient
和 Curator
两种java客户端(其实就类似jedis是redis的java客户端一样),同时 @SPI("zkclient")
这里就可以看出它默认是用 ZkClient
的(原因关注肥朝,后续讲解)
继续往下走
这里是 ZkClient
的api,主要也就是一些监听和处理,我们在 dubbo拓展专题-zookeeper
再细说
本篇开头也说了,本篇讲的就是一行代码
getRegistry(originInvoker);
看到这里 returnregistry
,也就预告了本篇接近了尾声
写在末尾
写到这里是时候已经是星期天了的凌晨,当你决心坚持去做一件事的时候,才会注意到,期间会遇到各种阻力和意外.这是dubbo源码解析的第九篇,也就是坚持周更超过两个月.正如前面所说,战斗才刚刚开始.我们下周见.鉴于本人才疏学浅,不对的地方还望斧正,也欢迎关注我的简书,名称为 肥朝
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Hive SQL经典优化案例
- 树莓派基础实验8:振动开关实验
- 几行代码实现cookie的盗取
- 从apollo的初始化看spring boot 1.5.3启动过程( 一)
- CSRF(跨站请求伪造)学习总结
- windows mysql 8.0 ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
- 树莓派基础实验9:蜂鸣器实验
- 浅谈文件上传漏洞(客户端JS检测绕过)
- java字符串操作:如何实现字符串的反转及替换?
- 树莓派基础实验10:干簧管传感器实验
- Java 字节流 字符流 io流
- 写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分 隔。
- 树莓派基础实验11:U型光电传感器实验
- java 缓冲流+原理图解
- 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要 求字符串中的中文不能出现乱码