本文调试入口: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)然后通过代理类调用不同的拓展类实现好处就是启动时不加载,使用时才动态生成代理类动态实例化拓展类进行调用公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢