服务注册与发现的中心,服务的提供者将服务发布到注册中心,服务的使用着到注册中引用服务。
Dubbo的注册中心提供了多种实现,其实现是基于dubbo的spi的扩展机制的,使用着可以直接实现自己的注册中心。
@SPI("dubbo")
public interface RegistryFactory {
/**
* 连接注册中心.
* 连接注册中心需处理契约
* 1. 当设置check=false时表示不检查连接,否则在连接不上时抛出异常。
* 2. 支持URL上的username:password权限认证。
* 3. 支持backup=10.20.153.10备选注册中心集群地址。
* 4. 支持file=registry.cache本地磁盘文件缓存。
* 5. 支持timeout=1000请求超时设置。
* 6. 支持session=60000会话超时或过期设置。
* @param url 注册中心地址,不允许为空
* @return 注册中心引用,总不返回空
*/
@Adaptive({"protocol"})
RegistrygetRegistry(URL url);
}
RegistryFactory用来创建注册中心, 默认的注册中心是dubbo协议,由于阿里的注册中心并没有开源,dubbo协议注册中心只提供了一个简单实现。 开源dubbo的注册中心推荐使用zookeeper。这里我们主要去分析基于dubbo和zookeeper协议的注册中心实现及使用。
注册中心服务类图:
服务接口定义
public interface RegistryService {
void register(URL url);
void unregister(URL url);
void subscribe(URL url, NotifyListener listener);
void unsubscribe(URL url, NotifyListener listener);
List<URL> lookup(URL url);
}
Register:注册数据,比如:提供者地址,消费者地址,路由规则,覆盖规则,等数据。
注册需处理契约
1. 当URL设置了check=false时,注册失败后不报错,在后台定时重试,否则抛出异常。
2. 当URL设置了dynamic=false参数,则需持久存储,否则,当注册者出现断电等情况异常退出时,需自动删除。
3. 当URL设置了category=routers时,表示分类存储,缺省类别为providers,可按分类部分通知数据。
4. 当注册中心重启,网络抖动,不能丢失数据,包括断线自动删除数据。
5. 允许URI相同但参数不同的URL并存,不能覆盖。
Unregister:取消注册
Subscribe:订阅符合条件的已注册数据,当有注册数据变更时自动推送
订阅需处理契
1. 当URL设置了check=false时,订阅失败后不报错,在后台定时重试。
2. 当URL设置了category=routers,只通知指定分类的数据,多个分类用逗号分隔,并允许星号通配,表示订阅所有分类数据。
3. 允许以interface,group,version,classifier作为条件查询,如:interface=com.alibaba.foo.BarService&version=1.0.0
4. 并且查询条件允许星号通配,订阅所有接口的所有分组的所有版本,或:interface=*&group=*&version=*&classifier=*
5. 当注册中心重启,网络抖动,需自动恢复订阅请求
6. 允许URI相同但参数不同的URL并存,不能覆盖
7. 必须阻塞订阅过程,等第一次通知完后再返回。
Unsubscribe:取消订阅
Lookup: 查询符合条件的已注册数据,与订阅的推模式相对应,这里为拉模式,只返回一次结果