代码改变世界

从dubbo No provider available 排查 看dubb consummer端加载流程

2018-10-28 22:13  xiaoyukid  阅读(311)  评论(0)    收藏  举报

在一次项目启动过程中发现报错

 

进入报错的代码  InvokerInvocationHandler.java:51 
 
 
MockClusterInvoker.java  70
 
AbstractClusterInvoker.java 232
 
动态代理实现
 
这里抛出 No provider available 异常
 
 
RegistryDirectorry.java  609
 
urlInvokerMap 为空 。
 
我们只需要找出 urlInvokerMap为何为null 。
 
 
观察 RegistryDirectorry.java 发现 urlInvokerMap 是通过notify方法来初始化的。
 
在notify方法打断点,不难发现问题所在,缺少 org.jboss.netty.channel.ChannelFactory 类
 
 
引入 io.netty包 即可解决
 
 
下面我们可以在 notify 方法中打断点,重启工程来看下notify方法是如何触发的
 
通过一步一步debug ,可以大致画出时序图
 
 
 
下图代码代表步骤一  refer
 
 
 
 
 
步骤二 getRegistry
 
步骤 5  join
 
 
 
步骤4 directory 调用 subscribe 方法会触发 notify方法, 从而初始化 urlInvokerMap
 
 
 
 
 
 
同时我们也可以发现注册中心有变化会更新urlInvokerMap
 
 
参考资料