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

简介: 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,以及装饰者设计模式联系起来.同时可以看看文档中的编码约定


参考

目录
相关文章
|
弹性计算 运维 安全
优化管理与服务:操作系统控制平台的订阅功能解析
本文介绍了如何通过操作系统控制平台提升系统效率,优化资源利用。首先,通过阿里云官方平台开通服务并安装SysOM组件,体验操作系统控制平台的功能。接着,详细讲解了订阅管理功能,包括创建订阅、查看和管理ECS实例的私有YUM仓库权限。订阅私有YUM仓库能够集中管理软件包版本、提升安全性,并提供灵活的配置选项。最后总结指出,使用阿里云的订阅和私有YUM仓库功能,可以提高系统可靠性和运维效率,确保业务顺畅运行。
|
10月前
|
网络协议 安全 Devops
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
405 4
|
12月前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
724 27
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
728 4
JSON数据解析实战:从嵌套结构到结构化表格
|
12月前
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
476 4
|
12月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
742 3
|
缓存 监控 搜索推荐
【实战解析】smallredbook.item_get_video API:小红书视频数据获取与电商应用指南
本文介绍小红书官方API——`smallredbook.item_get_video`的功能与使用方法。该接口可获取笔记视频详情,包括无水印直链、封面图、时长、文本描述、标签及互动数据等,并支持电商场景分析。调用需提供`key`、`secret`和`num_iid`参数,返回字段涵盖视频链接、标题、标签及用户信息等。同时,文章提供了电商实战技巧,如竞品监控与个性化推荐,并列出合规注意事项及替代方案对比。最后解答了常见问题,如笔记ID获取与视频链接时效性等。
|
数据可视化 测试技术 API
GraphQL开发工具选型指南:Apipost高效调试与文档生成实战解析
本文深入解析了GraphQL开发工具Apipost在高效调试与文档生成方面的优势,对比同类工具Apifox,突出其可视化界面、实时调试及自动化文档生成等特性。Apipost通过智能代码补全、错误提示等功能简化复杂Query编写,支持一键生成标准化文档,显著提升开发效率和团队协作效果,尤其适合中大型团队应对复杂业务场景。
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1140 29
|
12月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
482 4

推荐镜像

更多
  • DNS