10.zookeeper连接

简介: ascafasfa

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

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

image.svg

图片加载失败


插播面试题
一般选择什么注册中心,还有别的选择吗?
dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?(面试高频题)
项目中有使用过多线程吗?有的话讲讲你在哪里用到了多线程?(面试高频题)
zookeeper的java客户端你使用过哪些?
友情提示
由于服务暴露这一节的内容几乎是环环相扣的,比如本章节是在上一章节dubbo源码解析-远程暴露中的一个分支的细化讲解.因此不建议跳跃性阅读.建议阅读本篇前先阅读以下几篇
dubbo源码解析-服务暴露原理
dubbo源码解析-本地暴露
dubbo源码解析-远程暴露
前期预热
今天我们要讲的其实就是一行代码.也就是


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

image.svg

图片加载失败



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

image.svg

图片加载失败



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


直入主题

从时序图我们从第一个关键词getRegistry开始

image.svg

图片加载失败



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

image.svg

图片加载失败



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

image.svg

图片加载失败



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

第一个面试题

一般选择什么注册中心,还有别的选择吗?
这个问题其实我们翻看一下文档,答案迎刃而解.

image.svg

图片加载失败


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

image.svg

图片加载失败



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

image.svg

图片加载失败


根据继承体系图,我们打好断点往下走,现在我们引出也是dubbo面试中的高频题
第二个面试题
dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?
答案是可以的,为什么呢?我们看下面三个图,我们看到zookeeper的信息会缓存到本地作为一个缓存文件,并且转换成properties对象方便使用.

image.svg

图片加载失败



image.svg

图片加载失败




image.svg

图片加载失败



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


继续往下走,下面引申一下
第三道面试题
项目中有使用过多线程吗?有的话讲讲你在哪里用到了多线程?

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

image.svg

图片加载失败


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

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

image.svg

图片加载失败



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

image.svg

图片加载失败



image.svg

图片加载失败



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

image.svg

图片加载失败



image.svg

图片加载失败



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

image.svg

图片加载失败



image.svg

图片加载失败


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

Plain Text

复制代码

1

getRegistry(originInvoker);


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

image.svg

图片加载失败






若有收获,就点个赞吧

油炸小波

2023-08-02 11:08

105

0

IP 属地广东

举报

分享到:

注册 / 登录 语雀进行评论

1844/1899字

关于语雀使用帮助数据安全服务协议

相关文章
|
存储 缓存 算法
并发编程系列教程(12) - Disruptor框架
并发编程系列教程(12) - Disruptor框架
305 0
|
15天前
|
人工智能 弹性计算 安全
OpenClaw从0到1精通指南:7个必装Skill/5000+精选库、全平台部署、阿里云千问/Coding Plan API配置与问题排查
OpenClaw的核心价值在于Skill生态与灵活部署能力,7个必装Skill覆盖安全、检索、进化、主动、更新等基础能力,5000+精选库满足垂直场景需求。2026年阿里云与本地全平台部署流程成熟,搭配阿里云千问API与免费Coding Plan API,可快速搭建兼顾隐私、效率、成本的AI代理环境。无论个人效率提升还是团队协作,本文提供的命令、配置、排查方案均可直接落地使用,真正实现AI代理自主化、稳定化、高效化。
1046 1
|
2月前
|
搜索推荐 数据挖掘 测试技术
LLM推理时计算技术详解:四种提升大模型推理能力的方法
2025年LLM发展新趋势:不卷训练,专攻推理!本文详解四大推理时计算技术——Chain-of-Thought(深度)、Self-Consistency(宽度)、Tree-of-Thoughts(搜索)、Reflexion/Self-Refine(迭代),配可运行代码与实战对比,助你在不重训模型前提下显著提升性能。
245 0
LLM推理时计算技术详解:四种提升大模型推理能力的方法
|
小程序 JavaScript 开发者
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
915 0
|
数据采集 数据可视化 数据处理
如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`)
本文介绍了如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`),加载历史数据,计算均线和其他技术指标,实现交易逻辑,记录和可视化交易结果。示例代码展示了如何根据均线交叉和价格条件进行开仓、止损和止盈操作。实际应用时需注意数据质量、交易成本和风险管理。
944 5
|
存储 缓存 Java
|
Kubernetes Cloud Native 网络协议
一文搞懂“镜像“和“容器“
一文搞懂“镜像“和“容器“
2855 1

热门文章

最新文章