Dubbo源码解析-结合Protocol的export(Invoker<T> invoker)接口分析DubboProtocol是怎么做到自适应的

mac2025-07-09  7

本文接上文:dubbo源码解析-SPI

三、结合Protocol的export(Invoker<T> invoker)接口分析DubboProtocol和rmiProtocol是怎么做到自适应的

本文调试入口:org.apache.dubbo.rpc.protocol.dubbo.DubboProtocolTest#testDemoProtocol

public class DubboProtocolTest { private Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension(); private ProxyFactory proxy = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension(); @AfterAll public static void after() { ProtocolUtils.closeAll(); } @Test public void testDemoProtocol() throws Exception { DemoService service = new DemoServiceImpl(); protocol.export(proxy.getInvoker(service, DemoService.class, URL.valueOf("dubbo://127.0.0.1:9020/" + DemoService.class.getName() + "?codec=exchange"))); service = proxy.getProxy(protocol.refer(DemoService.class, URL.valueOf("dubbo://127.0.0.1:9020/" + DemoService.class.getName() + "?codec=exchange").addParameter("timeout", 3000L))); assertEquals(service.getSize(new String[]{"", "", ""}), 3); }

解释:

      1、第一行首先生成Protocol拓展类对象

      2、生成ProxyFactory拓展类实力,得到Invoker对象

      3、我们把重点放到URL上,看到是使用的dubbo://协议

接下来我们Debug进入

细节跟上文一样

解释:我们可以看到是从META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol解析的扩展类,

dubbo=org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol

当然这我们只是有针对性的看了一下DubboProtocol扩展类,实际中还有很多呢、、

生产完源代码之后就是这个样子的

然后通过我们的协议dubbo获取拓展类然后调用exort()

大概是这个流程,当然这中间很复杂,其实是经过很多的Wrapper,Filter等,, 

总结:

为拓展接口生成具有代理功能的代理类(生成源码,编译代码,利用反射实例化代理类)加载默认拓展类加载指定路径下的拓展类使用时通过解析URL获取对应的拓展类(dubbo)然后通过代理类调用不同的拓展类实现好处就是启动时不加载,使用时才动态生成代理类动态实例化拓展类进行调用

公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢

最新回复(0)