42

Dubbo分析之Registry层-沙漏半杯

 5 years ago
source link: http://blog.51cto.com/14028890/2334040
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

share_default.jpg

在线
客服

Dubbo分析之Registry层

前言

本文分析dubbo的register层;此层封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory, Registry, RegistryService;

Registry接口

接口定义如下:

public interface Registry extends Node, RegistryService {
}

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),注销(unregister),订阅(subscribe),退订(unsubscribe)等功能;dubbo提供了多种注册方式分别是:Multicast ,Zookeeper,Redis以及Simple方式;

Multicast:Multicast注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现;

Zookeeper:Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用;

Redis:基于Redis实现的注册中心,使用 Redis的Publish/Subscribe事件通知数据变更;

Simple:Simple注册中心本身就是一个普通的Dubbo服务,可以减少第三方依赖,使整体通讯方式一致;

后面重点介绍官方推荐的Zookeeper注册方式;具体的Register是在RegistryFactory中生成的,具体看一下接口定义;

RegistryFactory接口

接口定义如下:

@SPI("dubbo")
public interface RegistryFactory {

@Adaptive({"protocol"})Registry getRegistry(URL url);

}
RegistryFactory提供了SPI扩展,默认使用dubbo,具体有哪些扩展可以查看META-INF/dubbo/internal/com.alibaba.dubbo.registry.RegistryFactory:

dubbo=com.alibaba.dubbo.registry.dubbo.DubboRegistryFactory
multicast=com.alibaba.dubbo.registry.multicast.MulticastRegistryFactory
zookeeper=com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistryFactory
redis=com.alibaba.dubbo.registry.redis.RedisRegistryFactory
已推荐的Zookeeper为实例,查看ZookeeperRegistryFactory,提供了createRegistry方法:

private ZookeeperTransporter zookeeperTransporter;

public Registry createRegistry(URL url) {
return new ZookeeperRegistry(url, zookeeperTransporter);
}
实例化ZookeeperRegistry,两个参数分别是url和zookeeperTransporter,zookeeperTransporter是操作Zookeeper的客户端组件包括:zkclient和curator两种方式

@SPI("curator")
public interface ZookeeperTransporter {

@Adaptive({Constants.CLIENT_KEY, Constants.TRANSPORTER_KEY})ZookeeperClient connect(URL url);

}
ZookeeperTransporter同样提供了SPI扩展,默认使用curator方式;接下来重点看一下Zookeeper注册中心。

Zookeeper注册中心

1.整体设计流程

在dubbo的整体设计中,可以大致查看Registry层的大致流程,首先通过RegistryFactory实例化Registry,Registry可以接收RegistryProtocol传过来的注册(register)和订阅(subscribe)消息,然后Registry通过ZKClient来向Zookeeper指定的目录下写入url信息,如果是订阅消息Registry会通过NotifyListener来通知RegitryDirctory进行更新url,最后就是Cluster层通过路由,负载均衡选择具体的提供方;

2.Zookeeper注册中心流程

官方提供了dubbo在Zookeeper中心的流程图:
div


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK