dubbo:深入理解Apache Dubbo与实战

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方法。

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

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

相关文章

canvas绘制旋转的椭圆花

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

网络安全全栈培训笔记(57-服务攻防-应用协议RsyncSSHRDPFTP漏洞批量扫描口令拆解)

第57天 服务攻防-应用协议&Rsync&SSH&RDP&FTP&漏洞批量扫描&口令拆解 知识点: 1、服务攻防-远程控制&文件传输等 2、远程控制-RDP&RDP&弱口令&漏洞 3、文件传输-FTP&Rsyc&弱口令&漏洞 章节内容: …

【Java】--网络编程:基于TCP协议的网络通信

【Java】–网络编程:基于TCP协议的网络通信 文章目录 【Java】--网络编程:基于TCP协议的网络通信一、TCP协议1.1 概念1.2 三次握手1.2.1 文字描述1.2.2 画图演示 1.3 四次挥手1.3.1 文字描述1.3.2 画图演示 二、基于TCP的Socket网络编程2.1 概念2.2 服务…

c#中使用UTF-8编码处理多语言文本的有效策略

使用UTF-8编码处理多语言文本的有效策略 在当今的全球化时代,软件开发者常常需要处理包含多种语言的文本。这不仅涉及英文和其他西方语言,还包括中文、日文、韩文等多字节字符系统。在这篇博客中,我将探讨如何有效地使用UTF-8编码来处理混合语…

大模型实战营Day5笔记

大模型部署背景 大模型部署是指将训练好的模型在特定的软硬件环境中启动的过程,使模型能够接收输入并返回预测结果。大模型的内存开销巨大,7B模型仅权重需要14G内存。另外大模型是自回归生成,需要缓存Attention的 k/v。 LMDeploy 简…

学生宿舍人走断电管理系统的意义和功能

学生宿舍人走断电管理系统是石家庄光大远通电气公司一款智能化的电力管理设备,旨在解决学生宿舍安全用电问题。以下是一些该系统的功能特点: 1.智能控制:系统能够自动识别宿舍内是否有人,当无人时自动断电,避免能源浪费和安全事故的发生。 2.…

Prometheus插件安装kafka_exporter

下载地址 https://github.com/danielqsj/kafka_exporter/releases 解压 tar -zxvf kafka_exporter-1.7.0.linux-amd64.tar.gzmv kafka_exporter-1.7.0.linux-amd64 kafka_exporter服务配置 cd /usr/lib/systemd/systemvi kafka_exporter.service内容如下 [Unit] Descript…

容器技术2-镜像与容器储存

目录 一、镜像制作 1、ddocker build 2、docker commit 二、镜像存储 1、公共仓库 2、私有仓库 三、镜像使用 四、容器存储 1、镜像元数据 2、存储驱动 3、数据卷 一、镜像制作 1、ddocker build 基于 Dockerfile 自动构建镜像 其机制为:每一行都会基于…

【webrtc】neteq测试工程

设置git代理 $ git config --global http.https://github.com.proxy socks5://127.0.0.1:7890 git config --global https.https://github.com.proxy socks5://127.0.0.1:7890导入cmake直接构建 win32 debug v143 编译opus Build started...

【零基础入门TypeScript】数组

目录 数组的特点 声明和初始化数组 句法 访问数组元素 示例:简单数组 示例:单语句声明和初始化 数组对象 例子 示例:数组构造函数接受逗号分隔值 数组方法 数组解构 例子 使用 for…in 循环遍历数组 TypeScript 中的数组 使用变…

vue:element-ui表单动态验证规则

一、需求: 实现当是否发送消息选择是时,业务类型字段必填。 二、实现: 当你在一个表单中使用 el-form 和 el-form-item 来创建表单项时,el-form-item 的 :rules 属性可以用来设置该表单项的验证规则。我们希望根据用户在 "…

前端JS加密与Buspsuite的坦诚相待

前端JS加密测试场景下的困惑 在渗透测试过程中经常会遇到JS前端加密的场景,假如不借助任何工具的情况下,我们一般是把JS代码进行扣取,本地进行加解密生成Payload,然后在Burpsuite里进行Payload替换。这种方式就存在一个很明显的问…

机器学习:什么是监督学习和无监督学习

目录 一、监督学习 (一)回归 (二)分类 二、无监督学习 聚类 一、监督学习 介绍:监督学习是指学习输入到输出(x->y)映射的机器学习算法,监督即理解为:已知正确答案…

【Web前端开发基础】CSS的定位和装饰

CSS的定位和装饰 目录 CSS的定位和装饰一、学习目标二、文章内容2.1 定位2.1.1 定位的基本介绍2.1.2 定位的基本使用2.1.3 静态定位2.1.4 相对定位2.1.5 绝对定位2.1.6 子绝父相2.1.7 固定定位2.1.8元素的层级关系 2.2 装饰2.2.1 垂直对齐方式2.2.2 光标类型2.2.3 边框圆角2.2.…

Keepalived + Nginx双主架构

Keepalived Nginx双主架构 环境准备: keepalived_master1服务器nginx:172.20.26.167 keepalived_master2服务器nginx:172.20.26.198 各服务器关闭selinux、防火墙等服务。 开机安装部署nginx 在172.20.26.167服务器上 yum install ngi…

基于ADAS的车道线检测算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 图像预处理 4.2 车道线特征提取 4.3 车道线跟踪 5.完整工程文件 1.课题概述 基于ADAS的车道线检测算法,通过hough变换和边缘检测方法提取视频样板中的车道线,然后根据车道线的弯曲情况…

在Excel中批量添加前后缀的三种方法,总有一种适合 你

你可以使用高级Excel函数将前缀和后缀快速应用于列。在使用大型电子表格时,为每个单元格添加后缀或前缀可能会花费很长时间,并使你疲惫不堪。 在这里,你可以通过几种快速简单的方式添加后缀或前缀,从而减少所需的手动操作。​我们将通过三种不同的方法向Excel电子表格添加…

互联网盲盒小程序,解锁了盲盒全新模式!

随着潮流玩具的兴起,盲盒因此产生,在时间的推移下,盲盒的发展正处于鼎盛时期。在今年,盲盒市场也将迎来300亿元的市场规模,而盲盒的受众群体也在收入能力较高的年轻人中。 盲盒具有独特的购买方式,它能够让…

硬件监测和系统诊断 -- TechTool Pro 18 中文

TechTool Pro 18是一款功能强大的硬件和软件诊断工具,它提供了多种功能来帮助用户维护和优化Mac电脑的性能。这些功能包括:硬盘检测和修复、内存测试、驱动器克隆、数据恢复、网络和连接测试、系统健康检查以及定期维护等。 TechTool Pro 18还具有直观的…

k8s--helm

什么是helm?在没有这个helm之前,deployment service ingress helm的作用 通过打包的方式,把deployment service ingress等打包在一块,一键式的部署服务,类似yum安装 官方提供的一个类似与安装仓库额功能,…