Dubbo运行原理

目录

Dubbo通讯协议

Dubbo负载均衡策略

RPC和HTTP有什么区别?

让你设计一个RPC框架,如何考虑数据序列化问题?


Dubbo 是一款高性能、轻量级的开源 RPC(远程过程调用)框架,主要用于构建分布式服务和微服务架构。

要说 Dubbo 运行流程就不得不先来了解一下 Dubbo 的核心组件了,因为 Dubbo 的交互流程是和核心组件息息相关的。

Dubbo 核心组件有以下几个:

  • 服务提供者(Provider):暴露服务的应用,通过 Dubbo 框架将自身的服务接口及实现注册到注册中心。

  • 服务消费者(Consumer):调用远程服务的应用,从注册中心订阅所需的服务,然后通过远程调用消费服务。

  • 注册中心(Registry):集中管理服务的地址信息,服务提供者和服务消费者均在此注册或订阅服务信息。常见的注册中心有 ZooKeeper、Nacos 等。

Dubbo 运行流程如下图所示:

图片

它的执行流程如下:

  1. 服务提供者会将实例(URL 地址)注册到注册中心,注册中心负责对数据进行聚合(健康检测)。

  2. 消费者从注册中心读取地址列表并订阅变更,每当地址列表发生变化,注册中心将最新的列表通知到所有订阅的消费者实例。

  3. 消费者得到服务实例之后,通过 Dubbo 内置的负载均衡策略,选择其中的一个节点,之后使用 RPC 的方式与服务提供者建立连接,并进行通讯和服务调用。

更详细的调用流程如下:

Dubbo通讯协议

Dubbo 框架提供了自定义的高性能 RPC 通信协议:基于 HTTP/2 的 Triple 协议和基于 TCP 的 Dubbo2 协议。除此之外,Dubbo 框架支持任意第三方通信协议,如官方支持的 gRPC、Thrift、REST、JsonRPC、Hessian2 等,更多协议可以通过自定义扩展实现。这对于微服务实践中经常要处理的多协议通信场景非常有用。Dubbo 框架不绑定任何通信协议,在实现上 Dubbo 对多协议的支持也非常灵活,它可以让你在一个应用内发布多个使用不同协议的服务,并且支持用同一个 port 端口对外发布所有协议。

通过 Dubbo 框架的多协议支持,你可以做到:

  • 将任意通信协议无缝地接入 Dubbo 服务治理体系。Dubbo 体系下的所有通信协议,都可以享受到 Dubbo 的编程模型、服务发现、流量管控等优势。比如 gRPC over Dubbo 的模式,服务治理、编程 API 都能够零成本接入 Dubbo 体系。

  • 兼容不同技术栈,业务系统混合使用不同的服务框架、RPC 框架。比如有些服务使用 gRPC 或者 Spring Cloud 开发,有些服务使用 Dubbo 框架开发,通过 Dubbo 的多协议支持可以很好的实现互通。

  • 让协议迁移变的更简单。通过多协议、注册中心的协调,可以快速满足公司内协议迁移的需求。比如如从自研协议升级到 Dubbo 协议,Dubbo 协议自身升级,从 Dubbo 协议迁移到 gRPC,从 HTTP 迁移到 Dubbo 协议等。

Dubbo负载均衡策略

目前 Dubbo(3.X)内置了如下负载均衡算法如下:

  1. Weighted Random LoadBalance(加权随机):默认负载均衡算法,默认权重相同。按权重设置随机概率。缺点:存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

  2. RoundRobin LoadBalance(加权轮询):借鉴于 Nginx 的平滑加权轮询算法,默认权重相同,按公约后的权重设置轮询比率,循环调用节点。缺点:同样存在慢的提供者累积请求的问题。

  3. LeastActive LoadBalance(最少活跃优先+加权随机):背后是能者多劳的思想,活跃数越低,越优先调用,相同活跃数的进行加权随机。活跃数指调用前后计数差(针对特定提供者:请求发送数 - 响应返回数),表示特定提供者的任务堆积量,活跃数越低,代表该提供者处理能力越强。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大;相对的,处理能力越强的节点,处理更多的请求。

  4. Shortest-Response LoadBalance(最短响应优先+加权随机):更加关注响应速度,在最近一个滑动窗口中,响应时间越短,越优先调用。相同响应时间的进行加权随机。使得响应时间越快的提供者,处理更多的请求。缺点:可能会造成流量过于集中于高性能节点的问题。

  5. ConsistentHash LoadBalance(一致性哈希):确定的入参,确定的提供者,适用于有状态请求。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

  6. P2C LoadBalance(随机选择两个节点+连接数较小):随机选择两个节点后,继续选择“连接数”较小的那个节点。对于每次调用,从可用的 provider 列表中做两次随机选择,选出两个节点 providerA 和 providerB,比较 providerA 和 providerB 两个节点,选择其“当前正在处理的连接数”较小的那个节点。

  7. Adaptive LoadBalance(自适应负载均衡):在 P2C 算法基础上,选择二者中 load 最小的那个节点,是一种能根据后端实例负载自动调整流量分布的算法实现,它总是尝试将请求转发到负载最小的节点。

RPC和HTTP有什么区别?

RPC(Remote Procedure Call,远程过程调用)和 HTTP(Hypertext Transfer Protocol,超文本传输协议)都是用于服务间通讯的,它们主要区别如下:

  1. 概念和使用场景不同

    • RPC:RPC 是一种通信模式,允许一个程序在另一个地址空间上执行远程计算过程,使得客户端调用远程服务就像调用本地方法一样。

    • HTTP:HTTP 是一个应用层协议,用于在客户端和服务器之间传输文本、图像、视频等超媒体资源,通常用于 Web 应用之间的通信。

  2. 传输数据不同

    • RPC:RPC 通常基于二进制数据传输,可以使用更高效的序列化方式(如 Protobuf、Thrift)进行数据交换。

    • HTTP:HTTP 使用文本协议,请求和响应数据通常是基于文本格式(如 JSON、XML)进行传输。

  3. 传输效率与性能不同

    • RPC:因为 RPC 通常使用更高效的二进制序列化(如 Protobuf、Thrift),减少了数据传输的体积,且由于其针对性的设计,往往在性能上更为优越,特别是在大量小数据包的传输场景。

    • HTTP:传统上使用文本格式如 JSON 进行数据交换,这可能导致更大的数据包和更多的序列化/反序列化开销,但在 HTTP/2 中引入了头部压缩和多路复用,提升了效率。

让你设计一个RPC框架,如何考虑数据序列化问题?

数据序列化需要考虑的以下问题:

  1. 性能问题:选择高性能的序列化库至关重要。二进制序列化(如 Protocol Buffers, Apache Thrift, FlatBuffers)通常比文本格式(如 JSON、XML)更高效,因为它们占用的空间小,序列化和反序列化的速度更快。对于高性能要求的场景,应优先考虑这些二进制格式。

  2. 安全性:在序列化过程中,应考虑数据的安全性,避免敏感信息的泄露。可以采用加密序列化内容、过滤敏感字段或使用安全的传输层协议(如 TLS/SSL)来增加安全性。

  3. 兼容性:良好的版本兼容性是长期维护 RPC 框架的关键。设计时要考虑向前和向后兼容,即新老版本的序列化库应能互相理解和处理对方生成的数据格式。可以采用预留字段、版本标识符等机制来支持这一点。

  4. 跨语言支持:RPC 框架往往需要支持多种编程语言,因此选择一种跨语言的序列化方案是必要的。Protocol Buffers、Apache Thrift、Avro 等都是很好的选择,它们提供了多种语言的编解码库。

  5. 可扩展性:设计时应考虑到未来可能增加的数据结构和字段,序列化方案应易于扩展,支持动态字段、自定义类型等特性。

  6. 可配置性:允许用户根据实际需求选择或切换序列化策略。例如,对于对性能要求极高的场景,用户可以选择最高效的序列化方式;而对于调试或日志记录,可能会偏好人类可读性更好的格式。

  7. 异常处理:在序列化或反序列化过程中可能会遇到错误(如数据损坏、不兼容的版本等)。框架应能优雅地处理这些异常,并提供清晰的错误信息,帮助开发者诊断问题。

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

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

相关文章

springcloud第4季 springcloud-alibaba之openfegin+sentinel整合案例

一 介绍说明 1.1 说明 1.1.1 消费者8081 1.1.2 openfegin接口 1.1.3 提供者9091 9091微服务满足: 1 openfegin 配置fallback逻辑,作为统一fallback服务降级处理。 2.sentinel访问触发了自定义的限流配置,在注解sentinelResource里面配置…

基于SpringBoot的学生综合测评系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:SpringBoot框架 工具:MyEclipse、Tomcat 系统展示 首页 系统首页,提供综合…

After Effects 2024 mac/win版:创意视效,梦想起航

After Effects 2024是一款引领视效革命的专业软件,汇聚了创意与技术的精华。作为Adobe推出的全新版本,它以其强大的视频处理和动画创作能力,成为从事设计和视频特技的机构,如电视台、动画制作公司、个人后期制作工作室以及多媒体工…

求职产品运营的个人简历案例(精选篇)

在求职产品运营的道路上,一份出色的个人简历是迈向成功的第一步,但是简历怎么写才最好呢?下面是小编整理的求职产品运营的个人简历案例,同时,幻主简历网还提供精美简历模板下载和简历在线制作工具,欢迎大家…

meizu M10 魅蓝 10 mblu10 root 解锁 安装LSPosed框架 紫光展锐改串 AT命令 一键新机 改机软件 硬改 改参数

meizu M10 魅蓝 10 mblu10 root 解锁 安装LSPosed框架 紫光展锐改串 AT命令 一键新机 改机软件 硬改 改参数 ro.system.build.version.release11 ro.system.build.version.release_or_codename11 ro.system.build.version.sdk30 ro.system.custom.versionAndroid_M01 ro.prod…

python目录树生成器

代码如下: import os from colorama import Fore, Style, init from tkinter import Tk, Label, Entry, Button, Text, Scrollbar, RIGHT, Y, END# 初始化 colorama init(autoresetTrue)def print_directory_tree(root_dir, text_widget, indent, lastTrue):"…

NISP国家信息安全水平考试

国家信息安全水平考试(NISP)是中国信息安全测评中心考试、发证,由国家网络空间安全人才培养基地运营管理,并授权网安世纪科技有限公司为NISP证书管理中心。 中国信息安全测评中心开展国家信息安全水平考试(NISP)考试项目,是为普及信息安全/网…

Spring Boot如何实现跨域资源共享(CORS)?

🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪 🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师 🍅 技术交流:定期更新…

1.k8s:架构,组件,基础概念

目录 一、k8s了解 1.什么是k8s 2.为什么要k8s (1)部署方式演变 (2)k8s作用 (3)Mesos,Swarm,K8S三大平台对比 二、k8s架构、组件 1.k8s架构 2.k8s基础组件 3.k8s附加组件 …

【STM32-存储器映射】

STM32-存储器映射 ■ STM32F1-4G地址空间分成8个块■ STM32F1-Block0■ STM32F1-Block1■ STM32F1-Block2■ STM32F1- ■ STM32F1-4G地址空间分成8个块 ■ STM32F1-Block0 有出厂 BootLoader 就可以使用串口下载程序。如Keil5图中IROM地址是0x8000000 开始 就是flash地址 ■ S…

使用方法——注意事项及好处

public class MethodDemo01 {public static void main(String[] args) {// 目标:掌握定义方法的完整性,清楚使用方法的好处。// 需求:假如现在有很多程序员都要进行2个整数求和的操作。//1、李工。int rs sun(10,20);System.out.println(&q…

[vscode] 自定义log快捷生成代码

1、进入设置页面:文件>首选项>用户代码片段>选择设置的语言。 2. 关于代码段显示位置的调整设置 文件>首选项>设置,搜索代码段或snippetSuggestions,修改为”top”; 参考: vscode自定义log快捷生成代码

直流电机双闭环调速Simulink仿真

直流电机参数: 仿真模型算法介绍: 1)三相整流桥,采用半控功率器件SCR晶闸管; 2)采用转速环、电流环 双闭环控制算法; 3)外环-转速环,采用PI 比例积分控制;…

Java进阶-Lambda

Java进阶-Lambda 前言Lambda表达式什么是Lambda表达式初识Lambda表达式Lambda表达式的简单使用Lambda表达式格式分析与传统接口方法实现的比较 理解Lambda表达式函数式编程非纯函数实例纯函数示例函数式编程在Lambda表达式中的体现 闭包闭包与Lambda表达式的示例 类型推导-匿名…

633. 平方数之和(中等)

633. 平方数之和 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java内存溢出溢出代码正确代码与截图 1. 题目描述 题目中转:633. 平方数之和 2.详细题解 本题是167. 两数之和 II - 输入有序数组(中等)题目的变型,由两数之和变…

数字图像分析(第二部分)

文章目录 第8章 图像分割图像分割定义阈值分割依赖像素的阈值选取Otsus方法依赖区域的阈值选取依赖坐标的阈值选取变化阈值法区域生长法分裂合并方法分水岭算法聚类分割算法K-meansAP算法Graph cut第9章 图像特征表达基于全局特征的图像表达直方图GIST基于局部特征的图像表达简…

JavaScript通用下载方法,但jpg图片下载打不开

通用下载方法,通过Blob的方式,访问Url地址,下载对应的图片,excel等文件。 axios({method: "get",url,responseType: "blob",}).then((res: any) > {const link document.createElement("a");co…

前端打包配置+nginx配置实现部署及部署地址带特定前缀的几种方式

前端打包后要部署到服务器,在浏览器中可以通过url访问到我们开发的系统,通过nginx代理在工作中是一种很常用的方式。 这里以本地为例,把本地电脑当作一个服务器,实现普通部署、带特定前缀等 前端使用vue-clivue作为例子 以下内容…

1.3 Sqoop 数据同步工具详细教程

Apache Sqoop 是一个开源工具,用于在 Apache Hadoop 和关系型数据库(如 MySQL、Oracle、PostgreSQL 等)之间高效传输数据。Sqoop 可以将结构化数据从关系型数据库导入到 Hadoop 的 HDFS、Hive 和 HBase 中,也可以将数据从 Hadoop …

茴香豆接入微信个人助手部署

将rag产品接入微信工作群,自动回答问题,香吗?? let‘s go 1、打开openxlab平台,找到茴香豆web产品应用中心-OpenXLab 点击进入,设置知识库名字和密码 2、上传知识库文件和编辑正反例等 3、然后进行测试问答…