开发者社区> javaedge> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Dubbo源码解析实战 - 服务暴露原理

简介: dubbo面试中比较喜欢问的两个点:服务发布和服务引用. 人性的拷问 服务发布过程中做了哪些事 dubbo都有哪些协议,他们之间有什么特点,缺省值是什么 什么是本地暴露和远程暴露,他们的区别 直入主题从启动日志说起这里不同颜色的框将关键的地方画了出来,一共有6种颜色, 从上到下 暴露本地服务...
+关注继续查看

dubbo面试中比较喜欢问的两个点:服务发布和服务引用.

人性的拷问

  • 服务发布过程中做了哪些事
  • dubbo都有哪些协议,他们之间有什么特点,缺省值是什么
  • 什么是本地暴露和远程暴露,他们的区别

直入主题
从启动日志说起

这里不同颜色的框将关键的地方画了出来,一共有6种颜色, 从上到下

  1. 暴露本地服务
  2. 暴露远程服务
  3. 启动netty
  4. 连接zookeeper
  5. 到zookeeper注册
  6. 监听zookeeper

全局总览

先看官方文档说明

服务提供者暴露一个服务的详细过程

  • 服务提供者暴露服务的主过程

首先 ServiceConfig 类拿到对外提供服务的实际类 ref(如:HelloWorldImpl),然后通过 ProxyFactory 类的 getInvoker 方法使用 ref 生成一个 AbstractProxyInvoker 实例,到这一步就完成具体服务到 Invoker 的转化。
接下来就是 Invoker 转换到 Exporter 的过程。

看源码,很多人最常问的一句话就是,怎么入手,也就是切入点.那么我们还是以开头的日志为例,来找一个这个切入点
仔细看输出日志,就会发现在暴露本地服务之前,有一句很重要的日志,就是

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文件的名字能不能改?

  • 同理,对于log4j.xml文件

接下来继续往下走,下面这里就是我们的第二道面试题

  • 因为dubbo是支持多协议的,看文档原话
  • Dubbo支持多种协议,默认使用的是dubbo协议
    Dubbo协议

到了第三个面试题,也是服务发布的重点,本地暴露和远程暴露

为什么会有本地暴露和远程暴露呢?
不从场景考虑讨论技术的没有意义是.在dubbo中我们一个服务可能既是Provider,又是Consumer,因此就存在他自己调用自己服务的情况,如果再通过网络去访问,那自然是舍近求远
因此他是有本地暴露服务的这个设计

  • 本地暴露是暴露在JVM中,不需要网络通信
  • 远程暴露是将ip,端口等信息暴露给远程客户端,调用时需要网络通信



从上图可知,这里用到了Adaptive,

  • 点进ProxyFactory查看源码

@Adaptive注解打在类上和方法上,他们是有区别的
在方法上,就会生成动态编译的Adaptive类,下面就介绍一下怎么看这个动态编译类的源码

  • 首先要将这个log4j的level调整为DEBUG

为什么需要调整成DEBUG,
比如下图

打开DEBUG后,我们重新启动,就会看到日志有如下输出,这段就是相关代码,我们根据包名新建文件,如下

我们在getInvoker方法上打上断点,重启一下.


由上图知道,本地暴露的url是以injvm开头的,下面来看下远程暴露,其实这个也是回答本地暴露和远程暴露区别的一个回答点.面试回答要的并不是一个满分的答案,而是从一些细节中,看出一个人,是否真的研究过源码.

还是回到开头那句话,dubbo命名是很规范的,从Wrapper这个命名,其实可以和Spring的Bean Wrapper,以及装饰者设计模式联系起来.同时可以看看文档中的编码约定

参考

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Dubbo服务暴露之注册地址和端口
今天在SIT环境部署dubbo容器的时候遇到一个问题, 明明我的dubbo容器已经注册到zk了, 而且在dubbo控制台也能看到提供者和消费者的信息, 可就是死活调用不了, 仔细一看, 发现提供者的地址不对啊, 这明明不是我的dubbo容器对应的那天服务器地址.这是为什么呢?
93 0
【Dubbo源码】SPI机制源码解析
【Dubbo源码】SPI机制源码解析
29 0
【Dubbo源码】SPI机制源码解析
【Dubbo源码】SPI机制源码解析
31 0
Dubbo服务目录
前面的文章中,我们分别介绍了服务暴露与服务引用的相关细节,本文中,我们来看一看上述两个过程的粘合剂`服务目录`的实现细节。
74 0
源码分析Dubbo前置篇-寻找注册中心、服务提供者、服务消费者功能入口
本节主要阐述如下两个问题: Dubbo自定义标签实现。 dubbo通过Spring加载配置文件后,是如何触发注册中心、服务提供者、服务消费者按照Dubbo的设计执行相关的功能。 所谓的执行相关功能如下: 注册中心启动,监听消息提供者的注册服务、接收消息消费者的服务订阅(服务注册与发现机制)。
1593 0
Dubbo 源码分析 - 自适应拓展原理
1.原理 我在上一篇文章中分析了 Dubbo 的 SPI 机制,Dubbo SPI 是 Dubbo 框架的核心。Dubbo 中的很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等。
1731 0
Spring-boot+Dubbo应用启停源码分析
Dubbo Spring Boot 工程致力于简化 Dubbo RPC 框架在Spring Boot应用场景的开发。同时也整合了 Spring Boot 特性: 自动装配 (比如: 注解驱动, 自动装配等). Production-Ready (比如: 安全, 健康检查, 外部化配置等).
9781 0
Spring-boot+Dubbo应用启停源码分析
你有没有想过一个问题?incubator-dubbo-spring-boot-project中的DubboConsumerDemo应用就一行代码,main方法执行完之后,为什么不会直接退出呢?
2682 0
+关注
javaedge
关注公众号:JavaEdge,后台回复面试,领取更多大厂求职资源。曾在百度、携程、华为等大厂搬砖,专注Java生态各种中间件原理、框架源码、微服务、中台等架构设计及落地实战,只生产硬核干货!
2303
文章
1
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载