dubbo面试中比较喜欢问的两个点:服务发布和服务引用.
直入主题
从启动日志说起
这里不同颜色的框将关键的地方画了出来,一共有6种颜色, 从上到下
先看官方文档说明
ServiceConfig
类拿到对外提供服务的实际类 ref(如:HelloWorldImpl),然后通过 ProxyFactory
类的 getInvoker
方法使用 ref 生成一个 AbstractProxyInvoker
实例,到这一步就完成具体服务到 Invoker 的转化。看源码,很多人最常问的一句话就是,怎么入手,也就是切入点.那么我们还是以开头的日志为例,来找一个这个切入点
仔细看输出日志,就会发现在暴露本地服务之前,有一句很重要的日志,就是
The service ready on spring started. service: com.alibaba.dubbo.demo.DemoService, dubbo version: 2.0.0, current host: 127.0.0.1
定位到了ServiceBean
这个类
继续按照经典版本源码讲解,这里最新版源码由于删除了相关接口
从这个图我们看到了许多和spring有关的东西,还发现了一个重要的接口,那就是ApplicationListener
就是spring的事件机制(event).什么是事件机制呢?
就比如监听spring容器初始化完成.那我们就定位到这行日志的位置,往下debug
这个dubbo.properties文件是怎么时候加载的,好像我根本没有设置,另外这个dubbo.properties文件的名字能不能改?
到了第三个面试题,也是服务发布的重点,本地暴露和远程暴露
为什么会有本地暴露和远程暴露呢?
不从场景考虑讨论技术的没有意义是.在dubbo中我们一个服务可能既是Provider,又是Consumer,因此就存在他自己调用自己服务的情况,如果再通过网络去访问,那自然是舍近求远
因此他是有本地暴露服务的这个设计
@Adaptive注解打在类上和方法上,他们是有区别的
在方法上,就会生成动态编译的Adaptive类,下面就介绍一下怎么看这个动态编译类的源码
为什么需要调整成DEBUG,
比如下图
打开DEBUG后,我们重新启动,就会看到日志有如下输出,这段就是相关代码,我们根据包名新建文件,如下
由上图知道,本地暴露的url是以injvm开头的,下面来看下远程暴露,其实这个也是回答本地暴露和远程暴露区别的一个回答点.面试回答要的并不是一个满分的答案,而是从一些细节中,看出一个人,是否真的研究过源码.
还是回到开头那句话,dubbo命名是很规范的,从Wrapper这个命名,其实可以和Spring的Bean Wrapper,以及装饰者设计模式联系起来.同时可以看看文档中的编码约定