Dubbo基础入门二

news2024/11/20 13:31:47

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.coloradmin.cn/o/1500445.html

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

相关文章

套接字编程 --- 一

目录 1. 预备知识 1.1. 端口号 1.2. 认识TCP协议 1.3. 认识UDP协议 1.4. 网络字节序 2. socket 2.1. socket 常见系统调用 2.1.1. socket 系统调用 2.1.2. bind 系统调用 2.1.3. recvfrom 系统调用 2.1.4. sendto系统调用 2.3. 其他相关接口 2.3.1. bzero 2.3.2…

代码随想录算法训练营第day10|232.用栈实现队列、 225. 用队列实现栈

目录 a.232.用栈实现队列 b. 225. 用队列实现栈 a.232.用栈实现队列 题目链接 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素…

专题一 - 双指针 - leetcode 202. 快乐数 | 简单难度

leetcode 202. 快乐数 leetcode 202. 快乐数 | 简单难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 202. 快乐数 | 简单难度 1. 题目详情 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」…

掼蛋的牌型与规律(上篇)

掼蛋是一项配合类的棋牌竞技游戏,掼蛋的最大魅力以及最集中的特点在于变化,在于组牌的变数。有的掼蛋新手往往先把牌配死,并且直接决定好出牌计划,然后守株待兔。掼蛋的取胜之道在于静态组合加上动态变化。本文主要介绍一下掼蛋的…

【广度优先搜索】【图论】【并集查找】2493. 将节点分成尽可能多的组

作者推荐 视频算法专题 本文涉及知识点 广度优先搜索 图论 并集查找 LeetCod2493. 将节点分成尽可能多的组 给你一个正整数 n ,表示一个 无向 图中的节点数目,节点编号从 1 到 n 。 同时给你一个二维整数数组 edges ,其中 edges[i] [ai…

神州大地人类来源猜想

在公元前2000年以前,伟大的中华民族还是石器时代,我们有很多美好的神话和传说,三皇五帝就是这个时代伟大部落或者部落首领的故事。 关于人类的历史,从基因学上最新的研究成果大概是这样的,虽然从300万年前就诞生了人类…

3D资产管理

3D 资产管理是指组织、跟踪、优化和分发 3D 模型和资产以用于游戏、电影、AR/VR 体验等各种应用的过程。 3D资产管理也称为3D内容管理。 随着游戏、电影、建筑、工程等行业中 3D 内容的增长,实施有效的资产管理工作流程对于提高生产力、减少错误、简化工作流程以及使…

Xinstall微信调起APP,提升用户体验与转化率

在移动互联网时代,APP已经成为人们日常生活中不可或缺的一部分。然而,随着市场竞争的加剧,如何让用户更便捷地使用APP,提高分享营销的下载转化率,成为了开发者们亟待解决的问题。今天,我们将向大家介绍一款…

C/C++的内存管理与初阶模板

引言 我们在学习C的时候,会经常在堆上申请空间,所以这个时候就体现了内存管理遍历。 图下是我们常见的计算机的内存划分: 我也在图下对部分变量存在的位置,及时标注。(如果有任何问题可以联系博主修改,感谢大家。) 那…

如何在Windows上使用Docker,搭建一款实用的个人IT工具箱It- Tools

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools,并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…

Docker安装主从数据库

首先开启docker后直接执行命令 docker run -d \ -p 3307:3306 \ -v /xk857/mysql/master/conf:/etc/mysql/conf.d \ -v /xk857/mysql/master/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD123456 \ --name mysql-master \ mysql:8.0.29 默认情况下MySQL的binlog日志是自动开…

深入浅出Redis(八):Redis的集群模式

引言 Redis是一款优秀的键值对、内存非关系型数据库,单机节点下的Redis存在无法保证高可用、容量不足等问题 上篇文章介绍的哨兵主要能够保证主从架构下Redis的可用性,但是仍然存在容量不足、推举新的主节点时不能访问Redis的问题,集群可水…

#QT(串口助手-界面)

1.IDE:QTCreator 2.实验:编写串口助手 3.记录 接收框:Plain Text Edit 属性选择:Combo Box 发送框:Line Edit 广告:Group Box (1)仿照现有串口助手设计UI界面 (2)此时串口助手大…

ai脚本创作的软件有哪些?分享3款好用的工具!

随着人工智能技术的飞速发展,AI脚本创作软件已经成为内容创作者们的新宠。这些软件不仅能够帮助我们更高效地生成文章、视频脚本等,还能为我们提供独特的创意视角和无限的灵感。本文将带您深入了解几款备受瞩目的AI脚本创作软件,看看它们如何…

带胶囊按钮的标题是如何实现的

使用uni-app开发小程序经常会遇到胶囊按钮和标题之间融合的问题,因为这样可以大大提高页面的美观和整体性,那么接下来简单拆分步骤看下是如何实现的吧 😁 可以看到我们设置的标题是在默认标题栏之下的(这不是我们想要的效果 &…

许多人可能还不了解这个信息差:美赛的第一批 EI 已经录用,不用再犹豫啦

格局打开,美赛论文转学术论文发表 🚀🚀 各位同学,美赛已经结束了一段时间,你们是否还在焦急地等待最终成绩的公布?一些有远见的同学已经提前收到了一份喜讯:他们的美赛论文已被转化为学术论文并…

VMware虚拟机

1、虚拟机介绍 虚拟机(Virtual Machine)是一种软件,可以用来模拟具有完整硬件功能的完整的计算机系统的软件,并且可以和主机环境隔离开,互不影响。也就是,在实体计算机中能够完成的工作都可以通过虚拟机实…

【SQL】1068. 产品销售分析 I

题目描述 leetcode题目:1068. 产品销售分析 I 写法 select Product.product_name, Sales.year, Sales.price from Sales left join Product on Sales.product_id Product.product_id记录细节:加上表名检索效率更高。 -- ERROR: 时间超出限制 > 加…

UE4 Niagara 关卡4.1官方案例解析

we now directly supporting playing audio from arbitrary locations in particle systems.users have control over volume and pitch,and the system can directly play sound waves,or sound cues which have multiple waves in them.(我们现在直接支持在粒子系统中从任意…

一个用libcurl多线程下载断言错误问题的排查

某数据下载程序,相同版本的代码,在64位系统中运行正常,但在32位系统中概率性出现断言错误。一旦出现,程序无法正常继续,即使重启亦不行。从年前会上领导提出要追到根,跟到底,到年后的今天&#…