dubbo源码解析-zookeeper连接

撸了今年阿里、腾讯和美团的面试,我有一个重要发现…….

作者:肥朝

出处:https://www.jianshu.com/nb/6137390


201907121009_1.png

前言

上周的dubbo源码解析-远程暴露中讲解了远程暴露的大致过程,但是期间大家也发现了,这个过程涉及到了很多分支,比如netty,zookeeper.当然设计模式就不说了,这个贯穿在整个框架的始终.

但是我也认为,好的源码分析类文章,应该是先整体,后枝干的,就比如如果我们一开始学习HTML的时候先把各个标签过一遍,估计可能很多人还没入门就放弃了,比较友好的方式我认为应该是不管三七二十一,先做出一个小的demo,再逐个细节分析.因此我的每周一篇dubbo源码解析也尝试使用该种先主体,后枝干的方式.由于dubbo涉及到的知识体系(包括一些拓展)比较庞大,所以根据我的估算,以目前一周一篇的形式,到明年的更新不完的.所以可以大胆的关注肥朝的个人简书.

由于本篇涉及到dubbozookeeper的一些知识上的交互,建议简单跑一个zookeeper的demo,我也梳理了一下zookeeper需要掌握的基本入门知识点.大致如下,如果有兴趣可以留言,后面会陆续更新

201907121009_2.png

插播面试题

  • 一般选择什么注册中心,还有别的选择吗?
  • dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?(面试高频题)
  • 项目中有使用过多线程吗?有的话讲讲你在哪里用到了多线程?(面试高频题)
  • zookeeper的java客户端你使用过哪些?

友情提示

由于服务暴露这一节的内容几乎是环环相扣的,比如本章节是在上一章节dubbo源码解析-远程暴露中的一个分支的细化讲解.因此不建议跳跃性阅读.建议阅读本篇前先阅读以下几篇

前期预热

今天我们要讲的其实就是一行代码.也就是

    getRegistry(originInvoker);

的过程.这行代码在上周的远程暴露中有提到,细心的你应该有些印象.

201907121009_3.png

过程并不复杂,我用一个时序图来理一下思绪

201907121009_4.png

看到这个时序图是不是感觉太简单了,就三个步骤?优秀的源码都涉及到了大量的设计模式以及面向对象的思想,这里就不得不提一下我之前反复强调的看继承体系图了.其实在new ZookeeperRegistry()的时候,做了很多事,其中就包含了前面提到的高频题.同时看源码也很考验一个人的基础是否扎实,俗话说得好,基础不牢地动山摇.比如下面我给两个非常简单的例子,你输出看看,是否和自己想的一样?

    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开始

201907121009_5.png

如果看过上一篇的同学此时对这个抽象方法就很熟悉了,这里又用到了设计模式中的钩子方法

201907121009_6.png

那么他会调用自己的哪个子类呢?我们来看一下继承体系图

201907121009_7.png

看到这里可能有些同学就有疑惑了,Zookeeper我认识,Dubbo我也认识,但是Multicast我就不认识了.那么我们回到第一个面试题

一般选择什么注册中心,还有别的选择吗?

这个问题其实我们翻看一下文档,答案迎刃而解.

201907121009_8.png

继续往下走,根据时序图,我们似乎看到了最后一个步骤,那是不是说明本篇接近了尾声?不,还有三个面试题还没解答,现在战斗才刚刚开始

201907121009_9.png

201907121009_10.png

我们来看看ZookeeperRegistry的继承体系图

201907121009_11.png

根据继承体系图,我们打好断点往下走,现在我们引出第二个面试题,也是dubbo面试中的高频题

dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?

答案是可以的,为什么呢?我们看下面三个图,我们看到zookeeper的信息会缓存到本地作为一个缓存文件,并且转换成properties对象方便使用.

201907121009_12.png

201907121009_13.png

201907121009_14.png

继续往下走,下面引申一下第三道面试题

项目中有使用过多线程吗?有的话讲讲你在哪里用到了多线程?

这里的做法是,建立线程池,定时的检测并连接注册中心,如果失败了就重连.其实也就是一个定时任务执行器.可能你做了两三年java还没真正在项目中开启过线程,问到这个问题时菊花一紧,但是定时任务执行器这种需求在项目中还是很常见的,你可以参考这个例子,把你们的定时任务场景和这里的多线程用法套在一起,云淡风轻的这么一回答,还不是棒棒哒?

201907121009_15.png

继续往下走,我们来看第四个面试题

zookeeper的java客户端你使用过哪些?

201907121009_16.png

我们看一下zookeeperTransporter的类图和继承体系图

201907121009_17.png

201907121009_18.png

从继承体系图我们就只有,zookeeper是支持ZkClientCurator两种java客户端(其实就类似jedis是redis的java客户端一样),同时@SPI("zkclient")这里就可以看出它默认是用ZkClient的(原因关注肥朝,后续讲解)

继续往下走

201907121009_19.png

201907121009_20.png

这里是ZkClient的api,主要也就是一些监听和处理,我们在dubbo拓展专题-zookeeper再细说

201907121009_21.png

201907121009_22.png

本篇开头也说了,本篇讲的就是一行代码

    getRegistry(originInvoker);

看到这里return registry,也就预告了本篇接近了尾声

201907121009_23.png

写在末尾

写到这里是时候已经是星期天了的凌晨,当你决心坚持去做一件事的时候,才会注意到,期间会遇到各种阻力和意外.这是dubbo源码解析的第九篇,也就是坚持周更超过两个月.正如前面所说,战斗才刚刚开始.我们下周见.鉴于本人才疏学浅,不对的地方还望斧正.

赞(0) 打赏

如未加特殊说明,此网站文章均为原创,转载必须注明出处。Java 技术驿站 » dubbo源码解析-zookeeper连接
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

关注【Java 技术驿站】公众号,每天早上 8:10 为你推送一篇技术文章

扫描二维码关注我!


关注【Java 技术驿站】公众号 回复 “VIP”,获取 VIP 地址永久关闭弹出窗口

免费获取资源

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏