Dubbo基础入门二

8、Dubbo协议 服务调用

8.1 服务端 启动过程深入分析

image.png

我们查看一下服务启动的过程

ProtocolFilterWrapper.export

image.png

image.png

好我们进入DubboProtocol.export

image.png

创建服务

image.png

image.png

分析我们的Handlerimage.png

image.png

我们接着返回刚才位置

image.png

image.png

image.png

image.png

image.png

下面的super方法里面会创建服务,ChannelHandlers.wrap会对hander进一步包装

image.png

1、我们进入ChannelHandlers.wrap

image.png

image.png

MultiMessageHandler—>HeartbeatHandler---->AllChannelHandler -> DecodeHandler -> HeaderExchangeHandler -> ExchangeHandlerAdapter

我看看一下super创建服务

image.png

image.png

image.png

NettyServerhandler -> NettyServer -> MultiMessageHandler—>HeartbeatHandler---->AllChannelHandler -> DecodeHandler -> HeaderExchangeHandler -> ExchangeHandlerAdapter

8.2 服务端调用过程

image.png

image.png

image.png

我们知道请求过来通过Netty服务一定是Handler的处理,下面就是整个过程

NettyServerHandler -> NettyServer -> MultiMessageHandler—>HeartbeatHandler---->AllChannelHandler -> DecodeHandler -> HeaderExchangeHandler -> ExchangeHandlerAdapter

NettyServerHandler

image.png

MultiMessageHandler

image.png

HeartbeatHandler

image.png

AllChannelHandler

https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/threading-model/provider/

image.png

DecodeHandler

image.png

HeaderExchangeHandler

image.png

ExchangeHandlerAdapter

image.png
这里是调用我们的目标invoker,但是这里目标invoker被filter给包装了,所以先要调用filter

image.png

我们自定义过滤器就会在这里起作用

调用完毕过滤器就会调用到AbstractProxyInvoker#invoke

image.png

image.png

8.3 客户端调用

image.png

会调用JavassistProxyFactory#getProxy获取代理类

image.png

调用的时候一定会调用到InvokerInvocationHandler.invoker的方法

image.png

image.png

image.png

调用过程会有容错负载均衡FailoverClusterInvoker#doInvoke

image.pngimage.png

我们可以简单看一下负载均衡

image.png

image.png

HeaderExchangeChannel#request发送请求

image.png

HeaderExchangeHandler#received处理返回数据

image.png

image.png

9、Triple协议

9.1 背景

在Dubbo2.7中,默认的是Dubbo协议,因为Dubbo协议相比较于Http1.1而言,Dubbo协议性能上是要更好的。
但是Dubbo协议自己的缺点就是不通用,假如现在通过Dubbo协议提供了一个服务,那如果想要调用该服务就必须要求服务消费者也要支持Dubbo协议。
而随着企业的发展,往往可能会出现公司内部使用多种技术栈,可能这个部门使用Dubbo,另外一个部门使用Spring Cloud,另外一个部门使用gRPC,那此时部门之间要想相互调用服务就比较复杂了,所以需要一个通用的、性能也好的协议,这就是Triple协议。

9.2 Triple协议介绍

Triple 是 Dubbo3 提出的基于 HTTP2 的开放协议,旨在解决 Dubbo2 私有协议带来的互通性问题。另外,Google公司开发的gRPC,也基于的HTTP2,目前gRPC是云原生事实上协议标准,包括k8s/etcd等都支持gRPC协议。

9.3 HTTP1 和HTTP2进行对比

9.3.1 HTTP1

image.png

POST /getName HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27username=john&password=1234

我们会发现我们除了username=john&password=1234 数据之外,其他的内容都是额外信息,并且这些额外信息量很大。

9.3.2 HTTP2

image.png

  1. 帧长度,用三个字节来存一个数字,这个数字表示当前帧的实际传输的数据的大小,3个字节表示的最大数字是2

    的24次方(16M),所以一个帧最大为9字节+16M。

  2. 帧类型,占一个字节,可以分为数据帧和控制帧

    1. DATA:用于传输请求和响应中的数据,包含有效载荷(payload)。
    2. HEADERS:用于传输HTTP头部信息,包含有效载荷(payload)。
    3. PRIORITY:用于指定数据流的优先级,包含与数据流相关的信息。
    4. RST_STREAM:用于指示数据流的中止,并通知原因。
    5. SETTINGS:用于传输HTTP/2连接的配置参数。
    6. PUSH_PROMISE:用于服务端推送资源,包含预期的请求头和有效载荷。
    7. PING:用于检测HTTP/2连接的可用性和延迟时间。
  3. 标志位,占一个字节,可以用来表示当前帧是整个请求里的最后一帧,方便服务端解析、

  4. 流标识符,占4个字节,在Java中也就是一个int,不过最高位保留不用,表示Stream ID,这也是HTTP2的一个重要设计

  5. 实际传输的数据Payload,如果帧类型是HEADERS,那么这里存的就是请求头,如果帧类型是DATA ,那么这里

    存的就是请求体

通过这种设计,我们可以发现,我们就可以来压缩请求头了,比如如果帧的类型是HEADERS ,那就进行压缩,当然压缩算法是固定的HPACK算法,不能更换。

9.4 Triple源码分析

通过学习Dubbo协议,我们首先要知道我们启动服务的应该是在TripleProtocol

9.4.1 客户端处理

image.png

调到TripleInvoker.doInvoke

image.png

image.png

发送数据

image.png

发送数据包括请求头和请求体

image.png

发送请求头

这里我们数据会放到队列,最后会调用到HeaderQueueCommand#doSend方法,发送数据

image.png

放入队列

先放到队列,然后会定时flush的时候进行处理

image.png

image.png

下面我们可以看到,当我发现有数据就会一直取知道128个后才发送,如果poll为空,则走下面内容数据不为空则发送

image.png

刷新后则调用到HeaderQueueCommand#doSend方法

image.png

下面发送请求体和完成,与上面发送请求头都是异步处理,代码一样只是最后调用处理不同

发送数据

image.png

image.png

上图我们可以看出,也是异步处理,最终会调用到DataQueueCommand#doSend方法

image.png

发送完成数据

image.png

image.png

image.png

image.png

最终会调用感到EndStreamQueueCommand.doSend方法

image.png

9.4.2 服务端启动

image.png

image.png

image.png

image.png

进入启动Netty的源码

image.png

这里有个处理器NettyPortUnificationServerHandler,我们这里有的decode方法,他会识别我们是不是HTTP2协议

怎样识别HTTP2协议?

如果要建立的是一个HTTP2连接,那么在建立完Socket连接后,客户端立刻会发送一个连接前言,也就是一串字节

(对应的字符串为:“PRI*HTTP/2.0\r\n\r\nSM\r\n\r\n”), 给到服务端,服务端从而知道要建立的是HTTP2

image.png

如果识别出RECOGNIZED,

image.png

image.png

处理数据

image.png

处理请求头

image.png

image.png

image.png

image.png

获取invoker

image.png

启动监听器

image.png

image.png

image.png

这里处理请求头获取了Invoker和对应的listener:UnaryServerCallListener 处理请求内容中会用到

处理请求

image.png

image.png

image.png

处理请求体

image.png

image.png

image.png

image.png

image.png

这里只是给我们invoker设置了参数,但是没有立刻调用,而是在complete中进行调用

image.png

处理完成帧

image.png

image.png

image.png

image.png

image.png

image.png

image.png

10、扩展点SPI

10.1 概念

SPI是一种软件编程模型,用于实现在运行时动态加载和扩展组件的能力。在Dubbo3中,SPI机制被广泛应用于扩展框架功能,允许用户自定义实现各种接口,以满足业务需求。

Java中的SPI机制

image.png

我们使用Mybatis操作数据库,那我们应该使用怎样操作mysql 或者oracle或者DB2呢? 首先我们应该引入对应的Mysql的jar,我们利用这jar才能操作数据库,那对于JDBC操作DriveMananger获取链接的时候,他怎样获取Mysql的jar包中对应的类,来链接mysql呢

image.png

实例:

image.png

加载对应的配置

image.png

image.png

缺点:我们如果对应配置文件中com.msb.dubbo.provider.SPI.JDK.Course配置多个实现类,但是我们只需要EnglishCourse,所以为了效率我们只应该加载EnglishCourse,但是JDK的SPI会把所有的加载掉,所以Dubbo退出自己的SPI

image.png

image.png

image.png

Dubbo3 SPI演示

image.png

image.png

image.png

image.png

image.png

image.png

Wrapper包装(AOP)

image.png

image.png

image.png

10.2源码分析

image.png

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

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

相关文章

Oracle Essbase 多维库导入文件数据步骤操作

第一步: 先确定导入数据的维度数量(清楚自己需要导入什么数据和范围) 第二步: 设置加载的规则 1.创建规则 2.编辑规则-》打开数据文件 通过数据文件来确定加载规则的加载格式 先查看数据文件格式: 将数据文件导入&…

es6面试题

ES6面试题 var、let、const区别 共同点:都是可以声明变量 区别: 1、var具有变量提升机制,let和const没有 2、var 声明的变量是函数作用域或全局作用域,而 const 和 let 声明的变量是块级作用域。 3、var可以多次声明同一个变量&a…

智能电视(如小米电视)安装应用(当贝市场、浏览器)、去开机广告

文章目录 安装当贝市场U盘安装(智能电视通用)不用U盘安装(智能电视通用,需要自带应用商店有悟空遥控器等应用)不用U盘安装(智能电视通用,需要自带应用商店有应用管家等应用)不用U盘安…

trim 去除空格

trim(str, pos) 该方法可以去除空格&#xff0c;分别可以去除所有空格&#xff0c;两端空格&#xff0c;左边空格&#xff0c;右边空格&#xff0c;默认为去除两端空格 str <String> 字符串pos <String> 去除那些位置的空格&#xff0c;可选为&#xff1a;both-默…

JUnit5常用断言

解释 断言&#xff0c;在编程中指断定程序的执行结果一定和预期一样&#xff0c;如果不一样则报错&#xff0c;并且中断后面代码的执行 依赖 <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><…

QML 3D入门知识路线

目前使用的版本 v5.14.0 模块导入 使用QML 3D时需要 import Qt3D.Core 2.14 核心模块类 V6以上的版本已经发布&#xff0c;所以有很多module会发生变化&#xff0c;主要有核心module、输入、逻辑、渲染、动画和扩展module&#xff0c;以及2D/3D场景模块 类名 能…

python控制流工具

4.1. if 语句 最让人耳熟能详的语句应当是 if 语句&#xff1a; >>> >>> x int(input("Please enter an integer: ")) Please enter an integer: 42 >>> if x < 0: ... x 0 ... print(Negative changed to zero) ... eli…

Java 面试笔试题 - Stream 和 Lambda 表达式的使用

请按以下步骤实现代码 创建一个新的 JDK 1.8 项目&#xff0c;能运行 main 方法即可 新建一个 Record 类&#xff0c;类中包含以下属性 level, teacher, student 构建一个 List 集合&#xff0c;集合中包含 8 个 Record 对象&#xff0c; Record 对象包含以下属性&#xff1a…

【新版Hi3521DV200处理器性能】

新版Hi3521DV200处理器性能 Hi3521DV200是针对多路高清/超高清&#xff08;1080p/4M/5M/4K&#xff09;DVR产品应用开发的新一代专业SoC芯片。Hi3521DV200集成了ARM Cortex-A7四核处理器和性能强大的神经网络推理引擎&#xff0c;支持多种智能算法应用。同时&#xff0c;Hi352…

类和对象 02【C++】

文章目录 一、 构造函数(初始化列表)1. 初始化列表2. explicit 关键字3. static成员 二、 友元1. 友元函数2.友元类 三、 内部函数四、 匿名对象五、 拷贝对象时的一些编译器优化 一、 构造函数(初始化列表) 进一步理解构造函数&#xff0c;我们知道创建对象时&#xff0c;编译…

手把手教会你 - StreamAPI基本用法

1. 简介 目前响应式编程的学习中很多时候都用到了Lambda表达式和StreamAPI&#xff0c;那么今天就在这里记录一下一些最基本的使用方法。 StreamAPI中引入了流的概念&#xff0c;其将集合看作一种流&#xff0c;流在管道中传输&#xff08;动态的&#xff09;&#xff0c;可以…

IDEA构建Maven JavaSE工程的全面指南

IDEA构建Maven JavaSE工程的全面指南 一、引言 在现代Java开发中&#xff0c;Maven已经成为了一个不可或缺的工具&#xff0c;它帮助我们管理项目的依赖、构建、文档、报告等。而IntelliJ IDEA&#xff08;简称IDEA&#xff09;则是一款强大的Java集成开发环境&#xff08;ID…

AI助力剧本创作:如何5分钟内构思出热门短剧大纲

人工智能重塑短剧行业&#xff1a;从剧本创作到市场推广 在当今短剧行业的飞速发展中&#xff0c;剧本创作的质量及其更新的速度已然成为短剧能否转化为热门作品的关键性因素。然而&#xff0c;随着短剧创作成本的日益攀升&#xff0c;一个卓越的剧本无论在创作时间上还是在构思…

【JAVA重要知识 | 第六篇】Java集合类使用总结(List、Set、Map接口及常见实现类)以及常见面试题

文章目录 6.Java集合类使用总结6.1概览6.1.1集合接口类特性6.1.2List接口和Set接口的区别6.1.3简要介绍&#xff08;1&#xff09;List接口&#xff08;2&#xff09;Set接口&#xff08;3&#xff09;Map接口 6.2Collection接口6.3List接口6.3.1ArrayList6.3.2LinkedList—不常…

2023年第三届中国高校大数据挑战赛(第二场)B题思路

竞赛时间 &#xff08;1&#xff09;报名时间&#xff1a;即日起至2024年3月8日 &#xff08;2&#xff09;比赛时间&#xff1a;2024年3月9日8:00至2024年3月12日20:00 &#xff08;3&#xff09;成绩公布&#xff1a;2024年4月30日前 赛题方向&#xff1a;文本或图象分析方…

5.51 BCC工具之slabratetop.py解读

一,工具简介 slabratetop工具以类似于 top 命令的实时刷新显示方式,展示从内核内存分配缓存(SLAB 或 SLUB)中的分配速率和总字节数。例如: (注:SLAB 和 SLUB 是 Linux 内核中用于内存管理的两种不同机制,它们都提供了一种方式来缓存和管理小对象的内存分配。) 二,…

学生信息管理APP

设计内容简介 本次设计使用Android Studio实现一个学生信息管理系统,系统功能结构如下图所示: 详细设计 数据库设计SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低。…

143:vue+leaflet 在25833投影坐标下,加载一小块图像叠层数据

第143个 点击查看专栏目录 本示例是介绍如何在vue+leaflet, 自定义CRS,形成新的投影,这里是25833投影,并使用 L.Proj.imageOverlay的方法在地图上加载载一小块图像叠层数据。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式…

Python爬虫——Scrapy-1

目录 简介 安装 基本使用 1. 创建爬虫的项目 2. 创建爬虫文件 3. 运行爬虫代码 scrapy项目组成 scrapy工作原理 ​编辑 58同城 scrapy架构组成 汽车之家 总结 简介 Scrapy 是一个基于 Python 的开源网络爬虫框架&#xff0c;它可以帮助开发者快速、高效地构…

js 实现点击按钮小球加入购物车动画

本文旨在实现类似点击按钮实现小球加入购物车效果。 使用技术&#xff1a; Vue2使用 Pubsub 监听按钮点击事件&#xff08;如果不想用也可以自己改造下&#xff09;监听 onmousemove 来获取按钮点击时的鼠标位置 小球组件&#xff1a; html css&#xff1a; 小球父元素&am…