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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Dubbo源码解析实战 - 服务暴露原理

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


人性的拷问

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


直入主题

从启动日志说起

1.png

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

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


全局总览

先看官方文档说明


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

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

2.png


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

接下来就是 Invoker 转换到 Exporter 的过程。

3.png


看源码,很多人最常问的一句话就是,怎么入手,也就是切入点.那么我们还是以开头的日志为例,来找一个这个切入点

仔细看输出日志,就会发现在暴露本地服务之前,有一句很重要的日志,就是

The service ready on spring started. service: com.alibaba.dubbo.demo.DemoService, dubbo version: 2.0.0, current host: 127.0.0.1


该打印在今年八月被移除,具体原因不明, 留待日后分析,先继续经典版本源码

4.png2019112416565177.png


定位到了ServiceBean这个类

  • 继承体系图

6.png


继续按照经典版本源码讲解,这里最新版源码由于删除了相关接口


从这个图我们看到了许多和spring有关的东西,还发现了一个重要的接口,那就是ApplicationListener

就是spring的事件机制(event).什么是事件机制呢?

就比如监听spring容器初始化完成.那我们就定位到这行日志的位置,往下debug

7.png8.pngimage.png


重点!!!


image.pngimage.png


这个dubbo.properties文件是怎么时候加载的,好像我根本没有设置,另外这个dubbo.properties文件的名字能不能改?

12.png


  • 同理,对于log4j.xml文件

13.png


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

111.png


  • 因为dubbo是支持多协议的,看文档原话

222.png

  • Dubbo支持多种协议,默认使用的是dubbo协议
    Dubbo协议


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

333.png


为什么会有本地暴露和远程暴露呢?

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

因此他是有本地暴露服务的这个设计


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


A.pngB.png


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

  • 点进ProxyFactory查看源码

image.png


@Adaptive注解打在类上和方法上,他们是有区别的

在方法上,就会生成动态编译的Adaptive类,下面就介绍一下怎么看这个动态编译类的源码

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

D.png


为什么需要调整成DEBUG,

比如下图

1111.png


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

2222.png3333.png


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

111111111.png

333333.png2222222.png


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

image.png


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


参考

目录
相关文章
|
18天前
|
缓存 Dubbo Java
Dubbo线程模型设计解析
该文章主要介绍了Dubbo线程模型的设计解析,包括Dubbo作为一个支持大量并发请求的网络框架的特点,以及其线程模型的工作原理。
|
7天前
|
JSON Dubbo Java
【Dubbo协议指南】揭秘高性能服务通信,选择最佳协议的终极攻略!
【8月更文挑战第24天】在分布式服务架构中,Apache Dubbo作为一款高性能的Java RPC框架,支持多种通信协议,包括Dubbo协议、HTTP协议及Hessian协议等。Dubbo协议是默认选择,采用NIO异步通讯,适用于高要求的内部服务通信。HTTP协议通用性强,利于跨语言调用;Hessian协议则在数据传输效率上有优势。选择合适协议需综合考虑性能需求、序列化方式、网络环境及安全性等因素。通过合理配置,可实现服务性能最优化及系统可靠性提升。
24 3
|
18天前
|
负载均衡 Dubbo 应用服务中间件
Dubbo服务调用过程原理
该文章主要介绍了Dubbo服务调用过程的原理,包括服务调用的主要阶段和服务调用的具体步骤。
Dubbo服务调用过程原理
|
18天前
|
缓存 Dubbo Java
Dubbo服务消费者启动与订阅原理
该文章主要介绍了Dubbo服务消费者启动与订阅的原理,包括服务消费者的启动时机、启动过程以及订阅和感知最新提供者信息的方式。
Dubbo服务消费者启动与订阅原理
|
18天前
|
缓存 负载均衡 Dubbo
Dubbo服务集群容错原理(重要)
该文章主要介绍了Dubbo服务集群容错的原理,包括集群容错技术的概念、Dubbo中使用的集群容错技术种类及其原理。
|
26天前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
49 6
|
1天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
9天前
|
测试技术 Python
python自动化测试中装饰器@ddt与@data源码深入解析
综上所述,使用 `@ddt`和 `@data`可以大大简化写作测试用例的过程,让我们能专注于测试逻辑的本身,而无需编写重复的测试方法。通过讲解了 `@ddt`和 `@data`源码的关键部分,我们可以更深入地理解其背后的工作原理。
11 1
|
19天前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
51 1
|
19天前
|
开发者 Python
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
71 1

热门文章

最新文章

下一篇
云函数