dubbo专题-深入分析zookeeper连接原理

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介:

759dfbc972d425b9a9e9747b8d633cd932d6a633

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

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

ab8ee8e8ec808c6c9b573ca0db6386281ca958f2

插播面试题

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

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

项目中有使用过多线程吗?有的话讲讲你在哪里用到了多线程?(面试高频题)

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

友情提示

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

dubbo源码解析-集群容错架构设计
dubbo源码解析-详解directory
dubbo源码解析-详解router
dubbo源码解析-详解cluster
dubbo源码解析-详解LoadBalance
dubbo源码解析-服务暴露原理
dubbo源码解析-本地暴露

dubbo源码解析-远程暴露

前期预热

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

getRegistry(originInvoker);

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

c2c3d05073a05bf6792c0b2a51e17defe7a179d0

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

35720fbfb17860e54238ec07283a6662ff36029a

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

c06ba1e4b9b021b1f1cef94b1961788c76e4c6d9

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

dcfef6588016b7c9a34fd6b214256a67d4981ee4

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

6ac5203a467d5cf6d8b1d02d3e6e6cbf26f609ef

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

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

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

5f7d9de6ff084d6bff97007a29ca8483178fae47

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

664d20e55f26ada8296bca1506dfca27ac1592e2

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

e93899e2406272ee033104c7faf8d3e4beceac8b

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

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

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

b3b8f5e02b9513c3d8b3c3a6d18bd745ec484e7d

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

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

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

97e71d2e0287a6d5c6ff25fef41c58486150102e

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

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

dce03aec27b8fb750f824dd17d26528a129f0531

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

bfee6e442b2e6bf430aa21349142bc453acc6c7d

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

继续往下走

8ba955a41cf537ac570a0fff5421ea5b9da6a204

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

351b26ce1589c0386fed2a068106d62a2a1d5eff

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

getRegistry(originInvoker);

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

7356393b3dced509ee6413b6b956391fb7761414

写在末尾

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


原文发布时间为:2018-09-4

本文作者:肥朝

本文来自云栖社区合作伙伴“java进阶架构师”,了解相关信息可以关注“java进阶架构师”。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
3月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
1月前
|
负载均衡 监控 Dubbo
Dubbo 原理和机制详解(非常全面)
本文详细解析了 Dubbo 的核心功能、组件、架构设计及调用流程,涵盖远程方法调用、智能容错、负载均衡、服务注册与发现等内容。欢迎留言交流。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Dubbo 原理和机制详解(非常全面)
|
2月前
|
存储 负载均衡 监控
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
这篇文章是关于Apache Dubbo框架与Zookeeper的关系,以及如何下载、安装和启动Zookeeper的教程,包括解决启动过程中可能遇到的报错问题。
67 3
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
|
2月前
|
Dubbo 应用服务中间件 Apache
Dubbo 应用切换 ZooKeeper 注册中心实例,流量无损迁移
如果 Dubbo 应用使用 ZooKeeper 作为注册中心,现在需要切换到新的 ZooKeeper 实例,如何做到流量无损?
19 4
|
2月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
101 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
2月前
|
Dubbo IDE Java
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
这篇文章是关于如何下载和部署Dubbo管理控制台(dubbo-admin)的教程,并分析了2.6.1版本及以后版本的变化。
52 0
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
|
2月前
|
分布式计算 负载均衡 算法
Hadoop-31 ZooKeeper 内部原理 简述Leader选举 ZAB协议 一致性
Hadoop-31 ZooKeeper 内部原理 简述Leader选举 ZAB协议 一致性
30 1
|
2月前
|
分布式计算 监控 Hadoop
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
43 1
|
7月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
2月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
65 2