请支持原创:
http://donlianli.iteye.com/blog/2092531
作者当前分析的版本为2.5.x。作者在分析的时候,都是带着疑问去查看代码,debug进行调试的,笔者写此文章仅供参考。
先大概了解一下系统作为一个消费者从启动到注册完成的过程
- 系统启动时,引用service时首先将系统本身自己需要引用的服务注册到zookeeper,然后订阅系统需要的服务,最后,会接收到zookeeper发送的订阅信息。比如一个消费者注册了一个UserService,系统在启动时,首先声明自己是UserService的一个消费者,然后再向zookeeper声明自己需要订阅UserService,最后,从zookeeper接收订阅的服务,然后存储到本地。
- 如果同时引用多个接口,则上面的服务会重复执行多次。
- montitorService是在执行的时候,才执行订阅。
问题:
1、dubbo是通过哪个类跟zookeeper进行交互的?
2、dubbo把订阅的信息存储到了哪个类?
RegistryProtocol.doRefer这里面进行的注册,将调用FailbackRegistry.registry进行真正的注册,实际跟zookeeper进行交互,调用的是ZookeeperRegistry的doRegistry方法。如果注册失败,会将url添加到定时任务中进行重试。
AbstractRegistry.notify真正接收到zookeeper的通知。在那儿将notify接口添加到zookeeper的改变事件的呢?
在ZookeeperRegistry代码的doSubscribe方法中(与zookeeper进行交互的代码中),将订阅的接口发送给zookeeper,并且从zookeeper取得可用的服务列表。
ZookeeperRegistry代码:
zkClient.create(path, false); //这个是zookeeper返回客户端订阅的服务 List<String> children = zkClient.addChildListener(path, zkListener); if (children != null) { urls.addAll(toUrlsWithEmpty(url, path, children)); } 在循环之外,将已经可用的列表进行通知。 notify(url, listener, urls);,调用了AbstractRegistry.notify
AbstractRegistry在收到通知后,将url进行存储,继续通知NotifyListener。
NotifyListener是在哪儿放入Registry的呢?
在RegistryProtocol订阅服务的时候,会调用RegistryDirectory.subscribe方法。RegistryDirectory这类本身就实现了NotifyListener接口,在调用FailbackRegistry的subscribe方法的时候,把自己当成一个参数传递给了AbstractRegistry对象。所以AbstractRegistry在收到通知后,继续通知的是RegistryDirectory。
RegistryDirectory这个类维护着从本地方法到远程方法的映射关系,远程参数到本地方法的调用关系等。
在注册过程中的几个主要类
ZookeeperRegistry:负责与zookeeper进行交互
RegistryProtocol:从注册中心获取可用服务,或者将服务注册到zookeeper,然后提供服务或者提供调用代理。
RegistryDirectory:维护着所有可用的远程Invoker或者本地的Invoker。这个类实现了NotifyListner。
NotifyListener:负责RegistryDirectory和ZookeeperRegistry的通信。
FailbackRegistry:继承自Registry,实现了失败重试机制。
回答一开始的问题
1、通过ZookeeperRegistry和Zookeeper进行交互,相关的类还有ZookeeperClient,ZkclientZookeeperClient和org.I0Itec.zkclient.ZkClient类。通过这些类的方法,实现服务的注册和订阅及信息的传递。
2、主要是AbstractRegistry和RegistryDirectory这两个类。其中RegistryDirectory存储的可供客户端直接调用的Invoker,而AbstractRegistry这个类主要存储的是已经注册的服务接口,已经订阅的服务接口和已经收到通知的接口的URL,不能直接调用。
关于为什么不使用zookeeper自带的客户端,请参考
为什么dubbo使用ZkClient作为zookeeper的客户端
关于我,邯郸人。
对这类话题感兴趣?欢迎发送邮件至donlianli@126.com
相关推荐
在“dubbo例子(注册中心,消费者,提供者)”中,我们将探讨Dubbo的核心组件及其在实际应用中的工作流程,特别是如何利用Zookeeper作为注册中心来协调服务提供者(Provider)和服务消费者(Consumer)。 首先,我们...
注册过程通常包括将服务的元数据(如接口名、版本、主机、端口等)转换成URL格式,并发送到注册中心。 服务消费阶段,消费者会从注册中心获取服务提供者的URL信息,然后通过Dubbo的ProxyFactory生成一个与服务接口...
Dubbo作为一款高性能、轻量级的开源Java RPC框架,其消费者如何获取服务提供者的服务接口引用是一个重要的设计环节。本文将深入解析这一过程,探讨Dubbo在Spring容器中的实现机制,以及涉及到的组件和流程。 首先,...
2. 注册服务:接着,服务提供者会调用Registry的register方法,将ServiceConfig对象(包含服务元数据)注册到注册中心,使得服务消费者可以发现。 二、服务发布 服务发布是将服务接口及其实现类的信息打包成一个可...
- 服务消费者引用:理解服务消费者如何查找并引用服务,包括URL参数解析、服务订阅和回调机制。 4. **负载均衡策略** - 负载均衡器:探讨Dubbo内置的各种负载均衡策略,如Random、RoundRobin、LeastActive等,...
一个典型的Dubbo HelloWorld例子通常包括服务提供者和服务消费者两个部分,通过简单的示例程序演示了如何注册服务、发布服务和调用服务。 #### 五、源文件概述 Dubbo的源代码主要由以下几个部分组成: 1. **core*...
1. 配置Spring:创建Spring配置文件,定义Bean,包括Mybatis的SqlSessionFactory和MapperScannerConfigurer,以及Dubbo的相关配置,如服务提供者和消费者。 2. 集成Mybatis:编写Mapper接口和对应的XML映射文件,...
同样,在Dubbo的服务提供者和消费者配置文件中添加Zookeeper注册中心的配置: ```xml <!-- Dubbo 配置文件 --> <dubbo:application name="dubbo-provider" /> <dubbo:registry address="zookeeper://127.0.0.1:2181...
在基于Maven的项目中,我们使用Spring作为依赖注入框架,MyBatis作为持久层框架,而Dubbo作为服务治理框架,使得服务提供者和消费者之间能够进行解耦。在服务消费者端,我们创建一个代理对象来调用服务提供者的方法...
- **服务消费者**: 启动时向注册中心订阅所需的服务,并接收提供者的地址列表。如有变更,注册中心将推送更新。 - **负载均衡**: 服务消费者基于软负载均衡算法选择服务提供者进行调用。 - **监控中心**: 服务提供者...
首先,问题的背景是在一个使用Dubbo作为服务治理框架,Nacos作为注册中心的环境中。客户在使用过程中遇到了服务调用失败和Nacos心跳请求返回502的错误。进一步调查发现,Nacos服务器由于磁盘老化导致IO效率下降,...
1. 服务注册与发现:服务提供者向注册中心注册服务,服务消费者通过注册中心获取服务提供者的地址信息。 2. 负载均衡:Dubbo支持多种负载均衡策略,如Random、RoundRobin、LeastActive等,确保请求均匀分发到各个...
总的来说,这个入门示例涵盖了 Dubbo 的基础使用,通过创建服务提供者和消费者,演示了服务的注册、发现和调用过程。对于初学者来说,这是一个很好的起点,后续可以深入学习 Dubbo 的高级特性,如集群、调用链跟踪等...
1. 服务注册与发现:Dubbo-admin可以展示所有已注册的服务,包括服务提供者和消费者的信息,帮助管理员了解服务的分布情况。 2. 运行状态监控:实时监控服务的调用次数、成功率、平均响应时间等关键指标,以便及时...
3. 注册中心(Registry):服务注册与发现的中介,服务提供者将服务注册到注册中心,服务消费者通过注册中心获取服务提供者的地址信息。 4. 运行时监控(Monitor):用于统计服务的调用次数、调用时间等,提供服务...
4. 注册中心(Registry):负责服务的注册与发现,使服务提供者和服务消费者能够找到彼此。 5. 监控中心(Monitor):收集服务的调用统计信息,用于性能分析和故障排查。 二、Dubbo设计原则 1. 面向接口代理:Dubbo...
- **服务注册与发现**:Dubbo支持多种注册中心,如Zookeeper、Eureka等,服务提供者注册服务,服务消费者通过注册中心获取服务地址。 - **RPC调用**:Dubbo使用Netty作为底层通信框架,实现了基于HTTP、TCP等多种...
DUBBO作为一款成熟的微服务框架,不仅提供了强大的功能支持,还具有良好的社区生态。开发者可以通过学习和使用DUBBO,快速搭建起一套稳定可靠的微服务系统。在未来的发展中,随着微服务架构的不断演进,DUBBO也将...
4. **服务暴露与引用**:服务提供者如何暴露服务,服务消费者如何引用并调用服务,这涉及到服务的注册、发现和调用过程。 5. **服务调用与治理**:研究Dubbo提供的负载均衡策略,如随机、轮询、最少活跃调用数等,...