欢迎关注全是干货的技术公众号
![7529e57f4c6097ddcce9b7226df0e72c.png](https://i-blog.csdnimg.cn/blog_migrate/87fcc49184d113807c2fb1e107cd2ce1.jpeg)
dubbo面试中比较喜欢问的两个点:服务发布和服务引用.
人性的拷问
- 服务发布过程中做了哪些事
- dubbo都有哪些协议,他们之间有什么特点,缺省值是什么
- 什么是本地暴露和远程暴露,他们的区别
直入主题 从启动日志说起
![6c6bee0565e5da1ac33c54678cc46aab.png](https://i-blog.csdnimg.cn/blog_migrate/fc47010e21592916e9f7bb83e97d616d.jpeg)
这里不同颜色的框将关键的地方画了出来,一共有6种颜色, 从上到下
- 暴露本地服务
- 暴露远程服务
- 启动netty
- 连接zookeeper
- 到zookeeper注册
- 监听zookeeper
全局总览
先看官方文档说明
服务提供者暴露一个服务的详细过程
- 服务提供者暴露服务的主过程首先 ServiceConfig 类拿到对外提供服务的实际类 ref(如:HelloWorldImpl),然后通过 ProxyFactory 类的 getInvoker 方法使用 ref 生成一个 AbstractProxyInvoker 实例,到这一步就完成具体服务到 Invoker 的转化。 接下来就是 Invoker 转换到 Exporter 的过程。
![6e5d51247352749b793a54022c42f788.png](https://i-blog.csdnimg.cn/blog_migrate/67a22db895b82e79ec9ea1beca22fa79.jpeg)
看源码,很多人最常问的一句话就是,怎么入手,也就是切入点.那么我们还是以开头的日志为例,来找一个这个切入点 仔细看输出日志,就会发现在暴露本地服务之前,有一句很重要的日志,就是
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
![be0365cacbb1202473de65d05ea1921c.png](https://i-blog.csdnimg.cn/blog_migrate/80eb67e993f5dd45678c23d8a643d3b0.jpeg)
![b23d3136ed529b758906f0b455b877a3.png](https://i-blog.csdnimg.cn/blog_migrate/edfa07817144fd490eea2c0dd07557ef.jpeg)
![e4c004e32c688970e0d7769d49abd6e9.png](https://i-blog.csdnimg.cn/blog_migrate/77a9987fa2c4ee8d76557488211f1a3e.jpeg)
重点!!!
![daaabaa11b2c21533e9a8a4026c27851.png](https://i-blog.csdnimg.cn/blog_migrate/38bbf4686ba4d1c3bfdbc271eeeeae0d.jpeg)
![eaa0075a259daa7ec4582e2482389619.png](https://i-blog.csdnimg.cn/blog_migrate/e97070779d4a85ba52f3b2e4e9a19459.jpeg)
这个dubbo.properties文件是怎么时候加载的,好像我根本没有设置,另外这个dubbo.properties文件的名字能不能改?
![ef98f8ffde78f6f1c076e718e82e41ce.png](https://i-blog.csdnimg.cn/blog_migrate/46d51c70e7feff51aa84760d6bd839d7.jpeg)
- 同理,对于log4j.xml文件
接下来继续往下走,下面这里就是我们的第二道面试题
![ba9cc51e04899100ba93106737cbde1c.png](https://i-blog.csdnimg.cn/blog_migrate/c3622ea38d248524dab6e5473bb756de.jpeg)
- 因为dubbo是支持多协议的,看文档原话
- Dubbo支持多种协议,默认使用的是dubbo协议 Dubbo协议
到了第三个面试题,也是服务发布的重点,本地暴露和远程暴露
![160390155dd16e6794f019b8244a42b9.png](https://i-blog.csdnimg.cn/blog_migrate/35e6b5bec456dd72f8d62289b3fa30ce.jpeg)
为什么会有本地暴露和远程暴露呢? 不从场景考虑讨论技术的没有意义是.在dubbo中我们一个服务可能既是Provider,又是Consumer,因此就存在他自己调用自己服务的情况,如果再通过网络去访问,那自然是舍近求远 因此他是有本地暴露服务的这个设计
- 本地暴露是暴露在JVM中,不需要网络通信
- 远程暴露是将ip,端口等信息暴露给远程客户端,调用时需要网络通信
![bf279cd36d6aaccc63dcde6f3d04efcd.png](https://i-blog.csdnimg.cn/blog_migrate/bef9ee7a43a6cc5855fd168fedc7754f.jpeg)
![eb30c3b2a39da19c3524a7f6638d4334.png](https://i-blog.csdnimg.cn/blog_migrate/4d6cf3d99ac28406a06d9d5548b78daa.jpeg)
从上图可知,这里用到了Adaptive,
- 点进ProxyFactory查看源码
@Adaptive注解打在类上和方法上,他们是有区别的 在方法上,就会生成动态编译的Adaptive类,下面就介绍一下怎么看这个动态编译类的源码
- 首先要将这个log4j的level调整为DEBUG
为什么需要调整成DEBUG, 比如下图
![3b659dea6420ad1abf1ae84b697a74b8.png](https://i-blog.csdnimg.cn/blog_migrate/a5285b5de243f0bb87bbfc41d547b7a2.jpeg)
打开DEBUG后,我们重新启动,就会看到日志有如下输出,这段就是相关代码,我们根据包名新建文件,如下
![d4739fc77f75023c3c46b9c71a03b20d.png](https://i-blog.csdnimg.cn/blog_migrate/f9b682c0d2a5af62106eafe189de078c.jpeg)
![336db32a961c8fa1abd0577d70cfb103.png](https://i-blog.csdnimg.cn/blog_migrate/f5b963201f572f7c7c14482984e43f3f.jpeg)
我们在getInvoker方法上打上断点,重启一下.
![32fa89b353f497168ba43bc1423fd3e8.png](https://i-blog.csdnimg.cn/blog_migrate/00c724cf36095dbe24c698530364de13.jpeg)
![16f36d97060b686446f7d0eb2dd76d23.png](https://i-blog.csdnimg.cn/blog_migrate/6adababefeb0831c865d32ff4f87ddca.jpeg)
![0b1f0c3c78ade9983e80f173faa47ca3.png](https://i-blog.csdnimg.cn/blog_migrate/c6a1996ff4c075f4532eb5a003518492.jpeg)
由上图知道,本地暴露的url是以injvm开头的,下面来看下远程暴露,其实这个也是回答本地暴露和远程暴露区别的一个回答点.面试回答要的并不是一个满分的答案,而是从一些细节中,看出一个人,是否真的研究过源码.
![41fd305affef083b211ce5e7f09a45db.png](https://i-blog.csdnimg.cn/blog_migrate/4cc721553103d93bee4cba96d4848423.jpeg)
还是回到开头那句话,dubbo命名是很规范的,从Wrapper这个命名,其实可以和Spring的Bean Wrapper,以及装饰者设计模式联系起来.同时可以看看文档中的编码约定
参考
- https://www.jianshu.com/p/60a9263f2ee2
- 实现细节