服务发现

Dubbo 提供基于客户端的服务发现机制,依赖于第三方注册中心组件来协调服务发现过程。它支持 Nacos、Consul 和 Zookeeper 等流行的注册中心。

以下是 Dubbo 服务发现机制的基本工作流程图

service-discovery

服务发现涉及三个角色:提供者、消费者和注册中心。在此设置中,Dubbo 提供者实例将它们的 URL 地址注册到注册中心,注册中心会聚合这些数据。Dubbo 消费者从注册中心读取地址列表并订阅更改。每当地址列表发生更改时,注册中心都会通知所有已订阅的消费者实例。

适用于百万级集群的服务发现

与许多其他微服务框架不同,**Dubbo 3 的服务发现源自阿里巴巴的大规模电子商务微服务集群。因此,它在性能、可扩展性和易用性方面明显优于大多数主流开源产品。**它是企业构建未来可扩展微服务集群的最佳选择。

service-discovery

  • 首先,Dubbo 的注册中心在应用程序粒度级别聚合实例数据,允许消费者根据其需求精确订阅,从而避免了大多数开源框架(如 Istio 和 Spring Cloud)中全订阅造成的性能瓶颈。
  • 其次,Dubbo SDK 对消费者端地址列表处理进行了大量优化,添加了异步通知、缓存、位图和各种解析优化,以避免地址更新期间常见的资源波动。
  • 最后,在功能丰富性和易用性方面,除了将基本的端点信息(如 IP 和端口)同步到消费者之外,Dubbo 还将服务器 RPC/HTTP 服务及其配置的元数据信息同步到消费者端,允许消费者和提供者之间进行更细粒度的协作。

高效的地址推送实现

从注册中心的角度来看,它根据应用程序名称(dubbo.application.name)聚合整个集群的实例地址。每个服务提供者实例将自己的应用程序名称、实例 IP:端口地址信息(通常还包含少量实例元数据,例如机器的区域、环境等)注册到注册中心。

Dubbo2 的注册中心在服务粒度级别聚合实例地址,这比应用程序粒度更细,因此意味着更多的数据传输。这导致了大型集群中的一些性能问题。为了解决 Dubbo2 和 Dubbo3 数据模型之间的不一致性,Dubbo3 提供了一个平滑迁移解决方案,使模型更改对用户透明。

service-discovery


每个消费者服务实例从注册中心订阅实例地址列表。与一些将所有注册中心数据(应用程序 + 实例地址)加载到本地进程的产品不同,Dubbo 实施了精确的按需地址订阅。例如,如果一个消费者应用程序依赖于 app1 和 app2,它只会订阅 app1 和 app2 的地址列表更新,从而显著减少了冗余数据推送和解析的负担。


service-discovery

丰富的元数据配置

除了与注册中心交互之外,Dubbo 3 的完整地址发现过程还有一个额外的元数据路径,称为元数据服务。实例地址和元数据共同构成消费者端的有效地址列表。

service-discovery

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

有关 MetadataService 的定义和服务发现过程的完整分析,请参阅详细的应用级服务发现

对于微服务服务发现模型中的数据同步,REST 定义了一个非常有趣的成熟度模型。感兴趣的读者可以参考此处的链接https://martinfowler.com.cn/articles/richardsonMaturityModel.html。根据文章的 4 级成熟度定义,Dubbo 当前基于接口粒度的模型对应于最高的 L4 级。

配置方法

Dubbo 服务发现扩展支持多种注册中心组件,例如 Nacos、Zookeeper、Consul、Redis、Kubernetes 等。它可以通过配置进行切换,还支持身份验证和命名空间隔离配置。有关特定配置方法,请参阅 SDK 文档

Dubbo 还支持单个应用程序中多个注册中心的场景,例如双注册、双订阅等。这对于实现不同集群之间的数据交换和集群迁移非常有用。我们将在未来的文档中添加最佳实践示例来说明这部分内容。

自定义扩展

注册中心适配支持自定义扩展实现。有关详细信息,请参阅Dubbo 可扩展性


上次修改时间:2023 年 10 月 18 日:翻译部分特性概述文档 (#2836) (c3822a9e2ef)