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: 27

username=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.mfbz.cn/a/439007.html

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

相关文章

2024年3月8日蚂蚁新村今日答案:以下哪一项传统武术项目入选了人类非物质文化遗产代表作名录?太极拳还是咏春拳

蚂蚁新村是一个虚拟社区。在这个虚拟社区中,用户可以参与各种活动,比如生产能量豆、做慈善捐赠等。同时,蚂蚁新村也提供了一些知识问答环节,用户在参与的过程中可以增进知识。这些问答内容往往涉及广泛的主题,如文化、…

idea Gradle 控制台中文乱码

如下图所示,idea 中的 Gradle 控制台中文乱码: 解决方法,如下图所示: 注意:如果你的 idea 使用 crack 等方式破解了,那么你可能需要在文件 crack-2023\jetbra\vmoptions\idea.vmoptions 中进行配置&#xf…

git分布式管理-头歌实验标签

一、创建标签 任务描述 现在你已经成了项目负责人,由你负责发布版本,你需要在发布一个版本之前,给该版本对应的代码打上标签,以便于管理和标识。 本关任务:为最近一次提交打上标签。 相关知识 在开发过程中&#xff0c…

Android14之禁止vbmeta.img签名校验(一百九十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

七彩虹八渐变 外贸建站公司wordpress模板

进出口水果wordpress外贸模板 漂亮水果wordpress外贸模板,做水果进出品生意的外贸公司自建站官网模板。 https://www.jianzhanpress.com/?p3516 玩具wordpress外贸模板 简洁玩具wordpress外贸模板,适合做跨境电商外贸公司使用的wordpres外贸s网站主题…

追寻工作与生活的和谐之道

在现代社会,人们往往被快节奏的工作和生活所困扰,如何在这两者之间找到平衡点,成为许多人关注的焦点。本文将为您介绍一些实用的方法和建议,帮助您实现工作与生活的和谐共处。 一、合理规划时间,提高工作效率 时间是实…

day37 贪心算法part6

738. 单调递增的数字 中等 提示 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 不知道怎么讲思路……以9287举例&#xff0c;…

CorelDRAW2024中文版正式发布!老户升级可享大额折扣!CDR2024下载安装 CorelDRAW2024更新内容有哪些

CorelDRAW 全称“CorelDRAW Graphics Suite“&#xff0c;也就是众所周知的”CDR“&#xff0c;是一款智能高效的平面设计软件&#xff0c;广泛应用于排版印刷、矢量图形编辑及网页设计等领域&#xff0c;30多年来无数优秀的设计师通过CorelDRAW大胆展现真我&#xff0c;交付了…

学习408之数据结构--链表-单链表的增删查改的实现-如何解决顺序表增容后空间浪费问题?

顺序表的问题及思考问题&#xff1a; 中间/头部的插入删除&#xff0c;时间复杂度为O(N)增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗。增容一般是呈2倍的增长&#xff0c;势必会有一定的空间浪费。例如当前容量为100&#xff0c;满了以后增…

#QT(智能家居界面-布局)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a; 水平布局&#xff0c;垂直布局&#xff0c;栅格布局&#xff08;弹簧&#xff09; 界面自动调整 3.记录 注意弹簧不是拖拽拉长&#xff0c;而是使用栅格布局 运行发现窗口放大缩小可以自动调整 如果想要重新布局&#xff0c;需…

ubuntu20.04安装ros并配置相关环境以及驱动AUBO i5机械臂

ubuntu20.04安装ros并配置相关环境以及驱动AUBO i5机械臂 安装ros安装rosdep(小鱼的rosdepc,又快又好用)环境配置下载并编译aubo roslib库环境变量配置aubo gazeboaubo rviz驱动真实机械臂 安装ros 搜索鱼香ros网站https://fishros.com/&#xff0c;根据一键安装ros里提供的指…

某讯滑块动态明文数组构造

声明&#xff1a; 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;若有侵权&#xff0c;请添加&#xff08;wx&#xff1a;wyqlxl99&#xff09;联系删除 …

R语言,实现MACD指标计算:股票技术分析的利器系列(1)

R语言&#xff0c;实现MACD指标计算&#xff1a;股票技术分析的利器系列&#xff08;1&#xff09; MACD指标代码完整代码介绍代码EMA函数calculate_DEA 函数calculate_MACD 函数 运行结果 MACD指标 先看看官方介绍&#xff1a; MACD (平滑异同平均线&#xff09; 指标说明 DI…

智引未来:2024年科技革新引领工业界变革与机遇

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

苍穹外卖技术栈

Day5 Redis_Spring Data Redis使用方法 Spring Data Redis Spring Date Redis 是Spring的一部分&#xff0c; 对Redis底层开发包进行了高度封装&#xff0c;在Spring项目中&#xff0c;可以使用Spring Data Redis来简化操作。 操作步骤 导入Spring Data Redis 的maven坐标配置…

cefsharp(winForm)调用js脚本,js脚本调用c#方法

本博文针对js-csharp交互(相互调用的应用) (一)、js调用c#方法 1.1 类名称:cs_js_obj public class cs_js_obj{//注意,js调用C#,不一定在主线程上调用的,需要用SynchronizationContext来切换到主线程//private System.Threading.SynchronizationContext context;//…

一键清除JavaScript代码中的注释:使用正则表达式实现

这个正则表达式可以有效地匹配 JavaScript 代码中的各种注释&#xff0c;并且跳过了以 http: 或 https: 开头的链接。 /\/\*[\s\S]*?\*\/|\/\/[^\n]*|<!--[\s\S]*?-->|(?<!http:|https:)\/\/[^\n]*/gvscode 实战&#xff0c;ctrlF 调出查找替换工具&#xff0c;点…

Windows环境下搭建chatGLM-6B-int4量化版模型(图文详解-成果案例)

目录 一、ChatGLM-6B介绍 二、环境准备 1. 硬件环境 2. TDM-GCC安装 3.git安装 4.Anaconda安装 三、模型安装 1.下载ChatGLM-6b和环境准备 方式一&#xff1a;git命令 方式二&#xff1a;手动下载 2.下载预训练模型 方式一&#xff1a;在Hugging Face HUb下载&…

关于并发编程和并行

目录 前言: 并发编程: 1.并发编程的定义: 2. 并发编程的目的 2.1提高性能&#xff1a; 2.2增强响应性&#xff1a; 2.3资源利用&#xff1a; 3. 并发编程的实现方式 3.1多线程&#xff1a; 3.2多进程&#xff1a; 3.3异步编程&#xff1a; 3.4协程&#xff1a; 4. …

计算矩阵特征值和特征向量 numpy.linalg.eig()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算矩阵特征值和特征向量 numpy.linalg.eig() [太阳]选择题 请问根据以下程序说法正确的是&#xff1a; import numpy as np A np.array([[1,2], [2,1]]) print("【显示】A:\n",A…
最新文章