Dubbo 服务发现

Dubbo 服务发现

1、什么是服务发现

**服务发现(Service discovery)**是自动检测一个计算机网络内的设备及其提供的服务。

2、Dubbo 与 服务发现

Dubbo 提供的是一种 Client-Based 的服务发现机制,依赖第三方注册中心组件来协调服务发现过程,支持常用的注册中心如 Nacos、Consul、Zookeeper 等。

以下是 Dubbo 服务发现机制的基本工作原理图:

在这里插入图片描述

服务发现包含提供者、消费者和注册中心三个参与角色,其中,Dubbo 提供者实例注册 URL 地址到注册中心,注册中心负责对数据进行聚合,Dubbo 消费者从注册中心读取地址列表并订阅变更,每当地址列表发生变化,注册中心将最新的列表通知到所有订阅的消费者实例。

  • 首先,Dubbo 注册中心以应用粒度聚合实例数据,消费者按消费需求精准订阅,避免了大多数开源框架如 Istio、Spring Cloud 等全量订阅带来的性能瓶颈。
  • 其次,Dubbo SDK 在实现上对消费端地址列表处理过程做了大量优化,地址通知增加了异步、缓存、bitmap 等多种解析优化,避免了地址更新常出现的消费端进程资源波动。
  • 最后,在功能丰富度和易用性上,服务发现除了同步 ip、port 等端点基本信息到消费者外,Dubbo 还将服务端的 RPC/HTTP 服务及其配置的元数据信息同步到消费端,这让消费者、提供者两端的更细粒度的协作成为可能,Dubbo 基于此机制提供了很多差异化的治理能力。

3、Dubbo 的服务发现特点

从注册中心视角来看,它负责以应用名 (dubbo.application.name) 对整个集群的实例地址进行聚合,每个对外提供服务的实例将自身的应用名、实例ip:port 地址信息 (通常还包含少量的实例元数据,如机器所在区域、环境等) 注册到注册中心。

在这里插入图片描述

每个消费服务的实例从注册中心订阅实例地址列表,相比于一些产品直接将注册中心的全量数据 (应用 + 实例地址) 加载到本地进程,Dubbo 实现了按需精准订阅地址信息。比如一个消费者应用依赖 app1、app2,则只会订阅 app1、app2 的地址列表更新,大幅减轻了冗余数据推送和解析的负担。

  • Dubbo3 应用级服务发现,以应用粒度组织地址数据
  • Dubbo2 接口级服务发现,以接口粒度组织地址数据

应用粒度有以下优势:

  • 适配云原生微服务变革
    • 提升性能和可伸缩性,从本质上解决了注册中心地址数据的存储和推送压力,相应的 Consumer 侧的地址计算压力也成数量级下降

按需订阅和全量订阅:

在这里插入图片描述

4、丰富元数据配置

除了与注册中心的交互,Dubbo3 的完整地址发现过程还有一条额外的元数据通路,我们称之为元数据服务 (MetadataService),实例地址与元数据共同组成了消费者端有效的地址列表。

在这里插入图片描述

完整工作流程如上图所示,首先,消费者从注册中心接收到地址 (ip:port) 信息,然后与提供者建立连接并通过元数据服务读取到对端的元数据配置信息,两部分信息共同组装成 Dubbo 消费端有效的面向服务的地址列表。以上两个步骤都是在实际的 RPC 服务调用发生之前。

5、总结

Dubbo是一个高性能、轻量级的分布式服务框架,提供了服务注册和服务发现的功能。在Dubbo中,服务的注册和发现是通过注册中心来实现的。注册中心的作用是集中存储和管理服务的元数据信息,包括服务的地址、协议、调用方式等。

Dubbo框架支持多种注册中心,包括Zookeeper、Redis、Multicast、Simple等。其中,Zookeeper是最常用的注册中心之一。下面以Zookeeper为例,简要介绍Dubbo服务的注册和发现过程:

  1. 配置注册中心:首先,在Dubbo配置文件中配置注册中心的地址和连接信息。例如,在Dubbo的提供者(Provider)端和消费者(Consumer)端的配置文件中添加如下配置:
<!-- Provider端配置 -->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- Consumer端配置 -->
<dubbo:registry protocol="zookeeper" address="localhost:2181"/>
  1. 服务发布:Provider端启动后,会将自己提供的服务发布到注册中心。Dubbo框架会将服务的元数据信息注册到Zookeeper节点中,供Consumer端进行订阅和查找。

  2. 服务订阅:Consumer端启动后,会向注册中心订阅自己关心的服务。Dubbo框架会从Zookeeper中获取服务的元数据信息,并缓存在本地。

  3. 服务发现:Consumer端在进行服务调用时,会根据服务接口和版本等信息查询本地缓存或者注册中心,获取可用的服务提供者列表。Dubbo框架会根据负载均衡策略选择一个合适的服务提供者进行调用。

口和版本等信息查询本地缓存或者注册中心,获取可用的服务提供者列表。Dubbo框架会根据负载均衡策略选择一个合适的服务提供者进行调用。

Dubbo的服务发现过程包括配置注册中心、服务发布、服务订阅和服务发现。通过使用注册中心,Dubbo能够实现服务的动态扩展和高可用性,方便开发者进行分布式服务的管理和调用。

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

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

相关文章

C++从入门到精通——this指针

this指针 前言一、this指针的引出问题 二、this指针的特性三、例题什么时候会出现编译报错什么时候会出现运行崩溃this指针存在哪里this指针可以为空吗 四、C语言和C实现Stack的对比C语言实现C实现 前言 this指针是一个特殊的指针&#xff0c;在C类的成员函数中使用。它指向调…

Java笔试总结

. /etc/resolv.conf的用途是 A 邮件服务的设置文件 B DHCP的设置文件 C DNS解析的设置文件 D 网络路由的设置文件 答案: C 能够PING通同网段的节点&#xff0c;但却如PING不通其他网段的所有节点的最可能的原因() A 本机网关设置错误 B 本机没有正确设置DNS C 对方运行的是不…

webpack环境配置分类结合vue使用

文件目录结构 按照目录结构创建好文件 控制台执行: npm install /config/webpack.common.jsconst path require(path) const {merge} require(webpack-merge) const {CleanWebpackPlugin} require(clean-webpack-plugin) const { VueLoaderPlugin } require(vue-loader); c…

C++ 构造函数中的参数顺序

描述&#xff1a; 未初始化的参数必须在初始化参数之前 正确 ✓ 写法&#xff1a; mother(const char* food, const char* lastName"无姓", const char* firstName "无名" ); 错误❌写法&#xff1a; mother(const char* lastName"无姓", …

第十二届蓝桥杯大赛软件赛省赛C/C++大学B组

第十二届蓝桥杯大赛软件赛省赛C/C 大学 B 组 文章目录 第十二届蓝桥杯大赛软件赛省赛C/C 大学 B 组1、空间2、卡片3、直线4、货物摆放5、路径6、时间显示7、砝码称重8、杨辉三角形9、双向排序10、括号序列 1、空间 1MB 1024KB 1KB 1024byte 1byte8bit // cout<<"2…

nodejs详细安装步骤和npm配置

1、Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。Node.js 使用高效、轻量级的事件驱动、非阻塞 I/O 模型。它的包生态系统&#xff0c;npm&#xff0c;是目前世界上最大的开源库生态系统。 2、下载Node.js 官方地址&#xff1a;https://nodejs.org/…

STM32CubeMX+MDK通过I2S接口进行音频输入输出(全双工读写一个DMA回调)

一、前言 目前有一个关于通过STM32F411CEUx的I2S总线接口控制SSS1700芯片进行音频输入输出的研究。 SSS1700 是具有片上振荡器的 3S 高度集成的USB音频控制器芯片 。 SSS1700 功能支持96 KHz 24 位采样率&#xff0c;带外部音频编解码器&#xff08;24 位/96KHz I2S 输入和输出…

RabbitMQ的交换机与队列

一、流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&am…

腾讯云4核8G服务器12M带宽646元1年零3个月,4C8G使用场景说明

腾讯云4核8G服务器多少钱&#xff1f;腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月&#xff0c;活动页面 txybk.com/go/txy 活动链接打开如下图所示&#xff1a; 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器&#xff0c;详细配置为&#xff1a;轻量4核…

【ARMv7-M】| 01——阅读笔记 | 简介|应用程序级编程和内存模型

系列文章目录 【ARMv7-M】| 01——阅读笔记 | 简介|应用程序级编程和内存模型 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 前言1、简介2、应用程序级编程模型2.1 编程模式和访问等级2.2 数据类型和运算操作2.3 寄存器和执行状态1.2.4 异常和中断1.2.5 浮点单元寄存器…

快速入门Kotlin⑤协程

基础 本质上,协程是轻量级的线程。 runBlocking 用于在当前线程中阻塞执行协程代码直到协程执行完毕。它通常用于在主函数或测试代码中使用,以确保协程代码的顺序执行。 GlobalScope.launch 是一个顶级函数,用于在全局范围内启动一个新的协程。它创建一个顶级协程,该协程…

【JAVASE】带你了解面向对象三大特性之一(多态)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 1.多态 1.1 多态的概念 多态的概念&#xff1a;通俗来说&#…

如何在Linux中查找和删除软链接

在Linux中&#xff0c;软链接&#xff08;或符号链接&#xff09;相当于Windows中的快捷方式。它们是指向文件或目录的引用。有时候&#xff0c;我们需要替换或删除这些软链接&#xff0c;特别是在更新软件或解决路径冲突时。本文将教你如何查找和删除Linux中的软链接。 查找软…

达梦导出工具dexp

基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例dexp 逻辑导出 dexp 工具可以对本地或者远程数据库进行数据库级、用户级、模式级和表级的逻辑备份。备份的内容非…

MySql数据库从0到1学习-第一天DDL学习

DDL 数据库(查询/创建/修改/删除) 查询数据库 以下语句的database 可以替换为schema,效果一样 //展示所有的数据库 show database; //显示当前选择的数据库 select database(); 创建数据库 //创建一个数据库叫db_name create database db_name;//如果不存在就创建db_name cr…

鸿蒙学习记录

问题小测记录 总结链接&#xff1a;小测总结 学习笔记&#xff1a;鸿蒙开发学习记录 1、 main_pages.json存放页面page路径配置信息。 2、在stage模型中&#xff0c;下列配置文件属于AppScope文件夹的是&#xff1f; app.json5 3、module.json5配置文件中&#xff0c;包含…

RabbitMQ知识点

什么是 rabbitmq 采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦 为什么要使用 rabbitmq 在分布式系统下具备异步,削峰,负载均衡等一系列高级功能拥有持久化的机制&#xff0c;进程消息&#xff0c;队列中…

Java集合基础知识点复习

目录 Java提供的常见集合ListArrayList底层实现与扩容机制ArrayList listnew ArrayList(10)中的list扩容几次如何实现数组和List之间的转换用Arrays.asList转List后&#xff0c;如果修改了数组内容&#xff0c;list受影响吗&#xff1f;List用toArray转数组后&#xff0c;如果修…

Vue 【vite使用alias】

文章目录 前言一、vite.config.ts二、tsconfig.json三、可能遇到的问题 前言 这是一个比较常用&#xff0c;且配置简单的功能。但是在不同环境下还是有点点小坑&#xff0c;这边就当是一个全面的记录吧。 vite中配置alias总共需要配置两个地方 vite.config.ts&#xff1a;让代…

Java基础知识总结(44)

&#xff08;1&#xff09;分支结构——Switchcase 语法&#xff1a; switch(expression){ case 1: //代码 break; case 2: //代码 break; ... default: } Java7之前 expression的类型只支持byte、short、int、charJava7之后添加了String和枚举switch分支语句的执行是先对expre…