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,也就预告了本篇接近了尾声

相关文章
|
13天前
|
存储 人工智能 运维
阿里云 Tair 基于 3FS 工程化落地 KVCache:企业级部署、高可用运维与性能调优实践
阿里云 Tair KVCache 团队联合硬件团队对 3FS 进行深度优化,通过 RDMA 流量均衡、小 I/O 调优及全用户态落盘引擎,提升 4K 随机读 IOPS 150%;增强 GDR 零拷贝、多租户隔离与云原生运维能力,构建高性能、高可用、易管理的 KVCache 存储底座,助力 AI 大模型推理降本增效。
|
23天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
1151 22
|
2天前
|
监控 算法 Unix
Thread.sleep(0) 到底有什么用
Thread.Sleep用于让线程暂停执行一段时间,期间不参与CPU竞争。Sleep(1000)不保证精确唤醒时间,受系统调度影响;而Sleep(0)会触发立即重新计算各线程优先级,实现CPU让步,避免界面假死。两者均有实际意义。
|
1天前
|
SQL 存储 NoSQL
简述关系型与非关系型数据库的区别
关系型数据库基于表结构,支持SQL和事务,易于维护但读写性能差、灵活性不足;非关系型数据库格式灵活、速度快、成本低,适用于高并发场景,但缺乏SQL支持与事务机制,复杂查询较弱。
|
1天前
|
监控 Java 调度
定时任务概述
定时任务是基于时间表达式调度执行的任务,适用于对账、提醒、订单超时等场景。实现方式包括单体架构的轮询、Timer、ScheduledExecutorService、Quartz、SpringTask,以及分布式架构下的TBSchedule、Elastic-Job、XXL-JOB等方案,解决集群重复执行、动态调整、故障转移与监控问题。(238字)
|
1天前
|
消息中间件 安全
为什么会选择使用RabbitMQ
选用RabbitMQ因其功能丰富,支持多种消息模式、延迟与惰性队列,天然集群高可用,性能优异且文档齐全。MQ提升吞吐、隔离故障、削峰填谷,降低耦合,但也增加架构复杂性,依赖Broker稳定性。
|
1天前
|
存储 负载均衡 Java
Nacos注册中心
本文详细介绍Nacos的安装部署、服务注册与发现、分级模型、负载均衡策略、权重控制、环境隔离及临时/持久化实例等核心功能,涵盖Spring Cloud Alibaba整合实践。通过实操演示,帮助开发者快速掌握Nacos在微服务架构中的应用,助力高效构建配置管理与服务治理体系。(238字)
|
1天前
|
SpringCloudAlibaba Java Nacos
SpringCloud概述
Spring Cloud是微服务架构的统一解决方案,弥补了分散技术栈的不足。它具备约定大于配置、组件丰富、开箱即用等特点,支持云原生应用。版本以地铁站命名,避免与子项目冲突。Spring Cloud Alibaba融合阿里系开源组件如Nacos、Sentinel、Seata等,弥补Netflix套件停更短板,提供更完整、经生产验证的微服务生态,成为主流选择。
|
1天前
|
存储 NoSQL Java
Redis
基于 Redis 实现的 RPC 协议(2.3.0+版本支持),通过注册中心管理服务地址,客户端可透明调用。支持直连 Redis 或自定义接口映射,建议方法名与 Redis 标准操作一致,如 get、set、delete,非标准命名需配置映射关系,使用简便且高效。
|
1天前
|
Dubbo Java 应用服务中间件
Feign远程调用
本章介绍如何使用Feign替代RestTemplate实现更优雅的HTTP跨服务调用。通过引入Feign,解决服务地址硬编码、代码可读性差等问题,结合注册中心实现声明式远程调用。内容涵盖Feign基本使用、自定义配置(日志、编码器等)、连接池优化(如Apache HttpClient),并探讨继承与抽取两种最佳实践方案,提升微服务间通信的可维护性与复用性。