zookeeper连接

简介: 本文深入解析Dubbo源码中`getRegistry`远程注册核心流程,结合Zookeeper实现服务发现。通过时序图与继承体系图,剖析设计模式应用及注册中心高可用机制,解答四大高频面试题,涵盖多线程、客户端选型等实战要点,助你由浅入深掌握Dubbo架构精髓。(238字)

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

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

插播面试题
● 一般选择什么注册中心,还有别的选择吗?
● dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?(面试高频题)
● 项目中有使用过多线程吗?有的话讲讲你在哪里用到了多线程?(面试高频题)
● zookeeper的java客户端你使用过哪些?
友情提示
由于服务暴露这一节的内容几乎是环环相扣的,比如本章节是在上一章节dubbo源码解析-远程暴露中的一个分支的细化讲解.因此不建议跳跃性阅读.建议阅读本篇前先阅读以下几篇
● dubbo源码解析-服务暴露原理
● dubbo源码解析-本地暴露
● 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是支持ZkClient和Curator两种java客户端(其实就类似jedis是redis的java客户端一样),同时@SPI("zkclient")这里就可以看出它默认是用ZkClient的(原因关注肥朝,后续讲解)
继续往下走

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

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

getRegistry(originInvoker);

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

相关文章
|
人工智能 机器人 测试技术
使用LM Studio在本地运行LLM完整教程
GPT-4被普遍认为是最好的生成式AI聊天机器人,但开源模型一直在变得越来越好,并且通过微调在某些特定领域是可以超过GPT4的。
8272 1
|
8月前
|
消息中间件 监控 Java
RocketMQ:底层Netty频繁OS OOM
本文详述RocketMQ因Netty多ClassLoader加载多个PooledByteBufAllocator,导致堆外内存超限引发OS OOM的排查过程,揭示底层内存管理机制及解决方案。
 RocketMQ:底层Netty频繁OS OOM
|
7月前
|
人工智能 自然语言处理 PyTorch
构建AI智能体:九十四、Hugging Face 与 Transformers 完全指南:解锁现代 NLP 的强大力量
Hugging Face 是领先的自然语言处理开源平台,提供 Transformers 等核心库,支持数千种预训练模型,涵盖文本分类、生成、问答等任务。其 Pipeline 工具简化了模型调用,AutoClass 实现架构自动识别,助力开发者高效构建 AI 应用。
1619 10
|
8月前
|
应用服务中间件 微服务
微服务雪崩问题
高并发下商品服务占用过多Tomcat连接,可能导致接口延迟或阻塞,进而影响依赖它的购物车服务,引发连锁反应。若不加控制,将导致整个微服务集群雪崩。微服务保护旨在防止此类级联失败,保障系统稳定。
|
8月前
|
运维 关系型数据库 Linux
Linux 高效学习指南:从入门到运维的科学路径
本文介绍Linux运维学习的科学路径,主张“场景驱动”替代死记硬背。涵盖四大阶段:一周掌握核心命令,两周理解系统原理与故障排查,两周实战部署LNMP服务,长期进阶自动化运维。强调动手实操、问题驱动与循序渐进,提供各阶段目标、任务与资源推荐,助你高效构建完整知识体系,成为实战型运维人才。
|
8月前
|
运维 数据库 数据安全/隐私保护
DAS Agent、MCP Server 与 Dify 集成,实现跨账号数据库智能运维!
针对多账号管理难题,通过DAS Agent、MCP Server 与 Dify 集成,实现跨阿里云账号数据库实例的统一智能运维。主账号可纳管其他账号的DAS Agent,集中生成运维日报并推送至钉钉,提升集团级数据库管理效率。
|
7月前
|
监控 搜索推荐 物联网
一文读懂LoRA微调原理:大模型高效适配的核心逻辑
通过冻结大模型参数、仅训练少量低秩矩阵,实现高效微调:成本低、周期短、不破坏通用能力。适配医疗、金融等垂直场景,支持多任务复用与边缘部署,成为大模型落地首选技术。
一文读懂LoRA微调原理:大模型高效适配的核心逻辑
|
8月前
|
Java Maven Spring
SpringBoot打包
本项目通过Maven打包为单一可执行JAR,内置配置文件与依赖,使用Spring Boot插件指定主类并repackage。执行`mvn clean package`构建后,通过`java -jar`运行(前台/后台),`kill -9 pid`停止服务。也可将JAR、依赖与配置分离部署,提升灵活性与维护性。(238字)
|
8月前
|
JSON 安全 Java
SpringBoot鉴权
本文介绍基于Spring Security与JWT实现客户端Token认证的完整方案,涵盖登录鉴权、Token生成与验证、角色权限控制等细节。通过自定义过滤器与认证组件,结合Redis或数据库可扩展实现高效安全的无状态认证体系,适用于Spring Boot微服务架构。
|
8月前
|
关系型数据库 应用服务中间件 Nacos
Nacos配置中心
本章介绍Nacos配置中心的实现,涵盖配置管理、热更新、共享配置及优先级规则,并演示Nacos集群搭建与高可用部署,帮助掌握微服务环境下配置统一管理的核心技能。

热门文章

最新文章