1. 注册中心概述
在Dubbo微服务体系中,注册中心是其核心组件之一。Dubbo通过注册中心实现了分布式环境中各服务之间的注册与发现,是各个分布式节点之间的纽带。其主要作用如下:
- 动态加入(服务注册/暴露):一个服务提供者通过注册中心可以动态地把自己暴露给其他消费者,无须消费者逐个去更新配置文件;
- 动态发现(服务发现):一个消费者可以动态地感知新的配置、路由规则和新的服务提供者,无须重启服务使之生效。
- 动态调整:注册中心支持参数的动态调整,新参数自动更新到所有相关服务节点;
- 统一配置:避免了本地配置导致每个服务的配置不一致问题。
Dubbo的注册中心源码在dubbo-registry
中,里面包含了很多模块(不同版本里面包含的模块不一样多):
模块名称 | 模块介绍 |
---|---|
dubbo-registry-api | 包含了注册中心的所有API和抽象实现类 |
dubbo-registry-zookeeper | 使用ZooKeeper作为注册中心的实现 |
dubbo-registry-redis | 使用Redis作为注册中心的实现 |
dubbo-registry-default | Dubbo基于内存的默认实现 |
dubbo-registry-multicast | multicast模式的服务注册与发现 |
dubbo-registry-consul | 。。。。。。 |
dubbo-registry-eureka | 。。。。。。 |
dubbo-registry-nacos | 。。。。。。 |
其他待扩充… |
在这些注册中心的实现方案当中,ZooKeeper是官方推荐的注册中心,在生产环境中有过实际使用。
Dubbo拥有良好的扩展性,用户可以基于RegistryFactory
和 Registry
自行扩展。
2. 注册中心的工作流程
注册中心的总体流程比较简单,Dubbo官方也有比较详细的说明,总体流程如下:
- 服务提供者
Provider
在启动时,会向注册中心写入自己的元数据信息,同时会订阅配置元数据信息; - 服务消费者
Consumer
在启动时,也会向注册中心写入自己的元数据信息,并订阅服务提供者、路由和配置元数据信息。 - 服务治理中心
dubbo-admin
时,会同时订阅所有消费者、服务提供者、路由和配置信息。 - 当有服务提供者离开或有新的服务提供者加入时,注册中心服务提供者目录会发生变化,变化信息会动态通知给消费者、服务治理中心。
- 当消费方发起服务调用时,会异步将调用、统计信息等上报给监控中心(dubbo-monitor-simple)
3. 注册中心的原理
3.1 ZooKeeper做注册中心的原理
ZooKeeper是树形结构的注册中心,每个节点的类型分为持久节点、持久顺序节点、临时节点、临时顺序节点。
- 持久节点:服务注册后保证节点不会丢失,注册中心重启也会存在。
- 持久顺序节点:在持久节点特性的基础上增加了节点先后顺序的能力。
- 临时节点:服务注册后连接丢失或
session
超时,注册的节点会自动被移除。- 临时顺序节点:在临时节点特性的基础上增加了节点先后顺序的能力。
Dubbo使用ZooKeeper作为注册中心时,只会创建持久节点和临时节点两种,对创建的顺序并没有要求。
具体的Dubbo服务的URL是树形结构的,如下:
- /dubbo
- service
- providers:服务提供者目录(/dubbo/service/providers),下面包含的接口有多个服务提供者URL元数据信息;
- consumers:服务消费者目录,下面包含的接口有多个服务消费者URL元数据信息;
- routers:路由配置目录,下面包含多个用于消费者路由策略URL元数据信息;
- configurators :动态配置目录,下面包含多个用于服务者动态配置的URL信息。
Dubbo使用ZooKeeper作为注册中心的配置方式如下:
<!-- 指定注册中心的位置,以下两种写法任选其一 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />