七Dubbo各模块的层次核心接口及组件类--5Registry

七Dubbo各模块的层次核心接口及组件类--5Registry

7.5 Registry(Registry模块)

registry层,封装服务地址URL的注册与发现,以服务URL为中心,扩展接口为RegistryFactory,Registry,RegistryService。

模块 Dubbo层 各层核心接口
Service ServiceBean ReferanceBean
dubbo-config Config ServiceConfig ReferanceConfig
dubbo-RPC Proxy ServiceProxy ProxyFactory
dubbo-registry Registry RegistryFactory Registry RegistryService
dubbo-cluster Cluster Cluster Directory Router LoadBalance
dubbo-monitor Monitor
dubbo-RPC Protocol Filter Invoke Prococol Exporter
dubbo-remoting Exchange Exchanger ExchangeChannel ExchangeClient ExchangeServer
Transport Transport Channel Client Server Codec
dubbo-common Serialize

7.5.1 RegistryFactory

注册中心工厂类。

@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);

RegistryFactory是个SPI的拓展点,默认为dubbo提供了zk、multicast、dubbo的registryFactory。

image-20221012122310894

dubbo推荐使用zookeeper的注册中心。

public class ZookeeperRegistryFactory extends AbstractRegistryFactory {
	
	private ZookeeperTransporter zookeeperTransporter;
		//dubbo的@SPI机制,自动注入
    public void setZookeeperTransporter(ZookeeperTransporter zookeeperTransporter) {
		this.zookeeperTransporter = zookeeperTransporter;
	}

  //获取zookeeperRegistry的zk注册中心
	public Registry createRegistry(URL url) {
    //URL为注册中心地址;zkTransport实例,可以提供zk操作的客户端(zkclient、curator两种)
        return new ZookeeperRegistry(url, zookeeperTransporter);
    }

}
@SPI("zkclient")
public interface ZookeeperTransporter {

  //connect操作,获取zk操作客户端,目前提供zkclient和curator两种客户端类
	@Adaptive({Constants.CLIENT_KEY, Constants.TRANSPORTER_KEY})
	ZookeeperClient connect(URL url);

}

7.5.2 Registry

注册中心实例。继承自

7.5.3 RegistryService

registryService继承结构

image-20221012115601667

dubbo提供了多种注册中心,zookeeper、dubbo、Redis和multicast等。

Zookeeper:树形的目录服务,支持事件变更通知,推荐dubbo作为注册中心;

Redis:基于Redis实现的注册中心,使用Redis的publish、subscribe获取数据变更;

Multicast:没有中心节点,只要broadcast地址相同,可相互发现和订阅。

该接口定义如下API方法

public interface RegistryService {

    /**
     * 注册数据,比如:提供者地址,消费者地址,路由规则,覆盖规则,等数据。
     * 
     * 注册需处理契约:<br>
     * 1. 当URL设置了check=false时,注册失败后不报错,在后台定时重试,否则抛出异常。<br>
     * 2. 当URL设置了dynamic=false参数,则需持久存储,否则,当注册者出现断电等情况异常退出时,需自动删除。<br>
     * 3. 当URL设置了category=routers时,表示分类存储,缺省类别为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=routers,只通知指定分类的数据,多个分类用逗号分隔,并允许星号通配,表示订阅所有分类数据。<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);
posted @ 2023-03-13 14:55  LeasonXue  阅读(36)  评论(0编辑  收藏  举报