dubbo扩展点的延迟加载机制
Posted bruce128
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo扩展点的延迟加载机制相关的知识,希望对你有一定的参考价值。
dubbo的架构是微内核+插件(dubbo里是扩展,extension)的形式,现代操作系统、maven、Spring等都是这个架构,其优点是易于扩展。通常微内核不带有业务功能,而是负责完整的生命周期里的流程的执行和业务组件的容器。任何原有的功能都可以重新按自己的业务需求定制化。
dubbo启动时,并不会加载所有的扩展到内存方法区,而是要用的时候再加载。dubbo的延迟加载时动过一种动态代理的方式实现。
动态代理类执行的逻辑如下:
- 从URL中获取扩展的名字
- 加载扩展
- 执行目标方法
动态代理的类代码是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扩展点的延迟加载机制的主要内容,如果未能解决你的问题,请参考以下文章