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服务的注册和发现过程:
- 配置注册中心:首先,在Dubbo配置文件中配置注册中心的地址和连接信息。例如,在Dubbo的提供者(Provider)端和消费者(Consumer)端的配置文件中添加如下配置:
<!-- Provider端配置 -->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- Consumer端配置 -->
<dubbo:registry protocol="zookeeper" address="localhost:2181"/>
-
服务发布:Provider端启动后,会将自己提供的服务发布到注册中心。Dubbo框架会将服务的元数据信息注册到Zookeeper节点中,供Consumer端进行订阅和查找。
-
服务订阅:Consumer端启动后,会向注册中心订阅自己关心的服务。Dubbo框架会从Zookeeper中获取服务的元数据信息,并缓存在本地。
-
服务发现:Consumer端在进行服务调用时,会根据服务接口和版本等信息查询本地缓存或者注册中心,获取可用的服务提供者列表。Dubbo框架会根据负载均衡策略选择一个合适的服务提供者进行调用。
口和版本等信息查询本地缓存或者注册中心,获取可用的服务提供者列表。Dubbo框架会根据负载均衡策略选择一个合适的服务提供者进行调用。
Dubbo的服务发现过程包括配置注册中心、服务发布、服务订阅和服务发现。通过使用注册中心,Dubbo能够实现服务的动态扩展和高可用性,方便开发者进行分布式服务的管理和调用。