转载自: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如何使用Zookeeper作为服务注册中心,详细解释了注册流程和服务发现机制。同时,文章还提供了Zookeeper客户端配置指导及扩展实现。
1868

被折叠的 条评论
为什么被折叠?



