dubbo

Dubbo的spi代理对象生成原理

ref-nobody 创建时间 2025年4月13日 | 本文最后更新于 2025年4月26日 No Comments

前言 通过调试可以观察到dubbo中spi拓展生成的对象都有$Adaptive的后缀,例如protocol的spi实例化对象为: 下面来看看这个代理对象是如何生成的:首先我们获取spi的代理对象可以通过ExtensionLoader中的两个方法getExtension和getAdaptiveExtension来获取,这两者的区别是: – getExtension 方法用于获取指定名称的扩展点实现类实例; – getAdaptiveExtension 方法用于获取一个自适应的扩展点实例。这个实例会根据运行时的参数动态地选择具体的扩展点实现类;1. 在代码中,使用getExtensionLoader(type)首先会获取到对应类型的spi接口的ExtensionLoader实例,如果不存在则创建,并进行缓存存放到ExtensionLoader类的extensionLoadersMap成员变量中。创建对应类型的ExtensionLoader很简单,使用map的putIfAbsent方法,将new出来的ExtensionLoader放入缓存map中:extensionLoadersMap.putIfAbsent(type, new ExtensionLoader(type, this, scopeModel));2. 然后调用创建出来的ExtensionLoader的getAdaptiveExtension方法获取自适应的实例。创建的流程是首先动态生成自适应的spi类的java代码,即图中的code变量;然后对动态生成的代码进行编译Compile生成Class对象。有了Class对象之后,即可通过反射创建实例对象。…

Read More

Dubbo生成消费方接口代理对象

ref-nobody 创建时间 2025年4月13日 | 本文最后更新于 2025年5月13日 No Comments

消费者端接口引用 从消费者端来进行分析,定义消费者的接口的时候可以定义返回ReferenceBean的@Bean: @Bean@DubboReference(group = "demo", filter = "-mytest,refFilter1")public ReferenceBean<DemoService> referenceBean() { HashMap<String, Object> props =…

Read More