dubbo:深入理解Apache Dubbo与实战

news2024/11/15 23:02:23

dubbo核心组件

层次名 作 用
Service 业务层。包括业务代码的接口与实现,即开发者实现的业务代码
config 配置层。主要围绕ServiceConfig (暴露的服务配置)和ReferenceConfig (引用的服务配置)两个实现类展开,初始化配置信息。可以理解为该层管理了整个Dubbo的配置
proxy 服务代理层。在Dubbo中,无论生产者还是消费者,框架都会生成一个代理类,整个过程对上层是透明的。当调用一个远程接口时,看起来就像是调用了一个本地的接口一样, 代理层会自动做远程调用并返回结果,即让业务层对远程调用完全无感
registry 注册层。负责Dubbo框架的服务注册与发现。当有新的服务加入或旧服务下线时,注册中心都会感知并通知给所有订阅方。整个过程不需要人工参与
cluster 集群容错层。该层主要负责:远程调用失败时的容错策略(如失败重试、快速失败); 选择具体调用节点时的负载均衡策略(如随机、一致性Hash等);特殊调用路径的路由
策略(如某个消费者只会调用某个IP的生产者)
monitor 监控层。这一层主要负责监控统计调用次数和调用时间等
protocol 远程调用层。封装RPC调用具体过程,Protocol是Invoker暴露(发布一个服务让别人
可以调用)和引用(引用一个远程服务到本地)的主功能入口,它负责管理Invoker的
整个生命周期。Invoker是Dubbo的核心模型,框架中所有其他模型都向它靠拢,或者
转换成它,它代表一个可执行体。允许向它发起invoke调用,它可能是执行一个本地的
接口实现,也可能是一个远程的实现,还可能一个集群实现
exchange 信息交换层。建立Request-Response模型,封装请求响应模式,如把同步请求转化为异步请求
transport 网络传输层。把网络传输抽象为统一的接口,如Mina和Netty虽然接口不一样,但是Dubbo在它们上面又封装了统一的接口。用户也可以根据其扩展接口添加更多的网络传
输方式
Serialize 序列化层。如果数据要通过网络进行发送,则需要先做序列化,变成二进制流。序列化层负责管理整个框架网络传输时的序列化/反序列化工作

服务暴露:

注册中心:

动态加入。一个服务提供者通过注册中心可以动态地把自己暴露给其他消费者,无须消费者逐个去更新配置文件。

动态发现。一个消费者可以动态地感知新的配置、路由规则和新的服务提供者,无须重启服务使之生效。
动态调整。注册中心支持参数的动态调整,新参数自动更新到所有相关服务节点。
统一配置。避免了本地配置导致每个服务的配置不一致问题。

注册中心的四种实现:ZooKeeper、 Redis 、 Simple 、Multicast

ZooKeeper是官方推荐的注册中心,在生产环境中有过实际使用,具体的实现在Dubbo 源码的dubbo-registry-zookeeper模块中。

Redis 注册中心并没有经过长时间运行的可靠性验证,其稳定性依赖于Redis本身。

Simple注册中心 是一个简单的基于内存的注册中心实现,它本身就是一个标准的RPC服务,不支持集群,也可 能出现单点故障。

Multicast模式则不需要启动任何注册中心,只要通过广播地址,就可以互相 发现。服务提供者启动时,会广播自己的地址。消费者启动时,会广播订阅请求,服务提供者 收到订阅请求,会根据配置广播或单播给订阅者。不建议在生产环境使用。

zookeeper:

是树形结构的注册中心,每个节点的类型分为持久节点、持久顺序节点、临时节点和临时顺序节点。

持久节点:服务注册后保证节点不会丢失,注册中心重启也会存在。

持久顺序节点:在持久节点特性的基础上增加了节点先后顺序的能力。

临时节点:服务注册后连接丢失或session超时,注册的节点会自动被移除。

临时顺序节点:在临时节点特性的基础上增加了节点先后顺序的能力。

  • /dubbo
    ±- service
    ±- providers
    ±- consumers
    ±- routers
    ±- configurators

(1)树的根节点是注册中心分组,下面有多个服务接口,分组值来自用户配置
dubbo:registry中的 group 属性,默认是/dubbo。
(2) 服务接口下包含4类子目录,分别是providers、consumers、 routers、 configurators,这个路径是持久节点。
(3) 服务提供者目录(/dubbo/service/providers)下有多个服务者URL元数据信息。
(4) 服务消费者目录(/dubbo/service/consumers)下有多个消费者元数据信息。
(5) 路由配置目录(/dubbo/service/routers)下面包含多个用于消费者路由URL策略元数据信息。
(6) 动态配置目录(/dubbo/service/configurators)下面包含多个用于服务者动态配置URL元数据信息。

配置中心的订阅/发布

订阅通常有pull和push两种方式,一种是客户端定时轮询注册中心拉取配置,另一种是注册中心主动推送数据给客户端。这两种方式各有利弊,Dubbo采用的是第一次启动拉取方
式,后续接收事件重新拉取数据。

在服务暴露时,服务端会订阅configurators用于监听动态配置,在消费端启动时,消费端会订阅providers、routers和configuratops这三个目录,分别对应服务提供者、路由和动
态配置变更通知。

ZooKeeper注册中心采用的是“事件通知” + “客户端拉取”的方式,客户端在第一次连接上注册中心时,会获取对应目录下全量的数据。并在订阅的节点上注册一个watcher,客户端与
注册中心之间保持TCP长连接,后续每个节点有任何数据变化的时候,注册中心会根据watcher的回调主动通知客户端(事件通知),客户端接到通知后,会把对应节点下的全量数据都拉取过

来(客户端拉取),这一点在NotifyListener#notify List urls 接口上就有约束的注释说明。全量拉取有一个局限,当微服务节点较多时会对网络造成很大的压力。

注册中心的缓存:在类AbstractRegistry中实现

private final Properties properties = new Properties();
private File file;//磁盘文件服务缓存对象
private final ConcurrentMap Map>> notified = new ConcurrentHashMap List>>(); //内存中的服务缓存对象

notified是ConcurrentHashMap里面又嵌套了一个Map,外层Map的key是消费者的 URL,内层 Map 的 key 是分类,包含 providers、 consumers、 routes、 configurators
四种。value则是对应的服务列表,对于没有服务提供者提供服务的URL,它会以特殊的empty://前缀开头

在服务初始化的时候,AbstractRegistry构造函数里会从本地磁盘文件中把持久化的注册数据读到Properties对象里,并加载到内存缓存中

Properties保存了所有服务提供者的URL,使用URL#serviceKey()作为key,提供者列表、 路由规则列表、配置规则列表等作为value。由于value是列表,当存在多个的时候使用空格隔
开。还有一个特殊的key.registies,保存所有的注册中心的地址。如果应用在启动过程中,注册中心无法连接或宕机,则Dubbo框架会自动通过本地缓存加载Invokers。

在这里插入图片描述

首先在客户端启动时会从注册中心拉取和订阅对应的服务列表,Cluster会把拉取的服务列
表聚合成一个Invoker,每次RPC调用前会通过Directory#list获取providers地址(已经生成
好的Invoker列表),获取这些服务列表给后续路由和负载均衡使用。对应图6.1,在①中主要
是将多个服务提供者做聚合。在框架内部另外一个实现Directory接口是RegistryDirectory
类,它和接口名是一对一的关系(每一个接口都有一个RegistryDirectory实例),主要负责拉取
和订阅服务提供者、动态配置和路由项。

dubbo发起服务调用,在客户端经过负载均衡选择一台机器进行RPC调用。

Dubbo协议详解

一次RPC调用包括协议头和协议体两部分。

16字节长的报文头部主要携带了魔法数(0xdabb),以及当前请求报文是否是Request、Response 心跳和事件的信息,请求时也会携
带当前报文体内序列化协议编号。除此之外,报文头部还携带了请求状态,以及请求唯一标识和报文体长度。

魔法数:来分割处理粘包问题

Dubbo中的编码器(123)主要将Java对象编码成字节流返回给客户端,主要做两部分事情,构造报文头部,然后对消息体进行序列化处理。所有编解码层实现都应该继承自Exchangecodec,
Dubbo协议编码器也不例外。当Dubbo协议编码请求对象时,会调用ExchangeCodec#encode方法。

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

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

相关文章

NetSuite 文心一言(Ernie)的AI应用

有个故事,松下幸之助小时候所处的年代是明治维新之后,大量引用西洋技术的时期。当时大家对“电”能干什么事,充满好奇。“电能干什么?它能帮我们开门么?” 松下幸之助的爷爷对电不屑,于是就问他。松下幸之助…

ORBSLAM3安装

0. C11 or C0x Compiler sudo apt-get install gccsudo apt-get install gsudo apt-get install build-essentialsudo apt-get install cmake1. 依赖 在该目录终端。 1. 1.Pangolin git clone https://github.com/stevenlovegrove/Pangolin.git sudo apt install libglew-d…

Java实现超市账单管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…

1、Seaborn可视化库

你的数据可视化编程初体验! Seaborn是一个基于matplotlib的图形可视化Python库,它提供了一种高级的API接口,使得制作统计图形更加容易。 Seaborn的目标是使可视化成为探索和理解数据的核心部分,它面向数据集的绘图功能对整个数据集进行操作,并在内部执行必要的语义映射和统…

土堆学习笔记——P29完整的模型训练套路(三)

一些细节: 在训练前 有一个tudui.train()的作用: 如果网络里有dropout/batchnorm等层,就需要用到tudui.train(),也就是没有这些层的话,tudui.train()没用调用不调用都行 在测试前 有一个tudui.eval()的作用&#xff1…

PDF处理控件aspose.PDF功能演示:使用 C# .NET 复制 PDF 页面

作为程序员,您通常必须以纯文本形式从 PDF 文件中提取内容以进行进一步处理,例如分析和信息提取。如果没有合适的工具,处理 PDF 文件并将整个 PDF 转换为 TXT 格式是一项麻烦的任务。因此,在本博客中,我们将探讨如何使…

docker容器快速安装启动ES

1、安装 docker a、使用 Homebrew 安装 brew install --cask --appdir/Applications docker b、手动下载安装 1、安装包下载地址:Install Docker Desktop on Mac | Docker Docs 根据自己的笔记本型号选择,我这边选择的是 intel chip 2、下载安装即可&a…

aspose-cells-20.7.jar 去除水印及次数限制

1.使用 jd-gui.exe 反编译查看,直接搜索 License 1.修改 public static boolean isLicenseSet() {return (a ! null);}改成 public static boolean isLicenseSet() {return true;}2.修改 public void setLicense(InputStream stream) {Document document null;if (…

理解反向代理

反向代理是一个不可或缺的组件。 它在客户端和服务器之间充当中介,提高了安全性、负载平衡和应用性能。 一、反向代理简介 反向代理是一种服务器,它位于客户端和后端服务器之间。与常见的(正向)代理不同,反向代理代表…

springboot 项目,返回的实体类里面字段是null ,现在想要为空应该是““,空字符串,而不是null

目录 1 问题2 实现 1 问题 返回给前端的数据,如果数据库的字段没有数据,给返回的是null 要变成这个,全局都变成这样 2 实现 springboot返回给页面的json数据中,如果有数据为null,则返回空字符串。 springboot默认使…

CSS之边框样式

让我为大家介绍一下边框样式吧!如果大家想更进一步了解边框的使用,可以阅读这一篇文章:CSS边框border 属性描述none没有边框,即忽略所有边框的宽度(默认值)solid边框为单实线dashed边框为虚线dotted边框为点线double边框为双实线 代码演示&…

三维城市模型提升日本的智慧城市管理

MicroStation 将工作效率提高 50%,实现了前所未有的逼真模拟 构建三维城市模型生态系统 PLATEAU 项目由日本国土交通省牵头,是一项三维城市模型和数字孪生计划,旨在到 2027 年为日本 500 个城市构建开放的城市模型数字生态系统。作为日本最…

力扣每日一题 --- 972. 相等的有理数

本题中的一个难点是怎么判断是否相等,如果自己写判断的话是不是很麻烦,判断整数之后再去判断小数部分,那么我们这题的另一个难点就要登场了,第一个难点让本题的情况变得复杂,第二个难点让本题变得很难想到怎么判断&…

SEO 优化总结

目录 优化步骤 1.设置好网站的TDK 2.给网站图片添加文字描述 3.自定义产品页URL 4.设置友情链接并推广 5.持续产出高质量原创内容,增加网站权重。 一、sitemap与robots协议 二、死链检查 三、页面标签 H1标签: 图片标签的alt属性:…

pycharm中无法使用anaconda虚拟环境

anaconda里创建了虚拟环境,然后在虚拟环境中明明安装了TensorFlow1.12,但是到pycharm中使用anaconda的虚拟环境时,就是没有TensorFlow1.12,注意下面这幅图 里面有一个选项“use conda package manager”,这个默认是勾…

Git 版本控制 常用操作和项目应用

一、前言 1、何为版本控制? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 Git是目前最先进的分布式版本控制系统。 maven:jar包管理工具 版本管理工具:Git、Svn 2、Git & SVN对比 …

代码随想录算法训练DAY27|回溯3

算法训练DAY27|回溯3 39. 组合总和 力扣题目链接 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 …

sell控制脚本案例

1.压缩脚本 写一个脚本,完成如下功能 传递一个参数给脚本,此参数为gzip、bzip2或者xz三者之一; (1) 如果参数1的值为gzip,则使用tar和gzip归档压缩/etc目录至/backups目录中,并命名为/backups/etc-20160613.tar.gz&am…

yarn集群datanode无法启动问题排查

一、问题场景 hdfs无法访问,通过jps命令查看进程,发现namenode启动成功,但是所有datanode都没有启动,重启集群(start-dfs.sh)后仍然一样 二、原因分析 先看下启动的日志有无报错。打开Hadoop的日志目录 …

Vue-33、Vue中为什么使用render函数

1、main.js //该文件是整个项目的入口文件 //引入Vue import Vue from vue //引入APP组件,他是所有组件的父组件 import App from ./App.vue //关闭Vue是生产提示 Vue.config.productionTip false; //创建Vue实例对象---vm new Vue({render: h > h(App), }).$m…