注册中心扩展

扩展说明

负责服务的注册与发现。

扩展接口

  • org.apache.dubbo.registry.RegistryFactory
  • org.apache.dubbo.registry.Registry

扩展配置

  1. <!-- 定义注册中心 -->
  2. <dubbo:registry id="xxx1" address="xxx://ip:port" />
  3. <!-- 引用注册中心,如果没有配置registry属性,将在ApplicationContext中自动扫描registry配置 -->
  4. <dubbo:service registry="xxx1" />
  5. <!-- 引用注册中心缺省值,当<dubbo:service>没有配置registry属性时,使用此配置 -->
  6. <dubbo:provider registry="xxx1" />

扩展契约

RegistryFactory.java:

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

RegistryService.java:

  1. public interface RegistryService { // Registry extends RegistryService
  2. /**
  3. * 注册服务.
  4. *
  5. * 注册需处理契约:<br>
  6. * 1. 当URL设置了check=false时,注册失败后不报错,在后台定时重试,否则抛出异常。<br>
  7. * 2. 当URL设置了dynamic=false参数,则需持久存储,否则,当注册者出现断电等情况异常退出时,需自动删除。<br>
  8. * 3. 当URL设置了category=overrides时,表示分类存储,缺省类别为providers,可按分类部分通知数据。<br>
  9. * 4. 当注册中心重启,网络抖动,不能丢失数据,包括断线自动删除数据。<br>
  10. * 5. 允许URI相同但参数不同的URL并存,不能覆盖。<br>
  11. *
  12. * @param url 注册信息,不允许为空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
  13. */
  14. void register(URL url);
  15. /**
  16. * 取消注册服务.
  17. *
  18. * 取消注册需处理契约:<br>
  19. * 1. 如果是dynamic=false的持久存储数据,找不到注册数据,则抛IllegalStateException,否则忽略。<br>
  20. * 2. 按全URL匹配取消注册。<br>
  21. *
  22. * @param url 注册信息,不允许为空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
  23. */
  24. void unregister(URL url);
  25. /**
  26. * 订阅服务.
  27. *
  28. * 订阅需处理契约:<br>
  29. * 1. 当URL设置了check=false时,订阅失败后不报错,在后台定时重试。<br>
  30. * 2. 当URL设置了category=overrides,只通知指定分类的数据,多个分类用逗号分隔,并允许星号通配,表示订阅所有分类数据。<br>
  31. * 3. 允许以interface,group,version,classifier作为条件查询,如:interface=com.alibaba.foo.BarService&version=1.0.0<br>
  32. * 4. 并且查询条件允许星号通配,订阅所有接口的所有分组的所有版本,或:interface=*&group=*&version=*&classifier=*<br>
  33. * 5. 当注册中心重启,网络抖动,需自动恢复订阅请求。<br>
  34. * 6. 允许URI相同但参数不同的URL并存,不能覆盖。<br>
  35. * 7. 必须阻塞订阅过程,等第一次通知完后再返回。<br>
  36. *
  37. * @param url 订阅条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
  38. * @param listener 变更事件监听器,不允许为空
  39. */
  40. void subscribe(URL url, NotifyListener listener);
  41. /**
  42. * 取消订阅服务.
  43. *
  44. * 取消订阅需处理契约:<br>
  45. * 1. 如果没有订阅,直接忽略。<br>
  46. * 2. 按全URL匹配取消订阅。<br>
  47. *
  48. * @param url 订阅条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
  49. * @param listener 变更事件监听器,不允许为空
  50. */
  51. void unsubscribe(URL url, NotifyListener listener);
  52. /**
  53. * 查询注册列表,与订阅的推模式相对应,这里为拉模式,只返回一次结果。
  54. *
  55. * @see org.apache.dubbo.registry.NotifyListener#notify(List)
  56. * @param url 查询条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
  57. * @return 已注册信息列表,可能为空,含义同{@link org.apache.dubbo.registry.NotifyListener#notify(List<URL>)}的参数。
  58. */
  59. List<URL> lookup(URL url);
  60. }

NotifyListener.java:

  1. public interface NotifyListener {
  2. /**
  3. * 当收到服务变更通知时触发。
  4. *
  5. * 通知需处理契约:<br>
  6. * 1. 总是以服务接口和数据类型为维度全量通知,即不会通知一个服务的同类型的部分数据,用户不需要对比上一次通知结果。<br>
  7. * 2. 订阅时的第一次通知,必须是一个服务的所有类型数据的全量通知。<br>
  8. * 3. 中途变更时,允许不同类型的数据分开通知,比如:providers, consumers, routes, overrides,允许只通知其中一种类型,但该类型的数据必须是全量的,不是增量的。<br>
  9. * 4. 如果一种类型的数据为空,需通知一个empty协议并带category参数的标识性URL数据。<br>
  10. * 5. 通知者(即注册中心实现)需保证通知的顺序,比如:单线程推送,队列串行化,带版本对比。<br>
  11. *
  12. * @param urls 已注册信息列表,总不为空,含义同{@link org.apache.dubbo.registry.RegistryService#lookup(URL)}的返回值。
  13. */
  14. void notify(List<URL> urls);
  15. }

已知扩展

org.apache.dubbo.registry.support.dubbo.DubboRegistryFactory

扩展示例

Maven 项目结构:

  1. src
  2. |-main
  3. |-java
  4. |-com
  5. |-xxx
  6. |-XxxRegistryFactoryjava (实现RegistryFactory接口)
  7. |-XxxRegistry.java (实现Registry接口)
  8. |-resources
  9. |-META-INF
  10. |-dubbo
  11. |-org.apache.dubbo.registry.RegistryFactory (纯文本文件,内容为:xxx=com.xxx.XxxRegistryFactory)

XxxRegistryFactory.java:

  1. package com.xxx;
  2. import org.apache.dubbo.registry.RegistryFactory;
  3. import org.apache.dubbo.registry.Registry;
  4. import org.apache.dubbo.common.URL;
  5. public class XxxRegistryFactory implements RegistryFactory {
  6. public Registry getRegistry(URL url) {
  7. return new XxxRegistry(url);
  8. }
  9. }

XxxRegistry.java:

  1. package com.xxx;
  2. import org.apache.dubbo.registry.Registry;
  3. import org.apache.dubbo.registry.NotifyListener;
  4. import org.apache.dubbo.common.URL;
  5. public class XxxRegistry implements Registry {
  6. public void register(URL url) {
  7. // ...
  8. }
  9. public void unregister(URL url) {
  10. // ...
  11. }
  12. public void subscribe(URL url, NotifyListener listener) {
  13. // ...
  14. }
  15. public void unsubscribe(URL url, NotifyListener listener) {
  16. // ...
  17. }
  18. }

META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory:

  1. xxx=com.xxx.XxxRegistryFactory

最后修改 September 21, 2021: Bug fix miss mialbox (#953) (57cf51b)