Dubbo 服务引用

news2024/11/24 8:02:27

Dubbo 服务引用

0. 概述

Dubbo 服务引用的时机有两个,第一个是在 Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务,第二个是在 ReferenceBean 对应的服务被注入到其他类中时引用。这两个引用服务的时机区别在于,第一个是饿汉式的,第二个是懒汉式的。默认情况下,Dubbo 使用懒汉式引用服务。如果需要使用饿汉式,可通过配置 dubbo:reference 的 init 属性开启。下面我们按照 Dubbo 默认配置进行分析,整个分析过程从 ReferenceBean 的 getObject 方法开始。当我们的服务被注入到其他类中时,Spring 会第一时间调用 getObject 方法,并由该方法执行服务引用逻辑。按照惯例,在进行具体工作之前,需先进行配置检查与收集工作。接着根据收集到的信息决定服务用的方式,有三种,第一种是引用本地 (JVM) 服务,第二是通过直连方式引用远程服务,第三是通过注册中心引用远程服务。不管是哪种引用方式,最后都会得到一个 Invoker 实例。如果有多个注册中心,多个服务提供者,这个时候会得到一组 Invoker 实例,此时需要通过集群管理类 Cluster 将多个 Invoker 合并成一个实例。合并后的 Invoker 实例已经具备调用本地或远程服务的能力了,但并不能将此实例暴露给用户使用,这会对用户业务代码造成侵入。此时框架还需要通过代理工厂类 (ProxyFactory) 为服务接口生成代理类,并让代理类去调用 Invoker 逻辑。避免了 Dubbo 框架代码对业务代码的侵入,同时也让框架更容易使用。

1. 服务引用时序图

官方时序图如下:

在这里插入图片描述

2. 源码分析

本文是基于2.7.8源码进行分析的。

ReferenceBean.afterPropertiesSet

ReferenceBean.afterPropertiesSet 是创建代理对象的入口。

  • 调用getObject()方法
  • get()

在这里插入图片描述

ReferenceConfig.init

  • 设置接口信息
  • 加载配置的所有注册中心,拼装成urls
  • 遍历registryUrls,添加监控中心url,添加引用服务url’
  • 这里以RegistryProtocol为例。调用refer方法,返回invoker对象。特别注意,这里实际上注入的是InterfaceCompatibleRegistryProtocol实例对象

在这里插入图片描述

RegistryProtocol.refer

  • 首先为 url 设置协议头,然后根据 url 参数加载注册中心实例。
  • 然后获取 group 配置,根据 group 配置决定 doRefer 第一个参数的类型。
  • 然后调用doRefer方法。注意这里调用的是InterfaceCompatibleRegistryProtocol.doRefer方法

在这里插入图片描述

InterfaceCompatibleRegistryProtocol.doRefer

注入doRefer(Cluster cluster, Registry registry, Class type, URL url)方法中。Registry:ListenerRegistryWrapper;Cluster:MockClusterWrapper

  • getInvoker()。
  • getServiceDiscoveryInvoker()。
  • 创建MigrationInvoker对象
  • 调用interceptInvoker

在这里插入图片描述

RegistryProtocol.getInvoker

注意RegistryProtocol.getInvoker.createDirectory调用的是InterfaceCompatibleRegistryProtocol.createDirectory()方法。
所以创建出来的是RegistryDirectory类型对象。

  • 创建一个 RegistryDirectory 实例,然后生成服务者消费者链接,并向注册中心进行注册。
  • 注册完毕后,紧接着订阅 providers、configurators、routers 等节点下的数据。
  • 完成订阅后,RegistryDirectory 会收到这几个节点下的子节点信息。
  • 由于一个服务可能部署在多台服务器上,这样就会在 providers 产生多个节点,这个时候就需要 Cluster 将多个服务节点合并为一个,并生成一个 Invoker。

在这里插入图片描述

ListenerRegistryWrapper.register

向zookeeper注册consumerurl。这里以ZookeeperRegistry为例。
ListenerRegistryWrapper.registery 方法中调用ZookeeperRegistry.registry方法。

在这里插入图片描述

FailbackRegistry.register

  • 由于 ZookeeperRegistry是继承于FailbackRegistry的,因此ZookeeperRegistry.registry方法实际调用的是FailbackRegistry.registry方法。
  • FailbackRegistry 实现 AbstractRegistry 抽象类,支持失败重试的 Registry 抽象类。AbstractRegistry 进行的注册、订阅等操作,更多的是修改状态,而无和注册中心实际的操作。FailbackRegistry 在 AbstractRegistry 的基础上,实现了和注册中心实际的操作,并且支持失败重试的特性。
  • FailbackRegistry.register 中调用了 ZookeeperRegistry.doRegister方法,进行注册。

在这里插入图片描述

RegistryDirectory.subscribe

  • RegistryDirectory.subscribe 实际上最终调用的是FailbackRegistry.subscribe方法。
  • FailbackRegistry.subscribe实际上是调用了ZookeeperRegistry.doSubscribe方法。
  • 首次全量数据获取完成时,调用 RegistryDirectory.notify(...) 方法,回调 NotifyListener。服务消费者可创建所有的 Invoker 对象,用于调用服务提供者们。
    在这里插入图片描述

RegistryDirectory.notify

  • RegistryDirectory 是一个动态服务目录,会随注册中心配置的变化进行动态调整。因此 RegistryDirectory 实现了 NotifyListener 接口,通过这个接口获取注册中心变更通知。
  • RegistryDirectory.notify 会有以下的引用链:

在这里插入图片描述

在这里插入图片描述

DubboProtocol.refer

  • DubboProtocol.refer会先经过ProtocolListenerWrapper和ProtocolFilterWrapper构建监听器链和过滤器链。
  • 根据url获取ExchangeClient对象,构建消费者和提供者的底层通信链接。
  • 创建DubboInvoker,它包含对远程提供者的长链接,从而可以真正执行远程调用。并返回给目录服务RegistryDirectory持有。

在这里插入图片描述

3. 总结

本篇文章主要介绍了服务引用的过程。

4. 鸣谢

服务引用

Dubbo 服务引用源码简介

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

锅圈的新消费“第三条路”走得通吗?

文|螳螂观察 作者|kinki 临近春节,线下餐饮行业在经历了三年的寒冬之后,相信会在今年迎来一个“暖春”。不过,年夜饭一直存在“一桌难求”的现象,结合疫情因素,相信今年仍有不少消费会选择在家用餐。 因此&#xff…

生成随机用户名的测试数据

大家好,才是真的好。 记得我们以前讲过一篇《自动批量生成Notes应用测试数据!》,利用Java自动生成大批量的测试数据,今天我们介绍使用LotusScript代码来实现自动生成随机数据,主要是随机的用户名。 我们的方法很简单…

〖百宝书-思维锻炼②〗——知识是人类的供需和营养品

大家好,我是涵子,今天我们来聊聊知识。 💬 人生格言:Stay foolish, stay kind.💬 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 &#x…

Feed 流系统

差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代表性的产品就是微博、微信,以及后来的今日头条、快手等。这些移动互联网时代的新产品在过去几年间借着智能手机的风高速成长。 这些产品都是Fee…

VueJs中的shallowRef与shallowReactive的使用比较

01shallowRef()函数如果传入基本数据类型,那么shallowRef与ref的作用基本没有什么区别,也就是浅层的ref的内部值将会原样的存储和暴露,并不会被深层递归地转为响应式但如果是对象的话,那么就存在区别了的,shallowRef不处理对象类型的数据其实,它就是只处理基本数据类型的响应式…

从 JMM 透析 volatile 与 synchronized 原理

在面试、并发编程、一些开源框架中总是会遇到 volatile 与 synchronized 。synchronized 如何保证并发安全?volatile 语义的内存可见性指的是什么?这其中又跟 JMM 有什么关系,在并发编程中 JMM 的作用是什么,为什么需要 JMM&#…

信用评分分卡简介introduction of credit score card

背景 随着金融科技初创企业的兴起,过去 5 年中出现了许多新的消费信贷机构,与传统银行展开竞争。他们通常瞄准银行认为规模太小或因金融危机期间发生的后期损失而不得不削减贷款的细分市场。通俗的讲就是消费金融公司瞄准了银行的次贷市场。 这些新的消…

修改Pom文件需要注意的问题

1.从远程nuxaus拉不回来个别包该如何解决 进入仓库目录下,把该包的目录删除了,重新拉 rm -r 包目录 如果还是不行,可能是idea内存不够,尝试关闭暂时不用但是已经打开的项目,减少内存使用,删除包目录重试…

肌电信号采集电路分析

最近在开发肌电信号的采集,表面肌电信号是非常微弱的生物信号,正常人体表面肌电信号赋值为0--1.5mV,主要能量频段集中在10--150Hz。电路主要是根据原始信号,设计相应的放大电路、滤波电路,下面直接放原理图说明。一级放…

生物素点击试剂1255942-07-4,DBCO-PEG4-Biotin,生物素-PEG4-二苯基环辛炔

中英文别名:CAS号:1255942-07-4| 英文名:DBCO-PEG4-Biotin |中文名:二苯基环辛炔-PEG4-生物素,二苯基环辛炔-四聚乙 二醇-生物素物理参数:CASNumber:1255942-07-4Molecular formula:…

2023的网安玩家,会和布洛芬退烧一样“凉”得快吗?

2021年,《数据安全法》《网络安全产业高质量发展三年行动计划》《个人信息保护法》《网络产品安全漏洞管理规定》等政策法规扎堆发布,二级市场网安公司市值一度起飞,网络安全行业如日中天,业内大佬纷纷感慨总算熬出了头&#xff0…

python-MySQL数据库基础(一)数据库基础知识、MYSQL的介绍和安装、数据类型

数据库介绍 数据库(database)简称DB,实际上是一个文件集合,是一个存储数据的仓库,本质上是一个文件系统,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查等操作,音乐,…

读书笔记:手写数字识别 ← 斋藤康毅

求解机器学习问题的步骤可以分为“学习”和“推理”两个阶段。本例假设“学习”阶段已经完成,并将学习到的权重和偏置参数保存在pickle文件sample_weight.pkl中。至于是如何学习的,斋藤康毅指出会在后续章节详述。之后,使用学习到的权重和偏置…

Allegro如何利用Create Bound Shape自动画铜皮操作指导

Allegro如何利用Create Bound Shape自动画铜皮操作指导 在做PCB设计的时候,画铜皮操作是时常需要用到的操作,对于非常规角度画铜皮是个比较麻烦的事情,在Allegro升级到了172版本的时候,有个Create Bound Shape命令,画异形铜皮十分快捷,如下图 贴着过孔的边缘画弧形的铜皮…

【进击的算法】基础算法——回溯算法

🍿本节主题:回溯算法 🎈更多算法:深入聊聊KMP算法 💕我的主页:蓝色学者的个人主页 文章目录一、前言二、概念三、例题1.题目:全排列2.解题思路回溯算法的本质问题1:问题2&#xff1a…

linux 解压命令------超详细

目录 一、前期准备: 二、安装finalShell并与虚拟机进行连接 三、上传数据到虚拟机 四、解压命令练习 1. 解压zip包 unzip apache-maven-3.6.3-bin.zip 2. 解压tar.gz包 tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 一、前期准备: 1.final…

Redis命令及其数据类型详解

前面的文章我们讲解过关于Redis的安装: 手把手教你Linux下安装部署Redis,今天我们具体的讲一下Redis的命令及其5种数据类型 Redis命令 Redis命令用于在redis服务上来执行某些特定操作。 这里我们以Linux下的操作为例: 进入到我们Redis的bin目录下&am…

企业档案信息化规划总体框架

按照《中华人民共和国档案法》《企业档案管理规定》《企业档案工作规范》《企业数字档案馆(室)建设指南》等政策文件要求,企业档案信息化建设应从基础设施体系、应用系统体系、档案资源体系、标准规范体系、安全保障体系、组织人才体系六方面…

ARM公司发展史

1. 前言 当前,X86和ARM架构是公认的在商业化进程中表现最优秀的两大架构。之前我们已经介绍了X86架构,今天介绍另一个在近十年大火的架构,ARM。 ARM架构,过去称作进阶精简指令集机器(Advanced RISC Machine&#x…

【Java】【系列篇】【Spring源码解析】【二】【整体】【Spring整体流程解析】

本篇文章的目的是希望对Spring运行有个整体上的了解,后面的文章都是基于此12大步骤 读完这篇文章,你可以了解到: 1.spring运行的大致流程,他在这个期间做了哪些事 2.xml方式和注解方式载入BeanDifinition的时机一、Spring的运行的…