dubbo RegistryProtocol何时加载
当启动provider服务配置时,
serviceConfig.export();
会在ServiceConfig中调用Protocol.export
启动连接:
Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(EXPORT_KEY, url.toFullString()));
DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);
Exporter<?> exporter = PROTOCOL.export(wrapperInvoker);
exporters.add(exporter);
我看别人写的源码分析,此时的Protocol
为RegistryProtocol
。
然后我就想知道RegistryProtocol
何时加载的,默认的Protocol
不应该是DubboProtocol
么?
@SPI("dubbo")
public interface Protocol {
@Adaptive
<T> Exporter<T> export(Invoker<T> invoker) throws RpcException;
}
dubbo=org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol
回答:
一开始url里的protocol是registry,在org.apache.dubbo.registry.integration.RegistryProtocol#export
里移除并设置为dubbo
回答:
因为 Protocol
是 @Adaptive
修饰的
ServiceConfig
中是这么初始化的
// 初始化的是一个 Adaptive 实现类private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
也就是说具体用哪个 protocol实现类是看Url中protocol是什么配置
在export的过程中会通过修改Url参数的protocol属性来实现动态适应加载实现类
另外 invoker 也有 getUrl 方法,protocol.export(invoker)
的时候invoker中的url中的protocol属性会影响最终的实现类,详情可以研究下 SPI
@Adaptive
带有这个注解的方法必须参数里有 URL 或者参数有getUrl方法,否则会报错,该注解会根据url中对应key的参数确定具体加载哪个扩展
比如:org.apache.dubbo.config.ServiceConfig#exportLocal
private void exportLocal(URL url) { if (!Constants.LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {
URL local = URL.valueOf(url.toFullString())
// 这里修改了 protocol
.setProtocol(Constants.LOCAL_PROTOCOL)
.setHost(LOCALHOST)
.setPort(0);
StaticContext.getContext(Constants.SERVICE_IMPL_CLASS).put(url.getServiceKey(), getServiceClass(ref));
// 这里就是动态适配的扩展类
Exporter<?> exporter = protocol.export(
proxyFactory.getInvoker(ref, (Class) interfaceClass, local));
exporters.add(exporter);
logger.info("Export dubbo service " + interfaceClass.getName() + " to local registry");
}
}
以上是 dubbo RegistryProtocol何时加载 的全部内容, 来源链接: utcz.com/p/944195.html