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);

}

猜你喜欢

转载自blog.csdn.net/bruce128/article/details/103879153