Dubbo的订阅分布实现可基于注册中心,也可简单的通过直接通信的方式实现,但直接通信的方式可靠性比较低,目前大多数的实现还是需要一个注册中心。Dubbo内部实现了几个基于不同组件实现的注册中心(Redis,Nacos,Zookeeper等等),因为主要是了解订阅发布实现的原理,所以我基于最较简单的Redis为入口进行了解学习。
先简单梳理下整体流程
伪代码如下(具体代码可见2.6.x及以下的源码):
public class RedisRegistry{
// 定时调度线程池, 不断地调用deferExpired()
private final ScheduledExecutorService expireExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("DubboRegistryExpireTimer", true));
private final ScheduledFuture<?> expireFuture;
// 注册实例初始化,对于每一个dubbo角色(provider/consumer/admin)其都会有一个register实例,因为每一个dubbo角色都会需要发布/订阅的功能
public RedisRegistry() {
// 一些初始化操作
// ...
this.expireFuture = expireExecutor.scheduleWithFixedDelay(new Runnable() {
@Overrider
public void run() {
try{
deferExpired();
}catch(