dubbo概论

news2025/1/12 13:11:10

目录

前言:

1.概述

2.服务发现

3.容错

3.1.注册中心宕机

3.2.负载均衡

3.3.限流、熔断

4.通信协议

4.1.HTTP

4.2.dubbo

5.总结


前言:

这可能是全网最深入浅出的dubbo文章,如果你会spring cloud,恭喜你,你可以在读这边博文的时候类比Spring Cloud,很快就能get到整个dubbo的关键点。如果你不会Spring Cloud也不要紧,这篇博文也能带你很快了解一下dubbo。

1.概述

dubbo,Alibaba推出的开源、高性能、轻量级的RPC框架。着力于提供两方面的能力:

  • 超高性能的RPC

  • 服务治理

超高性能的RPC:

首先dubbo兼容市面主流的通信协议,如HTTP等,其次dubbo自定义了通信协议,内置支持 Dubbo2、Triple 两款自定义的高性能通信协议,其高效率很重要的一部分就体现在自定义的通信协议上。

服务治理:

dubbo提供了一整套服务治理能力,涵盖:

  • 服务发现

  • 负载均衡

  • 路由

  • 链路追踪

等等

dubbo的架构:

在Dubbo中,dubbo会去接管服务的提供者和消费者,然后获取服务信息、调用服务都由dubbo来负责。正是因为负责了RPC过程,所以dubbo可以在通信过程种加入很多服务的治理能力进去。

2.服务发现

服务发现指的就是服务注册与发现的整个过程,dubbo支持常见的注册中心:

Nacos、Zookeeper、Consul、Redis

注册和服务提供者会将自己的服务注册到注册中心,而服务消费者会从注册中心获取服务提供者的信息。为了减轻注册中心的负载并提高调用性能,Dubbo客户端会缓存从注册中心获取的服务提供者的地址列表或元数据信息。这样,在后续的服务调用过程中,Dubbo客户端可以直接使用本地缓存的信息,而无需每次都去注册中心查询。

 Dubbo的缓存机制是提了高性能,减少了对注册中心的依赖,但同时也可能导致一些问题,例如服务提供者的地址发生变化时,如果缓存的信息没有及时更新,可能会导致调用失败或访问旧的服务提供者。因此,在使用Dubbo时,需要合理配置和管理缓存机制,以确保系统的可用性和一致性。

在Dubbo框架中,本地缓存和注册中心同步数据的时机是在以下情况下:

  1. 首次访问:当服务消费者首次访问某个服务时,Dubbo客户端会从注册中心获取服务提供者的地址列表或元数据信息,并将其缓存在本地。

  2. 缓存过期:Dubbo客户端可以配置缓存的过期时间。当缓存中的数据过期时,Dubbo会自动触发与注册中心的同步操作,更新本地缓存的服务注册信息。

  3. 强制刷新:在某些情况下,你可以通过配置选项或编程方式强制刷新本地缓存。例如,当服务提供者的地址发生变化,或者你希望立即获取最新的注册信息时,可以手动触发刷新操作。

dubbo种支持通过配置或者编码的方式来强制刷新缓存。此处不做代码或者配置上的展示,因为任何开源组件,其API或者配置属性都会随着版本的迭代改变,用的时候去官网查官方文档是最为稳妥的。

当然这里只聊了基础发布,dubbo其实还支持诸如灰度发布之类的高级的服务发布方式的,详见官方手册即可。

3.容错

3.1.注册中心宕机

dubbo存在本地缓存,注册中心宕机后,服务调用会走缓存,仍然不会影响使用。

3.2.负载均衡

Dubbo 提供的是客户端负载均衡,即由 Consumer 通过负载均衡算法得出需要将请求提交到哪个 Provider 实例。

提供了多种均衡策略:

默认为 weighted random基于权重的随机负载均衡策略。

算法特性备注
Weighted Random LoadBalance加权随机默认算法,默认权重相同
RoundRobin LoadBalance加权轮询借鉴于 Nginx 的平滑加权轮询算法,默认权重相同,
LeastActive LoadBalance最少活跃优先 + 加权随机背后是能者多劳的思想
Shortest-Response LoadBalance最短响应优先 + 加权随机更加关注响应速度
ConsistentHash LoadBalance一致性哈希确定的入参,确定的提供者,适用于有状态请求
P2C LoadBalancePower of Two Choice随机选择两个节点后,继续选择“连接数”较小的那个节点。
Adaptive LoadBalance自适应负载均衡在 P2C 算法基础上,选择二者中 load 最小的那个节点

以上所有负载均衡的具体代码、如何切换负载均衡策略等示例dubbo官网上的官方手册上都有详细说明,此处不做赘述。

3.3.限流、熔断

dubbo的限流和熔断通过集成第三方的组件来实现,如hystrix、Sentinel。要是又不会这两种流控组件的同学,正好博主之前有两篇优质的关于他们的文章,保证读一遍就懂:

详解Hystrix_hystrix版本__BugMan的博客-CSDN博客

详解sentinel使用_sentinel配置__BugMan的博客-CSDN博客

4.通信协议

4.1.HTTP

dubbo虽然自定义了应用层的通信协议,但是其还是支持HTTP的,具体的配置使用方法官方文档上有详细描述,此处不赘述。

4.2.dubbo

这里就是dubbo的重中之重,dubbo为什么被称为“高性能RPC框架”,很大一部分原因就是其自定义了一种高效的应用层通信协议——dubbo。

这里同学们可以先回想一下HTTP的报文结构,如果有不清楚的同学,可以移步博主的另一篇博客了解一下:

HTTP、HTTPS__BugMan的博客-CSDN博客

dubbo协议相比于HTTP来,其报文更加紧凑、简洁,具有更高的网络传输效率。

报文结构:

  1. 报文头部(Header):报文头部包含了一些元数据信息,例如魔数(Magic Number)、版本号、消息类型(请求或响应)、请求/响应ID等。这些信息用于Dubbo框架进行协议解析和消息处理。

  2. 报文体(Body):报文体包含了具体的请求或响应数据。对于请求消息,报文体中包含了调用的接口名称、方法名称、方法参数等。对于响应消息,报文体中包含了方法执行的结果、异常信息等。

  3. 序列化方式(Serialization):Dubbo报文的报文体中的数据需要进行序列化和反序列化操作。序列化方式定义了如何将Java对象转换为字节流以便在网络上传输,以及如何将字节流还原为Java对象。Dubbo框架支持多种序列化方式,例如Java自带的序列化、Hessian、JSON、Protobuf等。

  4. 消息编码(Codec):Dubbo报文在网络上传输时需要进行编码和解码操作。编码将报文数据转换为字节流,而解码将字节流还原为报文数据。Dubbo框架提供了多种编码方式,例如Dubbo协议的默认编码方式和其他自定义的编码方式。

  5. 扩展字段(Extensions):Dubbo报文还可以包含一些扩展字段,用于实现一些特定的功能或特性。例如,Dubbo报文可以通过扩展字段传递路由规则、负载均衡策略等信息。

5.总结

dubbo作为一款与spring cloud对标的产品,两者大的区别无非在两个方面:

  1. 生态
  2. 性能

1.生态:

生态上spring cloud是更加完善的,一套spring cloud全家桶,依赖引进来,啥组件都有了,而ribbon则需要自己去拼积木,对接第三方组件,拿组装电脑来类比的话,前者是水桶机,而后者是组装机,前者更方便开袋即食,后者更方便个性化定制。

2.性能:

在能上dubbo是要优于spring cloud的,这也是dubbo立足的根本。Dubbo的高性能主要体现在两点:

  • 选用netty作为容器

  • 自定义了报文结构

选用netty作为容器:

Dubbo底层其实是用netty来进行通信,netty的非阻塞式IO具有很高的性能。

自定义了报文结构:

netty自定义了通信协议,自定义了报文结构,比起http报文来,dubbo报文更加紧凑、简洁。其次,http报文的数据内容是文本格式的,而dubbo的数据内容是经过序列化的,dubbo报文的体积明显要小于http报文,解析速度、带宽利用率、吞吐量等指标上,dubbo明显都要由于http。

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

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

相关文章

Zookeeper命令总结

目录 1、常用命令2、ls path3、create xxx创建持久化节点创建临时节点创建持久化序列节点 4、get path5、set path6、delete path7、监听器总结1)节点的值变化监听2)节点的子节点变化监听(路径变化)3)当某个节点创建或…

Maven基础之项目创建、packaging

文章目录 创建 maven 项目流程骨架是浮云,packaging 是关键 创建 maven 项目流程 通过骨架(archetype)创建 maven 工程 第一步:选择 new → maven → Maven Project 第二步:New Maven Project 窗口不作任何设置&…

【软件测试】基于博客系统的自动化测试

目录 1.我的博客系统链接 2.使用selenium对博客系统进行自动化测试 1.引入依赖 2.创建公共类 3.创建测试套件类 4.测试登陆界面 5. 测试博客列表页 6.测试写博客页面 7.测试删除博客 8.最终运行结果 1.我的博客系统链接 用户登录 2.使用selenium对博客系统进行自动…

网络安全(黑客)系统自学,成为一名白帽黑客

前言 黑客技能是一项非常复杂和专业的技能,需要广泛的计算机知识和网络安全知识。你可以参考下面一些学习步骤,系统自学网络安全。 在学习之前,要给自己定一个目标或者思考一下要达到一个什么样的水平,是学完找工作(…

学习笔记22 map

一、概论 map的每个元素都由两个部分组成:键和值。每个键都与一个特定的值相关联,并且可以用于定位该值。 map和set很像,只不过map存储的是key,由key再映射到value,而set存储的就是value本身。 Map接口是泛型的&…

拦截Bean使用之前各个时机的Spring组件

拦截Bean使用之前各个时机的Spring组件 之前使用过的BeanPostProcessor就是在Bean实例化之后,注入属性值之前的时机。 Spring Bean的生命周期本次演示的是在Bean实例化之前的时机,使用BeanFactoryPostProcessor进行验证,以及在加载Bean之前进…

flink to starrocks 问题集锦....

[问题排查]导入失败相关 - 问题排查 - StarRocks中文社区论坛 starrocks官网如下: Search StarRocks Docs starrocks内存配置项: 管理内存 Memory_management StarRocks Docs 问题1:实时写入starrocks ,配置参数设置如下&a…

【【51单片机11.0592晶振红外遥控】】

51单片机11.0592晶振红外遥控 红外遥控,51单片机完结 这是初步实现的架构 怎么实现内部的详细逻辑 我们用状态机的方法 0状态时一个空闲状态 当它接收到下降沿开始计时然后转为1状态 1状态下 寻找start 或者repeat的信号 再来下降沿读出定时器的值 如果是start 那…

华为eNSP:isis的配置

一、拓扑图 二、路由器的配置 配置接口IP AR1&#xff1a; <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthe…

【沁恒蓝牙mesh】数据收发接口与应用层模型传递

本文主要描述了沁恒蓝牙mesh SDK的蓝牙数据收发接口&#xff0c;以及应用层的回调函数解析以及模型传递 这里写目录标题 1. 数据收发接口1.1【发送数据】1.2 【数据接收】 2. 应用层模型分析 1. 数据收发接口 1.1【发送数据】 /*&#xff08;1&#xff09;接口1 */ /*接口一&…

力扣热门100题之最大子数组和【中等】【动态规划】

题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&a…

Java文字转语音功能实现

需要下载jacob-1.18&#xff0c;网上一堆 项目中引入pom文件 <!-- https://mvnrepository.com/artifact/com.jacob/jacob 文字转语音 --> <dependency><groupId>com.hynnet</groupId><artifactId>jacob</artifactId><version>1.18&…

Go语言中‘String’包中的‘Cut‘函数的实现

Go语言中‘String’包中的’Cut’函数的实现 ​ Cut函数用于在字符串**‘s’中查找子串’sep’&#xff0c;并将字符串’s’在子串 ‘sep’ 第一次出现的位置分割成两部分&#xff1a;before和after** package main import("fmt" "strings" ) func main(…

Python初学

认识计算机&#xff1a; 计算机是怎么构成的——冯诺依曼体系结构 内存外存的区别&#xff1a; 一般机械硬盘的存储数据的期限是&#xff1a;几年到十几年 什么是编程&#xff1f; 制作软件——编程/软件开发 编程语言有哪些&#xff1f; Python Python背景知识 荷兰人Guid…

M5ATOMS3基础02传感器MPU6886

M5ATOMS3基础01按键 简洁版本 MPU6886是一款6轴IMU单元&#xff0c;具有3轴重力加速度计和3轴陀螺仪。它采用16位ADC&#xff0c;内置可编程数字滤波器和片上温度传感器&#xff0c;并通过I2C接口&#xff08;地址为0x68&#xff09;与上位机通信。MPU6886支持低功耗模式&#…

Linux系统MySQL中用户的权限管理

本节主要学习用户权限管理的概述&#xff0c;用户权限类型&#xff0c;用户赋权&#xff0c;权限删除&#xff0c;用户删除等。 目录 一、概述 二、用户权限类型 三、用户赋权 四、权限删除 五、用户删除 一、概述 数据库用户权限管理是数据库系统中非常重要的一个方面&am…

如何理解 SpringBoot 的生命周期

生命周期&#xff0c;就是从诞生到死亡的一个过程。Spring 中 bean 也是如此。在 Spring 中的 ConfigurableApplicationContext 的 refresh 开始直到一个 bean 可以被正常使用&#xff0c;中间经历了一系列初始化操作&#xff1b;而在其 close 后又经历了一系列销毁操作&#x…

(八九)如何与InfluxDB交互InfluxDB HTTP API

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 8 章 前言&#xff1a;如何与InfluxDB交互 1、InfluxDB启动后&#xff0c;会向外提供一套HTTP API。外部程…

配置代理——解决跨域问题(详解)

之前写项目的时候总会遇到配置代理的问题&#xff0c;可是配置了之后有时有用&#xff0c;有时就没有用&#xff0c;自己之前学的也是懵懵懂懂&#xff0c;于是专门花了一个小时去了解了如何配置代理跨域&#xff0c;然后在此记录一下&#xff0c;方便自己以后查阅。 一、 常用…

自守数 C语言实现

自守数 描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如&#xff1a;25^2 625&#xff0c;76^2 5776&#xff0c;9376^2 87909376。请求出n(包括n)以内的自守数的个数 数据范围&#xff1a; 1≤n≤10000 输入描述&#xff1a; int型整数 输出描述&#xf…