带你读《Apache Dubbo微服务开发从入门到精通》—— 一、 Dubbo服务发现设计

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 带你读《Apache Dubbo微服务开发从入门到精通》—— 一、 Dubbo服务发现设计

服务发现与负载均衡

 

一、 Dubbo服务发现设计

 

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

 

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

 

image.png

 

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

 

1. 面向百万实例集群的服务发现机制

 

区别于其他很多微服务框架的是,Dubbo3的服务发现机制诞生于阿里巴巴超大规模微服务电商集群实践场景,因此,其在性能、可伸缩性、易用性等方面的表现大幅领先于业界大多数主流开源产品。是企业面向未来构建可伸缩的微服务集群的最佳选择。

 

image.png

 

首先,Dubbo注册中心以应用粒度聚合实例数据,消费者按消费需求精准订阅,避免了大多数开源框架如Istio、Spring Cloud等全量订阅带来的性能瓶颈。

 

其次,Dubbo SDK在实现上对消费端地址列表处理过程做了大量优化,地址通知增加了异步、缓存、bitmap等多种解析优化,避免了地址更新常出现的消费端进程资源波动。

 

最后,在功能丰富度和易用性上,服务发现除了同步IP、port等端点基本信息到消费者外,Dubbo还将服务端的RPC/HTTP服务及其配置的元数据信息同步到消费端,这让消费者、提供者两端的更细粒度的协作成为可能,Dubbo基于此机制提供了很多差异化的治理能力。

 

1) 高效地址推送实现

 

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

 

注:

Dubbo2版本注册中心以服务粒度聚合实例地址,比应用粒度更细,也就意味着传输的数据量更大,因此在大规模集群下也遇到一些性能问题。

 

针对Dubbo2与Dubbo3跨版本数据模型不统一的问题,Dubbo3给出了平滑迁移方案,可做到模型变更对用户无感。具体请查阅本文最后一章平滑迁移的描述。

 

image.png

 

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

 

image.png

 

2) 丰富元数据配置

 

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

 

image.png

 

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

 

注:

对于微服务间服务发现模型的数据同步,REST定义了一套非常有意思的成熟度模型,感兴趣的朋友可以参考这里的链接按照文章中的4级成熟度定义,Dubbo当前基于接口粒度的模型可以对应到最高的L4级别。

 

2. 配置方式

 

Dubbo服务发现扩展了多种注册中心组件支持,如Nacos、Zookeeper、Consul、Redis、kubernetes等,可以通过配置切换不通实现,同时还支持鉴权、命名空间隔离等配置。具体配置方式请查看SDK文档。

 

Dubbo还支持一个应用内配置多注册中心的情形如双注册、双订阅等,这对于实现不同集群地址数据互通、集群迁移等场景非常有用处,官网任务里有关于这部分的示例说明。

 

3. 自定义扩展

 

注册中心适配支持自定义扩展实现,具体请参见官网可扩展性文档

相关文章
|
15天前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
4月前
|
JSON Dubbo Java
微服务框架(二十)Dubbo Spring Boot 生产就绪特性
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   本文为Dubbo Spring Boot 生产就绪特性
|
1天前
|
负载均衡 算法 NoSQL
探索微服务架构下的服务发现与治理
【5月更文挑战第9天】 在当今的软件开发领域,微服务架构已成为构建可伸缩、灵活且容错的系统的首选模式。随着服务的增多,如何有效地进行服务发现与治理成为了关键的挑战。本文将深入探讨微服务环境中服务发现的机制和治理策略,分析不同服务发现工具的优缺点,并提出一种基于一致性哈希和健康检查相结合的服务治理方案,旨在提高系统的可用性和性能。
|
2天前
|
负载均衡 网络协议 算法
【Docker 专栏】Docker 容器内服务发现与负载均衡
【5月更文挑战第8天】本文探讨了Docker容器中的服务发现与负载均衡。服务发现通过环境变量、DNS或集中式系统(如Consul、Zookeeper)来定位服务实例。负载均衡则采用轮询、随机等算法,可通过软件负载均衡器、云服务或容器编排工具(如Kubernetes)实现。服务发现与负载均衡结合使用,确保请求有效分发和系统稳定性。面对动态性、网络延迟及大规模部署的挑战,需采取相应措施优化。选择合适技术并持续优化,能提升Docker容器应用的性能和可靠性。
【Docker 专栏】Docker 容器内服务发现与负载均衡
|
2天前
|
负载均衡 网络协议 应用服务中间件
理解现代微服务架构中的服务发现
微服务架构已经成为软件开发领域中的一股重要力量。在这种架构中,服务发现是关键的一环。本文旨在详细探讨服务发现的概念、其在微服务中的重要性,以及实现服务发现的常见方法和工具。
|
12天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo: 微服务通信的高效解决方案
【4月更文挑战第28天】在微服务架构的发展中,服务间的高效通信至关重要。Spring Cloud Dubbo 提供了一种基于 RPC 的通信方式,使得服务间的调用就像本地方法调用一样简单。本篇博客将探讨 Spring Cloud Dubbo 的核心概念,并通过具体实例展示其在项目中的实战应用。
15 2
|
18天前
|
敏捷开发 负载均衡 监控
微服务架构下的服务发现机制
【4月更文挑战第22天】 在现代软件工程中,微服务架构已成为构建可扩展和灵活后端系统的重要方式。随着服务的增多和动态性增强,如何有效进行服务发现成为了保障系统高可用性和敏捷性的关键。本文将深入探讨微服务环境中的服务发现模式,分析其必要性,并比较各类服务发现机制的优劣及其适用场景。我们将重点讨论基于中心化注册和去中心化方法的实现原理,以及它们在实际项目中的挑战与解决方案。
18 1
|
1月前
|
运维 负载均衡 网络协议
探索微服务架构下的服务发现机制
【4月更文挑战第6天】 随着现代软件工程的发展,微服务架构因其灵活性、可扩展性而日益受到重视。在此架构模式下,服务发现成为了确保系统高可用性和弹性的关键组件。本文将深入探讨微服务环境中服务发现的核心概念、实现方式以及面临的挑战,旨在为开发者提供一套明晰的服务发现指南和实践建议。
|
1月前
|
负载均衡 网络协议 Java
构建高效可扩展的微服务架构:利用Spring Cloud实现服务发现与负载均衡
本文将探讨如何利用Spring Cloud技术实现微服务架构中的服务发现与负载均衡,通过注册中心来管理服务的注册与发现,并通过负载均衡策略实现请求的分发,从而构建高效可扩展的微服务系统。
|
2月前
|
敏捷开发 缓存 负载均衡
微服务架构下的服务发现与注册机制
【2月更文挑战第21天】 随着现代应用向微服务架构转型,服务的数量和复杂性不断增加。在这种环境下,有效的服务发现与注册机制成为确保系统可伸缩性和高可用性的关键。本文深入探讨了微服务架构中服务发现的基本原则、常用模式及其实现技术,同时分析了服务注册的流程和优势。文章旨在为开发者提供一个清晰的指引,帮助他们在构建分布式系统时做出明智的设计选择。

推荐镜像

更多