Dubbo-聊聊注册中心的设计( 二 )

  • lookup方法查询符合条件的注册的数据,subscribe采用Push方式,而lookup采用的是Pull模式;
  • RegistryRegistry接口继承了Node和RegistryService这两个接口,实现该接口类就是注册中心接口的节点,该方法内部也提供两个默认方法reExportRegister方法和reExportUnregister方法,这两个方法实际调用还是RegistryService中的方法 。
    public interface Registry extends Node, RegistryService {    //调用RegistryService的register    default void reExportRegister(URL url) {        register(url);    }    //调用RegistryService的unregister    default void reExportUnregister(URL url) {        unregister(url);    }}RegistryFactoryRegistryFactory是 Registry 的工厂类,负责创建 Registry 对象,通过@SPI 注解指定了默认的扩展名为 dubbo,@Adaptive注解表示会生成适配器类并根据 URL 参数中的 protocol 参数值选择相应的实现 。
    @SPI("dubbo")public interface RegistryFactory {    @Adaptive({"protocol"})    Registry getRegistry(URL url);}下图是RegistryFactory多种不同的实现,每个 Registry 实现类都有对应的 RegistryFactory 工厂实现,每个 RegistryFactory 工厂实现只负责创建对应的 Registry 对象 。
    AbstractRegistryFactoryAbstractRegistryFactory 是一个实现了 RegistryFactory 接口的抽象类,内部维护一个Registry的Map集合以及提供销毁和创建注册中心方法,针对不同的注册中心可以有不同的实现 。
        //锁     protected static final ReentrantLock LOCK = new ReentrantLock();    //Map    protected static final Map<String, Registry> REGISTRIES = new HashMap<>();销毁销毁方法分为两个,一个全量,一个是单个,单个销毁在AbstractRegistry中调用,参数是注册实例对象 。
       //全量销毁   public static void destroyAll() {        if (!destroyed.compareAndSet(false, true)) {            return;        }        if (LOGGER.isInfoEnabled()) {            LOGGER.info("Close all registries " + getRegistries());        }        // Lock up the registry shutdown process        LOCK.lock();        try {            for (Registry registry : getRegistries()) {                try {                    //一个一个销毁                    registry.destroy();                } catch (Throwable e) {                    LOGGER.error(e.getMessage(), e);                }            }            //清空map缓存            REGISTRIES.clear();        } finally {            // Release the lock            LOCK.unlock();        }    }   //单个销毁   public static void removeDestroyedRegistry(Registry toRm) {        LOCK.lock();        try {            REGISTRIES.entrySet().removeIf(entry -> entry.getValue().equals(toRm));        } finally {            LOCK.unlock();        }    }

    经验总结扩展阅读