Dubbo 源码剖析与实战
何辉
平安壹钱包架构师
4711 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
开篇词 (1讲)
Dubbo 源码剖析与实战
15
15
1.0x
00:00/00:00
登录|注册

19|发布流程:带你一窥服务发布的三个重要环节

你好,我是何辉。今天我们深入研究 Dubbo 源码的第八篇,发布流程。
提到发布,还记得在“温故知新”中学过的那张 Dubbo 总体架构示意图么:
我们回顾和发布有关的环节,第 ① 步编写提供方的 XML 配置文件,服务的发布首先需要进行一系列的配置,配置好后,可以通过 dubbo:service 标签进行服务的导出与注册,然后,在第 ③ 步中,提供方可以通过设置 dubbo.application.register-mode 属性来自由控制服务的注册方式。
总的来说,发布的大致流程就 3 个环节“配置 -> 导出 -> 注册”,那你知道每个环节的机制究竟是什么样的么?我们今天就来解决这个问题。
怎么探索呢?在编写提供方时,我们都会给即将导出的服务上面添加一个 @DubboService 注解,那我们就从这个注解开始,首先逆向找到 @DubboService 中这些配置去哪里了,然后在配置被使用的地方,再看看能不能发现导出服务的核心代码,顺着导出逻辑,探究服务注册的核心原理。
要特别说明的是,今天大部分时间都会在讲源码,可能会比较枯燥,但不用担心,我会尽量讲的简单易懂,而且源码的分析流程你掌握透了,以后分析问题和框架扩展会如有神助。

配置

我们开始吧,先来简单看看提供方的一段代码。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入研究了Dubbo源码的服务发布流程,重点介绍了配置、导出和注册三个重要环节。通过逆向寻找的方式,详细介绍了Dubbo服务发布的关键流程,包括@DubboService注解标识服务、扫描器扫描带有该注解的类并创建新的ServiceBean类型的Bean定义,以及ServiceBean被触发执行导出方法的过程。文章着重分析了导出环节的实现细节,包括本地导出和远程导出的实现方式、配置url的scope属性控制导出方式的三种方式,以及代理对象的获取流程和JavassistProxyFactory实现类中的代理对象生成逻辑。总的来说,本文通过深入解析Dubbo源码中服务发布流程,为读者提供了全面的技术视角和详细的实现细节,帮助读者快速了解Dubbo服务发布的内部机制,为后续的问题分析和框架扩展提供了重要参考。文章内容涉及的技术细节丰富,通过对Dubbo源码的深入解析,读者可以全面了解Dubbo服务发布的内部机制,为后续的问题分析和框架扩展提供了重要参考。文章还提出了思考题,引发读者对Dubbo源码的更深层次思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Dubbo 源码剖析与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • Mystery森淼,🍃
    老师,服务的暴露应该怎么理解呢,

    作者回复: 你好,Mystery森淼,🍃:粗俗的理解就是开启本地端口服务,让别人能通过网络进行调用。Dubbo 的服务暴露,其本意就是让服务端编写的接口,在利用 Socket 开启的端口服务,能够被其他进程通过【IP + 端口 + 接口】发起通信调用。

    2023-04-01归属地:北京
    1
  • w 🍍
    protocolSPI默认是dubbo,那么是怎么找到injvm的

    作者回复: 你好,w 🍍:在 org.apache.dubbo.config.ServiceConfig#exportLocal 方法里面有个 setProtocol("injvm") 预先导出本地的一份,然后在 org.apache.dubbo.config.ReferenceConfig#createProxy 方法中的 shouldJvmRefer 子方法中有对是否是 injvm 的判断。

    2023-06-13归属地:浙江
    2
  • Geek_10086
    老师,请问 serviceBean怎么触发的 serviceConfig#exprot方法,一直没有找到

    作者回复: 你好,Geek_10086:【org.apache.dubbo.config.spring.context.DubboDeployApplicationListener#onApplicationEvent】 --> 【org.apache.dubbo.config.deploy.DefaultModuleDeployer#start】 --> 【org.apache.dubbo.config.deploy.DefaultModuleDeployer#exportServices】,然后你会看到【configManager.getServices()】这个里面的元素对象就是【serviceBean】对象。

    2023-02-24归属地:河北
    3
  • 阿昕
    本地导出是为了开启本地协议端口的netty服务,远程导出是为了写入数据到注册中心,可以这样理解吗?

    作者回复: 你好,阿昕:如果是按照我在“总结”环节的那张图来讲的话,本地导出是当系统调用自己系统的接口时,为了不发起远程调用,就引出了本地导出这个功能。 而远程导出,就是开始 Netty 服务,以及写注册中心。

    2023-02-07归属地:浙江
  • William
    1、配置: @DubblService , 定义实现类service -->>最终生成 ServiceBean(BeanDefinition) 2、导出: export 暴露接口给外部使用(本地、远程) 3、注册: 注册到相应的协议上(zk临时节点).
    2023-12-04归属地:吉林
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部