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

浅谈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、调用链路

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

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android 13 - Media框架(26)- OMXNodeInstance(三)

上一节我们了解了OMXNodeInstance中的端口定义&#xff0c;这一节我们一起来学习ACodec、OMXNode、OMX 组件使用的 buffer 到底是怎么分配出来的&#xff0c;以及如何关联起来的。&#xff08;我们只会去了解 graphic buffer的创建、input bytebuffer的创建、secure buffer的创…

20231223使用Rockchip原厂的Android11调通Firefly的AIO-3399J开发板上的AP6356S

20231223使用Rockchip原厂的Android11调通Firefly的AIO-3399J开发板上的AP6356S 2023/12/23 14:14 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2…

[Angular] 笔记 8:list/detail 页面以及@Input

1. list 页面 list/detail 是重要的 UI 设计模式。 vscode terminal 运行如下命令生成 detail 组件&#xff1a; PS D:\Angular\my-app> ng generate component pokemon-base/pokemon-detail --modulepokemon-base/pokemon-base.module.ts CREATE src/app/pokemon-base/p…

SQL进阶:子查询

一般情况下,我们都是直接对表进行查询,但有时候,想要的数据可能通过一次select 获取不到,需要嵌套select,这样就形成了子查询。 子查询可以位于查询语句的任意位置,主要的注意点在于用于不同的位置,和不同的关键字一起使用时,需要注意返回的列的数量和行的数量。 位于…

大一C语言查缺补漏 12.24

遗留问题&#xff1a; 6-1 1 在C语言中&#xff0c;如果要保留小数的话&#xff0c;一定要除以2.0&#xff0c;而不是2。 设整型变量m,n,a,b的值均为1&#xff0c;执行表达式&#xff08;m a>b&#xff09;||(n a<b)后&#xff0c;表达式的值以及变量m和n的值是&#…

redis怎么查看bigkey

通过docker-compose启动一个redis服务器 docker-compose.yml文件的内容如下&#xff1a; version: 3 services:redis:image: redisports:- 6379:6379docker-compose up -d 启动redis容器 在服务器上安装redis-cli工具 这里我是ubuntu服务器&#xff0c;centos用yum代替apt安…

[机器人-2]:开源MIT Min cheetah机械狗设计(二):机械结构设计

目录 1、四肢朝向的选择 2、电机布局形式的选择 3、电机的选型及测试&#xff08;非常重要&#xff09; 4、结构优化 5、尺寸效应 6、其他 1、四肢朝向的选择 机械狗的结构设计&#xff0c;第一个摆在我们面前的就说四肢的朝向问题&#xff0c;如下图&#xff0c;我们是…

C++类的继承

目录 什么是继承&#xff1f; 父类与子类对象的赋值转换 继承中的作用域问题 子类的默认成员函数问题 如何使一个类不能被继承&#xff1f; 父类的友元和静态成员变量 多重继承与菱形继承 继承和组合 什么是继承&#xff1f; 继承 (inheritance) 机制是面向对象程序设…

继承易错总结

1.继承会将所有的成员继承下来&#xff0c;但是继承方式限定的是继承下来成员的可见类型(如果是private继承&#xff0c;那么他不论哪里都是不可见的&#xff1b;如果是protected继承在类中是可见的&#xff0c;在类外是不可见的&#xff1b;如果是public继承&#xff0c;在任何…

redis 从0到1完整学习 (五):集合 IntSet 数据结构

文章目录 1. 引言2. redis 源码下载3. IntSet 数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;redis 常用命令》 《redi…

将Go语言开发的Web程序部署到K8S

搭建K8S基础环境 如果已经有K8S环境的同学可以跳过&#xff0c;如果没有&#xff0c;推荐你看看我的《Ubuntu22加Minikue搭建K8S环境》&#xff0c;课程目录如下&#xff1a; Ubuntu22安装Vscode 下载&#xff1a;https://code.visualstudio.com/Download 安装命令&#…

Django之DRF框架三,序列化组件

一、序列化类的常用字段和字段参数 常用字段 字段名字段参数CharFieldmax_lengthNone, min_lengthNone, allow_blankFalse, trim_whitespaceTrueIntegerFieldmax_valueNone, min_valueNoneFloatFieldmax_valueNone, min_valueNoneBooleanFieldNullBooleanFieldFloatFieldmax_…

司铭宇老师:汽车销售培训-如何提升4S店获客能力

一、数据分析与客户画像 1.数据收集与分析 4S店应当充分利用现有资源&#xff0c;收集客户信息、车辆信息、消费行为等数据。通过数据清洗、整理和分析&#xff0c;挖掘客户需求、喜好和购车习惯等关键信息。此外&#xff0c;还可以通过合作伙伴、互联网渠道等途径&#xff0…

电子电器架构刷写方案——General Flash Bootloader

电子电器架构刷写方案——General Flash Bootloader 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 注&#xff1a;文章1万字左右&#xff0c;深度思考者入&#xff01;&#xff01;&#xff01; 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免…

NLP论文阅读记录 - | 使用GPT对大型文档集合进行抽象总结

文章目录 前言0、论文摘要一、Introduction二.相关工作2.1Summarization2.2 神经网络抽象概括2.2.1训练和测试数据集。2.2.2 评估。 2.3 最先进的抽象摘要器 三.本文方法3.1 查询支持3.2 文档聚类3.3主题句提取3.4 语义分块3.5 GPT 零样本总结 四 实验效果4.1数据集4.2 对比模型…

基于Python的招聘网站信息爬取与数据分析

文末获取资源&#xff0c;收藏关注不迷路 文章目录 前言一、研究背景二、研究意义三、主要使用技术四、研究内容五、核心代码六、文章目录 前言 随着社会经济的快速发展&#xff0c;人们的生活水平得到了显著提高&#xff0c;但随之而来的社会问题也越来越多。其中最为显著的…

构建一个 AI Agent 只需要三步!

▼最近直播超级多&#xff0c;预约保你有收获 今晚直播&#xff1a;《GPTs 构建应用程序案例实现》 —1— 今晚20点直播手把手教你三步构建一个 AI Agent AI Agent 是 AGI 时代新的企业级应用形态&#xff0c;因此掌握好 AI Agent 的架构技术原理和应用开发就是每个程序员的必备…

SpaceDesk如何连接平板/PC(生产力副屏)

1、下载安装 分为安卓端和PC端&#xff0c;两个设备都需要安装对应的软件。 SpaceDesk官网 https://link.zhihu.com/?targethttp%3A//spacedesk.net/ 需要魔法上网。安装过程比较简单&#xff0c;无脑下一步即可。 我已经把安装包准备好了&#xff0c;如果不想自己找&#…

sklearn 逻辑回归Demo

逻辑回归案例 假设表示 基于上述情况&#xff0c;要使分类器的输出在[0,1]之间&#xff0c;可以采用假设表示的方法。 设 h θ ( x ) g ( θ T x ) h_θ (x)g(θ^T x) hθ​(x)g(θTx)&#xff0c; 其中 g ( z ) 1 ( 1 e − z ) g(z)\frac{1}{(1e^{−z} )} g(z)(1e−z)1​…

HUAWEI华为笔记本电脑MateBook D 14 2022款 i5 集显 非触屏(NbDE-WFH9)原装出厂Windows11系统21H2

链接&#xff1a;https://pan.baidu.com/s/1-tCCFwZ0RggXtbWYBVyhFg?pwdmcgv 提取码&#xff1a;mcgv 华为MageBookD14原厂WIN11系统自带所有驱动、出厂状态主题壁纸、Office办公软件、华为电脑管家、华为应用市场等预装软件程序 文件格式&#xff1a;esd/wim/swm 安装方式…