zookeeper连接

简介: 本文深入解析Dubbo源码中服务暴露的核心环节,聚焦`getRegistry`一行代码,通过时序图与继承体系图剖析Zookeeper注册中心的实现机制,详解本地缓存、重连机制及客户端选择等面试高频问题,助你掌握底层原理。

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

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


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


插播面试题

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

友情提示

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

前期预热

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


getRegistry(originInvoker);


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



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



看到这个时序图是不是感觉太简单了,就三个步骤?优秀的源码都涉及到了大量的设计模式以及面向对象的思想,这里就不得不提一下我之前反复强调的看继承体系图了.其实在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开始



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



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



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


第一个面试题


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

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


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


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

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

第二个面试题

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

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





总结:dubbo通讯在zookeeper挂掉之后实际上还是可以通信的,关键在于他做了一个缓存处理,而这个缓存不同于Redis或者内存Map,即宕机即不存在。他是维护在文件中的,这样就能保证及时zk挂掉,依然可以保证消费/生产者的正常通信。


继续往下走,下面引申一下

第三道面试题

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


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

继续往下走,我们来看

第四个面试题


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



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




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

继续往下走




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



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


getRegistry(originInvoker);


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


相关文章
|
2月前
|
人工智能 机器人 Java
黑马最新项目
AIGC项目涵盖大模型私有化部署、聊天机器人、RAG知识库及代码提示工具;天机AI集成SpringAI与多模型工作流;云岚到家聚焦微服务与分布式架构;四方保险构建统一支付与时序数据应用;星辰WMS与Dify项目即将发布。
109 0
黑马最新项目
|
2月前
|
canal 缓存 关系型数据库
微服务原理篇(Canal-Redis)
本文介绍了ES索引同步的常见方案,重点讲解Canal+MQ数据同步机制。通过解析MySQL的binlog日志,Canal模拟slave伪装接入主库,实现增量数据捕获,并结合RabbitMQ保证消息顺序性地同步至Elasticsearch。同时探讨了缓存一致性问题,提出使用分布式锁(如Redis)控制并发写操作,避免双写不一致。还涵盖Redis持久化、集群模式、过期淘汰策略及缓存三剑客(穿透、雪崩、击穿)的解决方案,系统梳理了高并发场景下的数据同步与缓存保障技术体系。
88 0
 微服务原理篇(Canal-Redis)
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型专业名词解释手册
本手册由油炸小波设计提示词、Manus创作,系统梳理大语言模型核心概念,涵盖基础原理、训练技术、优化压缩、推理应用、评估调试及伦理安全六大模块,深入浅出解析LLM关键技术术语。
292 0
|
2月前
|
Arthas 存储 运维
记Arthas实现一次CPU排查与代码热更新
本文介绍使用Arthas排查Java应用CPU占用过高问题的完整流程,涵盖线程分析、阻塞定位、watch命令追踪异常、jad反编译实现热更新及火焰图分析,实现无需重启应用的高效故障排查与代码修复。
91 0
|
2月前
Watcher机制(一)
本文深入分析Zookeeper的Watcher机制,涵盖核心类与源码实现。重点解析Watcher、Event、WatchedEvent等接口与类,梳理其内部结构及事件通知流程,帮助理解Zookeeper的数据变更监听原理。
63 0
Watcher机制(一)
|
2月前
|
存储 关系型数据库 MySQL
微服务原理篇(XXLJOB-幂等-MySQL)
本文介绍了XXL-JOB任务调度的优势、组成结构及热点商品缓存更新任务的实现,涵盖幂等性概念与解决方案,并深入解析了MySQL存储引擎特性、索引失效场景、回表与覆盖索引原理以及SQL调优和分库分表策略。
54 0
微服务原理篇(XXLJOB-幂等-MySQL)
|
2月前
|
存储 搜索推荐 数据库
ES分布式搜索引擎入门
本课程介绍Elasticsearch的核心概念与应用,涵盖倒排索引原理、IK分词器使用、Java Client操作索引及查询等技能,帮助学员掌握高效搜索功能开发,适用于电商等高并发场景。
111 0
ES分布式搜索引擎入门
|
2月前
|
消息中间件 Java 数据安全/隐私保护
异步消息组件MQ基础
本课程学习RabbitMQ在微服务中的应用,涵盖MQ的应用场景、异步与同步调用区别、RabbitMQ的安装与配置、消息收发入门、工作队列模型及交换机类型(Fanout、Direct、Topic)等核心知识,并结合SpringAMQP实现消息通信与项目实战。
52 0
异步消息组件MQ基础
|
2月前
|
负载均衡 Java 应用服务中间件
微服务网关与配置中心 学习目标
本课程学习Spring Cloud Gateway网关的实现,掌握路由配置、负载均衡、内置过滤器(如StripPrefix)及全局过滤器的使用。重点包括自定义身份校验过滤器、JWT鉴权流程、微服务间用户信息传递,并结合Nacos实现服务发现与统一配置管理,完成前后端联调与权限控制。
69 0
微服务网关与配置中心 学习目标
|
2月前
|
Java 应用服务中间件 Sentinel
服务保护、分布式事务
本课程讲解微服务保护核心知识,涵盖雪崩问题、熔断降级、限流隔离等方案,学习Sentinel实现熔断限流,掌握FallbackFactory降级处理及Seata分布式事务原理与应用。
36 0
服务保护、分布式事务