Dubbo核心功能解析

Dubbo核心功能讲解

Dubbo是一个精耕服务治理领域的框架,秉承了阿里一贯的大而全风格,和Eureka相比复杂度有不小的提高,这一节我们选了Registry和Remoting两个核心模块,从功能层面做个简单的了解(后面的章节会深入介绍底层原理)

Registry模块

Registry是Dubbo中负责服务注册的模块,也就是我们熟悉的注册中心,目前Dubbo支持五种不同的注册中心,其中登场率最高的就是Zookeeper了。

Zookeeper是Apache Hadoop的子项目,它底层是一个树形的目录结构,同时支特基于发布订阅模型的变更推送,这个特性特别适合应用在注册中心服务上。Zookeeper在各个大厂都有广泛应用,其稳定性和性能已经在业界得到了充分证明。大家如果想进一步了解Zookeeper可以逛逛官方开源文档: http://zookeeper.apache.org

关于Registry的细节部分将在稍后一小节深入讲解,在这之前我们先了解下Dubbo在服务注册功能上的主要特点:

注册中心的运作方式

注册中心只承担服务治理相关的功能(注册、发现、心跳和下线等),它不承担消息的转发(这一点和Eureka一样),因此不用承担访问压力。和Eureka相比,Dubbo在服务治理领域走的完全是不同的风格路线,我们从各个功能上先来做一个了解

Dubbo的长连接

Eureka的注册中心在服务治理领域采用的是一种“佛系”的连接策略,比如服务发现和心跳检测,都是等待服务节点自己上报状态。而Dubbo相比较之下就是“事必躬亲”的管理策略,Dubbo的注册中心,服务提供者和服务消费者三者之间均为长连接,注册中心严密监测节点的状态变化。
Dubbo的注册中心基于长连接感知服务提供者的状态,假如服务提供者宕机,注册中心将立即推送事件通知消费者。但是注册中心自身宕机并不会影响已经上线运行的服务提供者和消费者。

服务剔除

当服务提供者出现异常情况的时候(比如电源又被挖掘机铲断了)注册中心利用长连接可以侦听到服务的不可用状态,进而在服务列表中删除服务提供者。

我们以Zookeeper注册中心为例,Dubbo的服务 剔除原理实际上是利用Zookeeper的临时节点和会话保持的功能。ZK中的数据是和一一个会话绑定的,一旦会话异常ZK就会清除这个会话创建的临时节点和所有订阅该会话的Watcher。

我们结合Dubbo的长连接和服务剔除机制,讲一讲ZK中的会话(Session)是怎么一回事儿。在ZK中当一个长连接建立起来后,会生成一个SessionID,这是一个全局唯-的标识符。在会话期间内ZK通过心跳感应连接状态,如果在会话过期时间内没有心跳发送过来或者因为网络原因导致会话断掉,那么这个时候客户端就会重新选择新的ZK节点进行连接。因此,当会话过期时,Dubbo的服 务提供者和消费者能自动恢复注册数据,重新订阅请求。
Eureka则不同,Eureka后 台有-一个服务自保的机制,也就是说短期的网络波动导致大比例节点无法连接到注册中心的时候,Eureka会开启自保模式,在这个模式下服务剔除功能将被禁用。

心跳检测

Dubbo同样也有心跳检测,它的目的是检测服务提供者和服务消费者之间的连接是否还处于可用状态。如果在默认60s没有消息进来的时候,会尝试发送一个心跳Request,如果连着180秒既没有消息也没心跳,那么则会关闭Channel,对于Consumer来说则需要重新连接一个新的Provider。

监控中心

服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心。服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心。
监控中心是一个可选组件,可以根据自身项目需要决定是否接入。监控中心和各个节点之间并不是长连接,同时监控中心的宕机并不会影响任何服务调用,只不过可能会丢失一部分的监控数据而已。

Remoting模块

Remoting模块主要负责远程调用,核心部分是Dubbo的协议栈实现,处于整个调用链路中相对底层的部分。在这里我们简单的看下Remoting框架的接口结构。

顶层接口层
  • Endpoint 它是一个顶层的抽象接口,定义了获取网络端点地址、发送消息、获取通信Channel、关闭连接等一些列方法。
    • Channel-它继承自Endpoint,但是扩展了操作Attrib ute的方法,比如常用的getAttribute,setAttribute等
  • ChannelHandler ChannelHandler定义了一系列接口用来处理五种不同的网络事件,分别对应connected、disconnected、sent、received和caught
  • Resetable 接口中只定义了一个方法reset,用来重置连接属性
AbstractPeer和A bstractChannel

AbstractPeer实现了上面提到的两个顶层接口,它是一-种代理模式的组合结构,通过构造器接收- -个ChannelHandler对象,然后把方法实现的具体逻辑委托给ChannelHandler对象来实现,随手拿一个接收消息的代码来举例:

@Override
public void received(Channel ch, 0bject msg) throws Rem0tingException {
  if (closed) {
    return;
  }
  handler.received(ch, msg);
}

AbstractChannel添加了send方法(发送消息到远程服务)的缺省验证逻辑,作为NettyChannel等 具体底层实现类的统一父类

Client & Server

Client作为服务调用的发起方(消费者)的顶层接口,继承了Endpoint和Channel接口的同时,还定义了reconnect方法,用来重新连接到Server。Dubbo中的底层服务调用实现类(比如NettyClient和MinaClient)都继承自Client,但是Client只是个发起服务调用的壳,底层的调用逻辑都被封装在Channel对象里(AbstractChannel的子类,比如NettyChannel)

Server作为服务提供方的顶层接口,继承自Endpoint和Resetable的同时,又定义了一系列服务端的接口方法,比如获取Channel列表或某个指定Channel

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

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

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

相关文章

渗透测试之Mimikatz2.2 如何抓取Win11登录明文密码

环境: 1.攻击者IP:192.168.1.35 系统: KALI2022(vmware 16.0) 2.靶机IP:192.168.1.16 系统: Windows11 3.USB无线网卡 4.Mimikatz 2.2 (win版) 问题描述: Mimikatz2.2 如何抓取Win11登录明文密码 解决方案: Wdigest WDigest协议是在WindowsXP中被引入的,旨在与H…

vue 中使用低版本高德地图1.4 , 解决热力图渲染展示在可视化区域内使用setFitViewt跳转不起作用,计算地图的缩放级别和中心点

效果,点击渲染热力图 地图自适应可视化区域展示所有热力图 /热力图数据const data [{ lng: 118.77, lat:32.03, count: 100 },{ lng: 118.82, lat: 32.02, count: 100 },{ lng: 118.77, lat:32.02,count:80},{ lng:118.75, lat: 32.01, count: 50 },{ lng:118.82…

借助AI技术提高图片转换为Excel表格的效率与准确性

在当今数字化时代,数据已经成为企业决策的重要依据。然而,在数据收集和整理过程中,许多企业面临着将图片中的表格转换为Excel格式的难题。这些图片可能来自扫描仪、网络、社交媒体等,数量庞大且格式不一,处理起来费时费…

GEE中Landsat、Sentinel、Modis主要数据集区别

一、Landsat 1. Collection 1/2 的区别 Collection 2 是Landsat Level 1 数据的又一次重大再处理,显著提高了绝对地理定位精度。 Collection1Collection2时间跨度1972~2021底1972~至今数据等级level 1level1:1972~2021底 level2:1982~至今 …

js逆向第22例:猿人学第18题jsvmp洞察先机

文章目录 一、前言二、定位关键参数1、处理CryptoJS加密2、被加密的值`value`和密钥`secret`是怎么来的三、代码实现一、前言 任务十八:抓取这5页的数字,计算加和并提交结果 标题已经给到提示jsvmp,这里先了解一下它: jsvmp技术提供了一种将JS代码编译成二进制指令集的方法…

index_jsp报错

今天跟着视频一模一样敲代码,一直报500 搜索了好几篇csdn,不断地修改添加的jstl.jar 和standard.jar,修改这两个jar包版本,还是报500 又看到说是因为tomcat10中存在jsp.jar,同时存在发生冲突,于是把tomcat…

nas-群晖docker查询注册表失败解决办法(平替:使用SSH命令拉取ddns-go)

一、遇到问题 群晖里面的docker图形化界面现在不能直接查询需要下载的东西,原因可能就是被墙了,那么换一种方式使用SSH命令下载也是可以的,文章这里以在docker里面下载ddns-go为例子。 二、操作步骤 (一)打开群晖系统…

安卓apk加固后重签名

背景 等保检测,安卓apk使用第三方加固后签名信息会丢失,需要我们重新进行签名 使用jarsigner签名遇到的问题 APP失效无法安装 如何解决签名失效 我们在这里使用Android SDK的apksigner进行签名 mac系统,apksigner 需要设置环境变量 1、…

metinfo_6.0.0 任意文件读取漏洞复现

漏洞点为/include/thumb.php 一测:/include/thumb.php?dir..././http/..././config/config_db.php 二测:/include/thumb.php?dir.....///http/.....///config/config_db.php 三测:/include/thumb.php?dirhttp/.....///.....///config/conf…

Kafka-消费者-KafkaConsumer分析

与KafkaProducer不同的是,KafkaConsumer不是一个线程安全的类。 为了便于分析,我们认为下面介绍的所有操作都是在同一线程中完成的,所以不需要考虑锁的问题。 这种设计将实现多线程处理消息的逻辑转移到了调用KafkaConsumer的代码中&#x…

ChatGPT 商业提示词攻略书

原文:ChatGPT Business Prompt Playbook 译者:飞龙 协议:CC BY-NC-SA 4.0 一、书系介绍 人工智能发展迅速。非常迅速。 所以我希望你做两件事: (1) 在 Twitter 上关注我:iamkylebalmer (2) 订阅我的免费电子邮件通…

爬虫-10-selenium自动化(2)

#内容:执行js,标签页切换,动作链,元素等待

给科研人的 ML 开源发布工具包

什么是开源发布工具包? 恭喜你的论文成功发表,这是一个巨大的成就!你的研究成果将为学界做出贡献。 其实除了发表论文之外,你还可以通过发布研究的其他部分,如代码、数据集、模型等,来增加研究的可见度和采…

葡萄酒术语“干”是什么意思呢?

一个初学品酒的人常常会感到力不从心,有如此多的术语,如甜、干、单宁、酒体等等,很容易让人迷失。嗯,就像情人眼里出西施一样,“好酒”因人而异。虽然品尝各种不同的葡萄酒是了解你喜欢什么的最好方法,但我…

leetcode热题100.路径总和 III

Problem: 437. 路径总和 III 文章目录 题目思路1复杂度1Code1思路2复杂度2Code2 题目 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶…

统计学-R语言-5.3

文章目录 前言分位数统计量的标准误总结 前言 本篇文章即为概率与分布的最后一篇文章。 分位数 分位数函数是累积分布函数的反函数。 p-分位数是具有这样性质的一个值:小于或等于它的概率为p。 根据定义,中位数即50%分位数。 分位数通常用于置信区间的…

如何解决分支机构无法连入总部采购管理系统的难题

案例背景: 某企业业务规模不断壮大,内部采购流程越发复杂,供应商资质情况各异难以管理,为提高内部采购效率和采购品质,优化供应链管理,确保采购环节公正透明可溯,该企业集中化部署了采购管理系…

Microsoft Word 删除空行

Microsoft Word 删除空行 1. 删除空行1.1. 替换1.2. 段落标记 References 1. 删除空行 1.1. 替换 1.2. 段落标记 特殊格式 -> 段落标记 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

<软考高项备考>《论文专题 - 73 风险管理(5)》

5 过程4-实施定量风险分析 5.1 问题 4W1H过程做什么是就已识别的单个项目风险和不确定性的其他来源对整体项目目标的影响进行定量分析的过程。作用:1、量化整体项目风险最大可能性;2、提供额外的定量风险信息,以支持风险应对规划。为什么做了解风险对项目整体目标…

K8S对外服务ingress

Sevice作用体现在两个方面 集群内部 不断跟踪pod的变化,更新endpoint中的pod对象,基于pod的ip地址不断发现的一种服务发现机制 集群外部 类似负载均衡器,把流量(ip端口),不涉及转发url(http ht…