Dubbo源码 之 服务引用调试ref不为空,ref对象被修改,ref == null

最近在用dubbo2.5.x版本源码进行调试服务引用源码时,发现程序运行到getObject的get方法的时候,ref不为空,导致不走init方法,不走init方法下面所有的服务引用程序调试均无法debug执行,因为服务暴露和引用都是在一台机器上运行,猜想是不是服务暴露的时候在jvm中已经缓存了,但是转念一想这个ref是消费端调用服务的时候才创建的proxy,这个proxy是通过代理工厂类(ProxyFactory) 为服务接口生成代理类,并让代理类去调用 Invoker 逻辑。跟服务暴露是没有关系的。

Dubbo源码 之 服务引用调试ref不为空,ref对象被修改,ref == null

???????????????????????? 后台查看官方文档才看到相关解释。

这里需要特别说明一下,如果你对 2.6.4 及以下版本的 getObject 方法进行调试时,会碰到比较奇怪的的问题。这里假设你使用 IDEA,且保持了 IDEA 的默认配置。当你面调试到 get 方法的if (ref == null)时,你会发现 ref 不为空,导致你无法进入到 init 方法中继续调试。导致这个现象的原因是 Dubbo 框架本身有一些小问题。该问题已经在 pull request #2754 修复了此问题,并跟随 2.6.5 版本发布了。如果你正在学习 2.6.4 及以下版本,可通过修改 IDEA 配置规避这个问题。首先 IDEA 配置弹窗中搜索 toString,然后取消Enable 'toString' object view勾选或者是classes的list不包含我们调试的程序。具体如下:

Dubbo源码 之 服务引用调试ref不为空,ref对象被修改,ref == null

然后在debug模式下调试正常。如果开启了toString视图预览,在内部已经创建了proxy但是在debug模式下是debug不到的。

Dubbo源码 之 服务引用调试ref不为空,ref对象被修改,ref == null