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

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

请添加图片描述

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

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

相关文章

医院智慧能源管理平台,为医疗机构高效控能!

随着医院的不断扩大与发展&#xff0c;能源问题日益严重。大型医院能耗计量点位繁多&#xff0c;数据采集方式落后&#xff0c;难以保证计量管理的准确性与科学性。为了对医院能耗进行精细化管理&#xff0c;实时监测用能情况&#xff0c;需要建议一个完善的监管体系。基于能源…

Java Heap Space堆内存异常处理

Heap Space问题是Java开发中常见的内存溢出问题之一&#xff0c;我们需要理解其原因和表现形式&#xff0c;然后通过优化代码、增加JVM内存和使用垃圾回收机制等方法来解决。 场景 新增数据&#xff0c;富文本插入多张图片&#xff0c;总共总共大小6.6MB&#xff0c;提交报50…

【XML】TinyXML 详解(一):介绍

【C】郭老二博文之&#xff1a;C目录 1、简介 优点&#xff1a; TinyXML 是一个简单、小型的 C XML 解析器&#xff0c;可以轻松集成到项目中。 TinyXML 解析 XML 文档&#xff0c;并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的&a…

计算机毕业设计------SSM网上超市购物商城管理系统

项目介绍 本项目分为前后台&#xff0c;分为普通用户、管理员两种角色。前台普通用户登录&#xff0c;后台管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 登录页面,用户查看,一级分类管理,二级分类管理,商品管理,查看订单,留言管理等功能。 用户角色包含以下功…

如何使用JuiceSSH实现手机端远程连接Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

Linux---命令行参数+环境变量

一、命令行参数 int main(int argc,char*argv[]) {//...return 0; } 不知道有没有人见过这样的主函数&#xff0c;它带了两个参数&#xff0c;argv接收的参数就叫做命令行参数&#xff0c;因为它的参数是从命令行来的&#xff0c;给大家演示一下&#xff0c;大家就懂了 命令行…

算法基础之数字三角形

数字三角形 核心思想&#xff1a;线性dp 集合的定义为 f[i][j] –> 到i j点的最大距离 从下往上传值 父节点f[i][j] max(f[i1][j] , f[i1][j1]) w[i][j] 初始化最后一层 f w #include <bits/stdc.h>using namespace std;const int N 510;int w[N][N],f[N][…

java“俄罗斯方块”

首先新建议一个包为Tetris &#xff08;俄罗斯方块&#xff09; 类名也叫做Tetris&#xff1b; 代码运行&#xff1a; package Tetris; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.KeyEvent; import java.aw…

腾讯云服务器免费再领一台是什么意思?

腾讯云免费再领一台轻量应用服务器是什么意思&#xff1f;是指在腾讯云买赠专区活动 https://curl.qcloud.com/oRMoSucP 就是轻量应用服务器买一年&#xff0c;购买的时候可以选择“送同配置3个月”&#xff0c;也可以选择“免费续3个月”&#xff0c;阿腾云atengyun.com活动打…

创新5.1 7.1KX声卡驱动

———————KX声卡驱动——————— &#x1f384;声卡外观 &#x1f384;声卡介绍 &#x1f388;创新5.1 7.1声卡是网络直播&#xff0c;娱乐&#xff0c;唱歌&#xff0c;交友等一种音效内置声卡 &#x1f384;型号 &#x1f388;创新5.1内置声卡sb0060 0090 sn0105…

Web 开发技术

Web 开发技术 | MDN (mozilla.org)https://developer.mozilla.org/zh-CN/docs/Web 开放的 Web 为开发者提供了巨大的机遇&#xff0c;为了充分利用这些技术&#xff0c;你需要知道如何使用它们。在下方你可以找到相关 Web 技术的文档链接。 面向 Web 开发者的文档 Web 开…

【C# 技术】 C# 常用排序方式——常规数据排序

C# 常用排序方式——常规数据排序 前言 在最近的项目中经常会对C#中的数据进行排序&#xff0c;对于基本数据类型&#xff0c;其排序方式比较简单&#xff0c;只需要调用内置算法即可实现&#xff0c;但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦&#…

C++ Qt开发:Charts折线图绑定事件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QCharts折线图的常用方法及灵活运用。 在上一…

华为OD机试 - 学生方阵 - 矩阵(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出 四、解题思路1、题目解析2、解体思路 五、Java算法源码再重新读一遍题目&#xff0c;看看能否优化一下~ 六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导…

浏览器加粗字体显示异常

浏览器加粗的字体模糊虚化 如果在css中设置了普通的字体样式 font-face&#xff0c;使用了 font-weight: bold 的字体会在浏览器页面中会显示模糊虚化的现象&#xff0c;而正常的字体没有这种情况&#xff0c;显示的情况根据不同的浏览器会有区别。 * 出现轻微模糊虚化效果&am…

设计模式--桥接模式

实验9&#xff1a;桥接模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解桥接模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用桥接模式解决实际问题。 [实验任务]&#xff1a;两个维度的桥接模式 用桥接模式…

什么是OAuth2.0

前言 OAuth&#xff08;Open Authorization&#xff09;是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三方移动应用或分享他们数…

Netty组件基础

Netty入门简介 netty是一个异步、基于事件驱动的网络应用框架&#xff0c;用于快速开发可维护、高性能的网络服务器和客户端。 Netty优势 Netty解决了TCP传输问题&#xff0c;如黏包、半包问题&#xff0c;解决了epoll空轮询导致CPU100%的问题。并且Netty对API进行增强&#xf…

taro小程序指定@代表

1.ts.config.json "paths": {"/*": ["./src/*"] } config/index.js const path require(path) alias: {: path.resolve(__dirname, .., src) },

Codeforces Round 917 (Div. 2)(A~D)

A - Least Product Solution 观察发现&#xff0c;对于 a i < 0 a_i<0 ai​<0&#xff0c;操作后 a i a_i ai​ 不会变得更小&#xff0c; a i > 0 a_i>0 ai​>0&#xff0c;操作后 a i a_i ai​ 不会变得更大。所以&#xff0c;当 ∏ i 1 n a i ≥ 0…