dubbo扩展点的延迟加载机制

Posted bruce128

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo扩展点的延迟加载机制相关的知识,希望对你有一定的参考价值。

dubbo的架构是微内核+插件(dubbo里是扩展,extension)的形式,现代操作系统、maven、Spring等都是这个架构,其优点是易于扩展。通常微内核不带有业务功能,而是负责完整的生命周期里的流程的执行和业务组件的容器。任何原有的功能都可以重新按自己的业务需求定制化。
dubbo启动时,并不会加载所有的扩展到内存方法区,而是要用的时候再加载。dubbo的延迟加载时动过一种动态代理的方式实现。
动态代理类执行的逻辑如下:

  1. 从URL中获取扩展的名字
  2. 加载扩展
  3. 执行目标方法

动态代理的类代码是dubbo拼接字符串生成的。今天调试的是注册中心的代码,以RegistryFactory为例

package org.apache.dubbo.registry;

import org.apache.dubbo.common.extension.ExtensionLoader;

public class RegistryFactory$Adaptive implements org.apache.dubbo.registry.RegistryFactory 
	
	public org.apache.dubbo.registry.Registry getRegistry(org.apache.dubbo.common.URL arg0) 
		if (arg0 == null) throw new IllegalArgumentException("url == null");
		org.apache.dubbo.common.URL url     = arg0;
		// 1. 取扩展的名字
		String                      extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol());
		if (extName == null)
			throw new IllegalStateException("Failed to get extension (org.apache.dubbo.registry.RegistryFactory) name from url (" + url.toString() + ") use keys([protocol])");
		// 2. 加载扩展
		org.apache.dubbo.registry.RegistryFactory extension = (org.apache.dubbo.registry.RegistryFactory) ExtensionLoader.getExtensionLoader(org.apache.dubbo.registry.RegistryFactory.class).getExtension(extName);
		// 3. 执行目标方法
		return extension.getRegistry(arg0);
	

扩展的名字是从注解中取的

@SPI("dubbo")
public interface RegistryFactory 

    @Adaptive("protocol")
    Registry getRegistry(URL url);


以上是关于dubbo扩展点的延迟加载机制的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo中SPI扩展机制解析

Dubbo-技术专区-扩展点加载机制Dubbo SPI

Dubbo-技术专区-扩展点加载机制Dubbo SPI

Dubbo 扩展点加载机制:从 Java SPI 到 Dubbo SPI

dubbo扩展加载机制细节

Dubbo-扩展机制-SPI