Dubbo-Directory目录源码解析

本文深入解析Dubbo的Directory组件,特别是RegistryDirectory如何根据注册中心的变化动态更新Invoker列表。Directory作为Invoker的容器,其核心在于RegistryDirectory,它实现了NotifyListener并在注册中心内容变化时更新Invoker。通过分析doList、notify和refreshInvoker方法,揭示了Invoker列表的获取、过滤及动态更新的全过程。
摘要由CSDN通过智能技术生成

还是先从整体架构入手,先看下Dubbo官方的架构设计图,调用方从集群中选择一个提供者时,首先得调用Directory获取Invoker列表,再根据配置的路由规则过滤掉不符合的提供者
在这里插入图片描述

Directory 的用途是保存 Invoker,可简单类比为 List。其实现类 RegistryDirectory 是一个动态服务目录,可感知注册中心配置的变化,它所持有的 Invoker 列表会随着注册中心内容的变化而变化。每次变化后,RegistryDirectory 会动态增删 Invoker,并调用 Router 的 route 方法进行路由,过滤掉不符合路由规则的 Invoker

官网的介绍中明确到,Directory中的Invoker列表会随着注册中心的内容的变化而变化,下面就从源码入手,分析Directory中的Invoker列表是如何变化的

Directory接口

先看下接口定义

public interface Directory<T> extends Node {
   

    //返回接口Class
    Class<T> getInterface();

    //获取提供者对应的Invoker列表
    List<Invoker<T>> list(Invocation invocation) throws RpcException;

}

有几种实现呢?
在这里插入图片描述

可以看到底层有RegistryDirectoryStaticDirectory两种实现

  • RegistryDirectory实现了NotifyListener接口,而NotifyListener接口的notify回调方法会在注册中心中提供者发生变化时被调用,从而达到通知RegistryDirectory更新Invoker列表的效果,它是能根据注册中心动态变化的核心所在
  • StaticDirectory没有实现NotifyListener接口,因此其中Invoker列表不会改变,所以呢,要明白:Directory中的Invoker列表会随着注册中心的内容的变化而变化这句话在这里不适用。

既然我们分析的主要目标是Directory中Invoker的动态变化过程,自然需要分析RegistryDirectory的实现

AbstractDirectory

看Dubbo源码如果看到Abstract开头的抽象类,就应该联想到模板方法,什么意思?看下
AbstractDirectory的实现,其list方法做了一些公共的实现逻辑,再把具体的获取Invoker列表的方法通过调用doList交由子类实现,如果子类有很多实现,均只需按doList的抽象方法模板定制化自己的实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值