Dubbo注册中心

本文介绍了Dubbo如何使用Zookeeper作为服务注册中心,详细解释了注册流程和服务发现机制。同时,文章还提供了Zookeeper客户端配置指导及扩展实现。

转载自:https://blog.youkuaiyun.com/qq924862077/article/details/79652558

  
  目前Dubbo官方提供的注册中心有Multicast、Zookeeper、Redis和Simple注册中心,官方推荐使用Zookeeper作为生产环境的注册中心。
  Dubbo官方也提供了扩展机制,开发人员可以根据自己的需要遵守一定的扩展规范开发自己的注册中心,扩展接口主要有如下几个接口:

  • com.alibaba.dubbo.registry.RegistryFactory
  • com.alibaba.dubbo.registry.Registry
  • com.alibaba.dubbo.registry.NotifyListener

@SPI("dubbo")
public interface RegistryFactory {
    /**
     * 连接注册中心.
     * 
     * 连接注册中心需处理契约:<br>
     * 1. 当设置 check=false 时表示不检查连接,否则在连接不上时抛出异常。<br>
     * 2. 支持URL上的 username:password 权限认证。<br>
     * 3. 支持 backup=10.20.153.10 备选注册中心集群地址。<br>
     * 4. 支持 file=registry.cache 本地磁盘文件缓存。<br>
     * 5. 支持 timeout=1000 请求超时设置。<br>
     * 6. 支持 session=60000 会话超时或过期设置。<br>
     * 
     * @param url 注册中心地址,不允许为空
     * @return 注册中心引用,总不返回空
     */
    @Adaptive({"protocol"})
    Registry getRegistry(URL url); 
}

  Registry接口继承了RegistryService接口:

public interface RegistryService { // Registry extends RegistryService 
    /**
     * 注册数据,比如 provider service, consumer address, route rule, override rule and other data.
     * 
     * 注册需处理契约:<br>
     * 1. 当URL设置了 check=false 时,注册失败后不报错,在后台定时重试,否则抛出异常。<br>
     * 2. 当URL设置了 dynamic=false 参数,则需持久存储,否则,当注册者出现断电等情况异常退出时,需自动删除。<br>
     * 3. 当URL设置了 category=overrides 时,表示分类存储,缺省类别为providers,可按分类部分通知数据。<br>
     * 4. 当注册中心重启,网络抖动,不能丢失数据,包括断线自动删除数据。<br>
     * 5. 允许URI相同但参数不同的URL并存,不能覆盖。<br>
     * 
     * @param url 注册信息,不允许为空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     */
    void register(URL url);
 
    /**
     * 取消注册服务.
     * 
     * 取消注册需处理契约:<br>
     * 1. 如果是dynamic=false的持久存储数据,找不到注册数据,则抛IllegalStateException,否则忽略。<br>
     * 2. 按全URL匹配取消注册。<br>
     * 
     * @param url 注册信息,不允许为空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     */
    void unregister(URL url);
 
    /**
     * 订阅服务.
     * 
     * 订阅需处理契约:<br>
     * 1. 当URL设置了check=false时,订阅失败后不报错,在后台定时重试。<br>
     * 2. 当URL设置了category=overrides,只通知指定分类的数据,多个分类用逗号分隔,并允许星号通配,表示订阅所有分类数据。<br>
     * 3. 允许以interface,group,version,classifier作为条件查询,如:interface=com.alibaba.foo.BarService&version=1.0.0<br>
     * 4. 并且查询条件允许星号通配,订阅所有接口的所有分组的所有版本,或:interface=*&group=*&version=*&classifier=*<br>
     * 5. 当注册中心重启,网络抖动,需自动恢复订阅请求。<br>
     * 6. 允许URI相同但参数不同的URL并存,不能覆盖。<br>
     * 7. 必须阻塞订阅过程,等第一次通知完后再返回。<br>
     * 
     * @param url 订阅条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     * @param listener 变更事件监听器,不允许为空
     */
    void subscribe(URL url, NotifyListener listener);
 
    /**
     * 取消订阅服务.
     * 
     * 取消订阅需处理契约:<br>
     * 1. 如果没有订阅,直接忽略。<br>
     * 2. 按全URL匹配取消订阅。<br>
     * 
     * @param url 订阅条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     * @param listener 变更事件监听器,不允许为空
     */
    void unsubscribe(URL url, NotifyListener listener);
 
    /**
     * 查询注册列表,与订阅的推模式相对应,这里为拉模式,只返回一次结果。
     * 
     * @see com.alibaba.dubbo.registry.NotifyListener#notify(List)
     * @param url 查询条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     * @return 已注册信息列表,可能为空,含义同{@link com.alibaba.dubbo.registry.NotifyListener#notify(List<URL>)}的参数。
     */
    List<URL> lookup(URL url);
 
}
public interface NotifyListener { 
    /**
     * 当收到服务变更通知时触发。
     * 
     * 通知需处理契约:<br>
     * 1. 总是以服务接口和数据类型为维度全量通知,即不会通知一个服务的同类型的部分数据,用户不需要对比上一次通知结果。<br>
     * 2. 订阅时的第一次通知,必须是一个服务的所有类型数据的全量通知。<br>
     * 3. 中途变更时,允许不同类型的数据分开通知,比如:providers, consumers, routes, overrides,允许只通知其中一种类型,但该类型的数据必须是全量的,不是增量的。<br>
     * 4. 如果一种类型的数据为空,需通知一个empty协议并带category参数的标识性URL数据。<br>
     * 5. 通知者(即注册中心实现)需保证通知的顺序,比如:单线程推送,队列串行化,带版本对比。<br>
     * 
     * @param urls 已注册信息列表,总不为空,含义同{@link com.alibaba.dubbo.registry.RegistryService#lookup(URL)}的返回值。
     */
    void notify(List<URL> urls);
 
}

  Dubbo可以使用Zookeeper作为注册中心,注册流程如下:
  1. 服务提供者启动时: 向 /dubbo/xxx.xxx.xxxService/providers 目录下写入自己的 URL 地址
  2. 服务消费者启动时: 订阅 /dubbo/xxx.xxx.xxxService/providers 目录下的提供者 URL 地址。并向 /dubbo/xxx.xxx.xxxService/consumers 目录下写入自己的 URL 地址
  3. 监控中心启动时: 订阅 /dubbo/xxx.xxx.xxxService 目录下的所有提供者和消费者 URL 地址。

  使用时需要在 provider 和 consumer 中增加 zookeeper 客户端 jar 包依赖,Dubbo 支持 zkclient 和 curator 两种 Zookeeper 客户端实现。
  从 2.2.0 版本开始缺省为 zkclient 实现,以提升 zookeeper 客户端的健状性。缺省配置:<dubbo:registry ... client="zkclient" />或:dubbo.registry.client=zkclient或:zookeeper://10.20.153.10:2181?client=zkclient
  从 2.3.0 版本开始支持可选 curator 实现。如果需要改为 curator 实现,需要配置:
<dubbo:registry ... client="curator" />或:dubbo.registry.client=curator或:zookeeper://10.20.153.10:2181?client=curator

  Zookeeper地址配置:<dubbo:registry address="zookeeper://10.20.153.10:2181" /><dubbo:registry protocol="zookeeper" address="10.20.153.10:2181" />,当有多个zk地址时:<dubbo:registry address="zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181" /><dubbo:registry protocol="zookeeper" address="10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181" />

  同一Zookeeper,分成多组注册中心时要如下配置:

<dubbo:registry id="chinaRegistry" protocol="zookeeper" address="10.20.153.10:2181" group="china" />
<dubbo:registry id="intlRegistry" protocol="zookeeper" address="10.20.153.10:2181" group="intl" />

  注意:

  • 当提供者出现断电等异常停机时,注册中心能自动删除提供者信息
  • 当注册中心重启时,能自动恢复注册数据,以及订阅请求
  • 当会话过期时,能自动恢复注册数据,以及订阅请求
  • 当设置 <dubbo:registry check="false" /> 时,记录失败注册和订阅请求,后台定时重试
  • 可通过 <dubbo:registry username="admin" password="1234" /> 设置 zookeeper 登录信息
  • 可通过 <dubbo:registry group="dubbo" /> 设置 zookeeper 的根节点,不设置将使用无根树
  • 支持 * 号通配符 <dubbo:reference group="*" version="*" />,可订阅服务的所有分组和所有版本的提供者

  Zookeeper注册中心相关的实现类如下:

org.apache.dubbo.registry.zookeeper.ZookeeperRegistryFactory
org.apache.dubbo.registry.zookeeper.ZookeeperRegistry

### Dubbo 注册中心密码规则与特殊字符支持 Dubbo 注册中心的密码规则通常由具体的实现方式决定,例如使用 ZooKeeper、Consul 或其他注册中心时,密码规则可能依赖于这些第三方服务的配置和限制。以下是对是否允许特殊字符 `'!'` 的分析: - **ZooKeeper 的密码规则**:如果 Dubbo 使用 ZooKeeper 作为注册中心,ZooKeeper 并未对密码中的特殊字符进行严格限制[^1]。因此,在 ZooKeeper 中,密码可以包含 `'!'` 等特殊字符,但需要注意的是,某些客户端工具或脚本可能会对特殊字符进行转义处理,建议在配置文件中明确指定密码并避免直接在命令行中输入。 - **Dubbo 配置文件的安全性**:Dubbo 的配置文件(如 `dubbo.properties` 或 XML 配置)支持定义注册中心的连接信息和认证凭证。当密码中包含特殊字符时,应确保正确转义或使用引号包裹以避免解析错误。例如: ```properties dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.registry.username=admin dubbo.registry.password='Your!ComplexPassword' ``` - **服务消费者与提供者的缓存机制**:即使注册中心不可用,Dubbo 的服务消费者仍然可以通过本地缓存继续访问服务提供者[^2]。这表明注册中心的短暂故障不会影响现有服务调用,但在更新或新增服务时可能需要重新连接注册中心。 - **优雅停机与安全性**:Dubbo 在服务停止时会通过 JDK 的 ShutdownHook 实现优雅停机[^4]。在此过程中,服务提供者会标记为不可用,并等待线程池中的任务完成。这种机制有助于减少因强制关闭导致的数据丢失或不一致问题,从而间接提升密码管理的安全性。 ### 示例代码 以下是一个完整的 Dubbo 配置示例,展示如何在配置文件中设置包含特殊字符的密码: ```properties # Dubbo 注册中心配置 dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.registry.username=admin dubbo.registry.password='Your!ComplexPassword' # 服务提供者配置 dubbo.protocol.name=dubbo dubbo.protocol.port=20880 ``` ### 注意事项 - 如果使用命令行工具操作注册中心(如 ZooKeeper CLI),需注意特殊字符 `'!'` 可能会被 Shell 解释为历史命令引用。建议将密码用引号包裹以避免解析错误。 - 在生产环境中,推荐通过环境变量或密钥管理系统(如 Vault)传递敏感信息,而不是直接写入配置文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值