浅谈Dubbo核心概念及架构流程

news2024/9/28 13:28:05

浅谈Dubbo核心概念及架构流程

    • 前言
    • 重要概念
      • 1、SPI
      • 2、ServiceBean
      • 3、URL
      • 4、Invoker
    • 整体流程
      • 1、架构图
      • 2、调用链路

笔者碎碎言,我们学习Dubbo应该学的是什么?
笔者是一名业务开发,认为一切目的都要为我们的目标服务,即日常工作有帮助,所以笔者今天应该学的是它的源码实现流程、设计思想、扩展点,过于细节的去理解记忆源码细节ROI则太低。

  • 源码实现流程:让我们对Dubbo有一个整体的了解,日常遇到框架报错,可以更快定位原因
  • 设计思想:在面对类似的复杂的业务场景时,我们可以参考Dubbo设计,毕竟Dubbo已经给出了一个相对最优解
  • 扩展点:可以帮助我们在日常开发中借助三方框架更加方便的实现我们的功能。以我的亲身经历来说,就借助过Dubbo的Filter扩展链,完成对标记了@Deprecated接口的流量收集。还有泛化调用等场景

官网地址

前言

Dubbo源码主体流程可以总结为:服务提供者将编写的业务Service服务,按照某种协议序列化到注册中心,标记当前服务的网络资源所在的位置;服务消费者根据指定的key(version+interfaceName+group)去注册中心中找到对应的序列化数据,再将数据反序列化为服务消费者能够识别的格式,最终对目标资源发起调用。以此达到我们调用远程服务变成跟调用本地服务一样。

整体功能完成的基础上,Dubbo在设计上对扩展开放,一些比较重点的节点都能够进行扩展。如:自定义注册中心、自定义配置中心、自定义序列化协议、请求过滤器链Fiter等。一些个性功能的设计也是基于扩展点完成,如:mock机制、心跳机制、泛化掉用、异步调用、异常重试机制、回声测试等



重要概念

1、SPI

Dubbo的SPI机制与Java原生的SPI基本类似,但功能更加丰富。

  1. 使用@Adaptive注解来指定某个类为某个接口的代理类,Dubbo在生成自适应扩展点对象时,实际上生成的就是@Adaptive注解所注解的类的实例对象
  2. 实现了一套简单的AOP,如果一个接口的扩展点中包含了多个Wrapper类,那么在Dubbo在实例化完某个扩展点后,就会利用这些Wrapper类对这个实例进行包裹,比如:现在有一个DubboProtocol的实例,同时对于Protocol这个接口还有很多的Wrapper,比如ProtocolFilterWrapper、ProtocolListenerWrapper,那么,当对DubboProtocol的实例完成了IOC之后,就会先调用new ProtocolFilterWrapper(DubboProtocol实例)生成一个新的Protocol的实例,再对此实例进行IOC,完了之后,会再调用new ProtocolListenerWrapper(ProtocolFilterWrapper实例)生成一个新的Protocol的实例,然后进行IOC,从而完成DubboProtocol实例的AOP(类比装饰器模式,包一层)

基本用法如下:表示获取"dubbo"对应的Protocol扩展点。Protocol是一个接口。

ExtensionLoader<Protocol> extensionLoader = ExtensionLoader.getExtensionLoader(Protocol.class);
Protocol http = extensionLoader.getExtension("dubbo");
System.out.println(http);

2、ServiceBean

ServiceBean表示一个Dubbo服务,相关参数含义:

  1. ref,表示服务的具体实现类
  2. interface,表示服务的接口
  3. parameters,表示服务的参数(@Service注解中所配置的信息)
  4. application,表示服务所属的应用
  5. protocols,表示服务所使用的协议
  6. registries,表示服务所要注册的注册中心

补充:在扫描到一个@Service注解后,会得到两个Bean:

  1. 一个就是服务实现类本身一个Bean对象
  2. 一个就是对应的ServiceBean类型的一个Bean对象

3、URL

官网:Dubbo 中的 URL 统一模型

定义了服务资源的协议、参数等信息。主要用于在各个扩展点之间传递数据,组成此 URL 对象的具体参数如下:

  • protocol:一般是 dubbo 中的各种协议 如:dubbo thrift http zk
  • username/password:用户名/密码
  • host/port:主机/端口
  • path:接口名称
  • parameters:参数键值对

dubbo 认为 protocol,username,passwored,host,port,path 是主要的 URL 参数,其他键值对存放在 parameters 之中。示例如下:

dubbo://192.168.1.6:20880/moe.cnkirito.sample.HelloService?timeout=3000
描述一个 dubbo 协议的服务

zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=demo-consumer&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=1214&qos.port=33333&timestamp=1545721981946
描述一个 zookeeper 注册中心

consumer://30.5.120.217/org.apache.dubbo.demo.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.0.2&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=1209&qos.port=33333&side=consumer&timestamp=1545721827784
描述一个消费者

4、Invoker

属于Dubbo的核心模型,在代码实现层面类比递归调用的责任链设计模式

  • 在服务提供方Invoker是javassist创建的服务类的实例,可以实现调用服务类内部的方法和修改字段。

  • 在服务消费方的Invoker是基于Netty的客户端。

通过服务消费方Netty客户端获得服务提供方创建的服务类实例,而后消费方为保护服务类就需要为其创建代理类,这样就可以在不实例化服务类情况下安全有效的远程调用服务类内部方法并且得到具体数据了。

常见的Invoker:

  1. MockClusterInvoker: 完成Mock功能,由MockClusterWrapper生成,MockClusterWrapper是Cluster接口的包装类,通过Cluster.join()方法得到MockClusterInvoker

  2. FailoverClusterInvoker:完成集群容错功能,是MockClusterInvoker的下级

  3. RegistryAwareClusterInvoker:如果指定了多个注册中心,那么RegistryAwareClusterInvoker完成选择默认的注册中心的进行调用,如果没有指定默认的,则会遍历注册中心进行调用,如果该注册中心没有对应的服务则跳过。

  4. DubboInvoker:完成Dubbo协议底层发送数据

  5. ProtocolFilterWrapper$CallbackRegistrationInvoker:完成对filter的调用,ProtocolFilterWrapper是Protocol接口的包装类,通过Protocol.refer()方法得到CallbackRegistrationInvoke。



整体流程

1、架构图

左侧为服务消费者,右侧为服务提供者

  1. service层,接口层,给服务提供者和消费者来实现的
  2. config层,配置层,主要是对dubbo进行各种配置的
  3. proxy层,服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton
  4. registry层,服务注册层,负责服务的注册与发现
  5. cluster层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
  6. monitor层,监控层,对rpc接口的调用次数和调用时间进行监控
  7. protocol层,远程调用层,封装rpc调用
  8. exchange层,信息交换层,封装请求响应模式,同步转异步
  9. transport层,网络传输层,抽象mina和netty为统一接口
  10. serialize层,数据序列化层,网络传输需要

请添加图片描述


2、调用链路

左侧为服务消费者,右侧为服务提供者

请添加图片描述

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

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

相关文章

fragstats:景观指数的突变分析

作者&#xff1a;CSDN _养乐多_ 本文将介绍景观指数时间序列的突变分析&#xff0c;包括突变时间、突变频次等。以及景观指数突变分析所用的软件和 python 代码。 结果如下图所示&#xff0c; 图1 突变频次 图2 突变时间 文章目录 一、景观指数计算二、景观指数时间序列构建…

Python 数据分析 Matplotlib篇 plt.rcParams 字典(第5讲)

Python 数据分析 Matplotlib篇 plt.rcParams字典(第5讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

传输损伤和传输质量解读

目录 传输损伤 传输质量 噪声和干扰 通信编码 传输损伤 数据信号在数据通信系统的端到端连接的每个环节都可能受到伤害&#xff0c;ITU称之为传输损伤。并推荐用误码、抖动、漂移、滑动和时延来表示。 误码(Error)。指信号在传输过程中码元发生的差错&#xff0c;即接…

SpringBoot2.x+mybatis plus3.x集成Activit7版本

文/朱季谦 在Activiti6版本当中&#xff0c;若要集成到Springboot里&#xff0c;需要写一些额外的配置类&#xff0c;我曾经在Activiti工作流框架学习笔记&#xff08;二&#xff09;之springboot2.0整合工作流Activiti6.0一文当中总结过相关配置过程&#xff0c;感兴趣的同学…

SpringBoot集成RabbitMq消息队列【附源码】

1. 项目背景 要啥项目背景&#xff0c;就是干&#xff01;&#xff01;&#xff01; SpringBoot版本&#xff1a;2.7.12 2. Rabbit MQ安装 这里讲解使用docker安装RabbitMQ&#xff0c;如果在windows下面安装RabbitMQ&#xff0c;参考下文 【笑小枫的按步照搬系列】Window…

数据结构:KMP算法

1.何为KMP算法 KMP算法是由Knuth、Morris和Pratt三位学者发明的&#xff0c;所以取了三位学者名字的首字母&#xff0c;叫作KMP算法。 2.KMP的用处 KMP主要用于字符串匹配的问题&#xff0c;主要思想是当出现字符串不匹配时&#xff0c;我们可以知道一部分之前已经匹配过的的文…

音视频技术开发周刊 | 325

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 AI读心术震撼登顶会&#xff01;模型翻译脑电波&#xff0c;人类思想被投屏&#xff5c;NeurIPS 2023 在最近举办的NeurIPS大会上&#xff0c;研究人员展示了当代AI更震撼…

服务器扩容未生效、不成功:解决方法

记一次解决服务器扩容未生效的解决办法 老板&#xff1a;失忆啊&#xff0c;我花钱给服务器扩容了10000000G&#xff0c;但是数据库和mq都还是用不了&#xff0c;到底是不是服务器磁盘满了&#xff0c;你到底有没有查一下什么原因导致服务用不了啊。 失忆&#xff1a;老板您确…

【并发编程篇】读锁readLock()和写锁writeLock()

文章目录 &#x1f6f8;情景引入⭐解决问题 readLock()和writeLock()都是ReadWriteLock接口中定义的方法&#xff0c;用于获取读锁和写锁。 readLock()方法返回一个读锁&#xff0c;允许多个线程同时获取该锁&#xff0c;以进行并发读取操作。如果当前已有一个写锁或其他线程正…

第三十六周:文献阅读+注意力/自注意力机制

目录 摘要 Abstract 文献阅读&#xff1a;锂离子电池RUL预测的SA-LSTM 现有问题 提出方法 提出方法的结构 SA-LSTM预测模型的结构 研究实验 研究贡献 注意力机制 Self-Attention&#xff08;自注意力机制&#xff09; 注意力与自注意力 代码实现attention、self-at…

uni-app pages.json之globalStyle全局页面样式配置

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

静态HTTP的常见问题和解决方法

大家好&#xff0c;欢迎来到今天的“静态HTTP大讲堂”&#xff01;今天我们要聊聊静态HTTP的常见问题和解决方法。别小看这些问题哦&#xff0c;它们就像是那些顽皮的小妖精&#xff0c;时不时地给你的网站搞点恶作剧。不过别担心&#xff0c;有我在&#xff0c;这些小妖精都得…

超维空间S2无人机使用说明书——51、使用yolov8进行目标跟踪

引言&#xff1a;为了提高yolo识别的质量&#xff0c;提高了yolo的版本&#xff0c;改用yolov8进行物体识别&#xff0c;同时系统兼容了低版本的yolo&#xff0c;包括基于C的yolov3和yolov4&#xff0c;以及yolov7。 简介&#xff0c;为了提高识别速度&#xff0c;系统采用了G…

HTTP分数排行榜

HTTP分数排行榜 介绍一、创建数据库二、创建PHP脚本三、上传下载分数四、测试 介绍 Unity中向服务器发送用户名和得分&#xff0c;并存入数据库&#xff0c;再讲数据库中的得分按照降序的方式下载到Unity中。 一、创建数据库 首先&#xff0c;我们要在MySQL数据库中建立一个…

文本编辑器:Sublime Text (安装+汉化)

下载 Sublime Text - Text Editing, Done Righthttps://www.sublimetext.com/Sublime Text官网 支持mac&#xff0c;Linux&#xff0c;Windows 安装 选择安装路径 next install 选择安装位置安装就行了 汉化 进入了主界面按 CTRLshiftp 输入install 选择第一个 弹窗就按确…

(Matlab)基于CNN-LSTM的多输入分类(卷积神经网络-长短期记忆网络)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、代码实际运行结果展示&#xff1a; 三、部分代码展示&#xff1a; 四、本文完整代码数据下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码…

养车平台源码定制化需求指南:10种实用功能一览

作为养车平台源码定制化领域的专家&#xff0c;我将向您介绍10种实用功能&#xff0c;帮助您更好地满足定制化需求&#xff0c;并提升用户体验。 1. 个性化主题定制 定制化养车平台源码可轻松实现个性化主题定制&#xff0c;包括颜色、字体、背景等&#xff0c;提供多样化选择…

2047过滤空格(C语言)

目录 一&#xff1a;题目 二&#xff1a;思路分析 三&#xff1a;代码 一&#xff1a;题目 二&#xff1a;思路分析 1.首先&#xff0c;这道题是一个字符串的问题&#xff0c;我们要先知道字符串存放在char类型的数组中的&#xff0c;并不是一个变量就可直接存放的下一个完整…

48V转12V 300mA降压芯片,60V耐压、0.6A稳压芯片带ECO模式-AH590L

AH590L是一种48V转12V 300mA降压芯片&#xff0c;具有60V耐压、0.6A稳压电流的特点&#xff0c;并且还带有ECO模式&#xff0c;是一种理想的开关电源解决方案。 AH590L是PWM模式 DC/DC降压转换器。TEL&#xff1a;l86*4884*3702*宽输入电压范围4至60V适用于工业领域的广泛应用…

基于ElMessageBox创建虚拟dom对话框

在提交表单的场景下&#xff0c;如果只有几个表单&#xff0c;不想单独创建一个对话框Dialog然后引用&#xff0c;通过使用vue3的h函数创建虚拟dom然后展示在ElMessageBox&#xff0c;这样可以通过promis回调&#xff0c;灵活的控制对话框打开关闭&#xff0c;也不用重新单独写…