【Dubbo】Dubbo的服务注册源码分析(zookeeper和redis)

本文详细分析了Dubbo服务注册机制,重点探讨了Redis和Zookeeper作为注册中心的实现。在Redis中,服务的注册与订阅通过存储结构和有效期管理,而Zookeeper利用持久节点和会话机制保证数据一致性。Redis注册中心每个服务接口需创建一个Notifier线程,可能造成资源消耗;相比之下,Zookeeper的流程更简洁,且不会产生脏数据。
摘要由CSDN通过智能技术生成

Dubbo 服务注册机制

Dubbo所支持的注册中心

  1. Multicast

    组网广播,只可以在局域网内使用,一般只是作为测试

  2. Zookeeper (常用)

    是Apache Hadoop 的子项目,是一个树形的目录服务

  3. Redis

  4. Simple

  5. 基于Dubbo 的服务实现(SimpleRegistryService),不支持集群

Redis注册中心

  • 数据结构:如何存储服务的注册与订阅关系
  • 状态更新:当服务状态改变,如何及时更新

数据结构:

redis 注册中心使用Map存储服务发布,订阅等信息:

key:map
	key:value
	key:value
	...

发布订阅:

/dubbo/{serviceName}/providers
    {providerUrl1}:{periodTimestamp}
    {providerUrl2}:{periodTimestamp}
    ...

订阅服务:

/dubbo/{serviceName}/consumers
    {consumerUrl1}:{periodTimestamp}
    {consumerUrl2}:{periodTimestamp}
    ...
有效期:

这个value值(periodTimestamp)是一种有效期:

provider和consumer发给redis的数据会有一个当前时间+30秒的时间戳作为有效期。要是provider活consumer还“活着”,就会不断“续命”,每次都是+3# Dubbo 服务注册机制

Dubbo所支持的注册中心

  1. Multicast

    组网广播,只可以在局域网内使用,一般只是作为测试

  2. Zookeeper (常用)

    是Apache Hadoop 的子项目,是一个树形的目录服务

  3. Redis

  4. Simple

  5. 基于Dubbo 的服务实现(SimpleRegistryService),不支持集群

Redis注册中心

  • 数据结构:如何存储服务的注册与订阅关系
  • 状态更新:当服务状态改变,如何及时更新

数据结构:

redis 注册中心使用Map存储服务发布,订阅等信息:

key:map
	key:value
	key:value
	...

发布订阅:

/dubbo/{serviceName}/providers
    {providerUrl1}:{periodTimestamp}
    {providerUrl2}:{periodTimestamp}
    ...

订阅服务:

/dubbo/{serviceName}/consumers
    {consumerUrl1}:{periodTimestamp}
    {consumerUrl2}:{periodTimestamp}
    ...
有效期:

这个value值(periodTimestamp)是一种有效期:

provider和consumer发给redis的数据会有一个当前时间+30秒的时间戳作为有效期。要是provider活consumer还“活着”,就会不断“续命”,每次都是+30秒。

在这里插入图片描述

相关源码:

RedisRegistry这个类中的有个线程专门来干这个活expireExecutor

ScheduledExecutorService expireExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("DubboRegistryExpireTimer", true));
this.expirePeriod = url.getParameter(SESSION_TIMEOUT_KEY, DEFAULT_SESSION_TIMEOUT); //默认是60s
this.expireFuture = expireExecutor.scheduleWithFixedDelay(() -> {
   
    try {
   
        deferExpired(); // Extend the expiration time
    } catch (Throwable t) {
    // Defensive fault tolerance
        logger.error("Unexpected exception occur at defer expire time, cause: " + t.getMessage(), t);
    }
}, expirePeriod / 2, expirePeriod / 2, TimeUnit.MILLISECONDS); //定时每30执行一次

DEFAULT_SESSION_TIMEOUT = 60 * 1000;
可以看到有效周期默认是60s, 但是dubbo会给自动在有效期的二分之一的时间就发送一次“续命”

if (jedis.hset(key, url.toFullString(), String.valueOf(System.currentTimeMillis() + expirePeriod)) == 1) {
   
    jedis.publish(key, REGISTER);
}

奇怪?不应该是value不应该是+30s吗?

是的,没错。但是你想想每次都是30s执行一次,每次加60s,是不是距离上次的推送的value差值就是30s呢。确实优点绕,但是还是给聪明的我发现了。

发布订阅的流程
Consumer
启动:注册接口的消费者信息
启动:启动一个阻塞线程--'订阅接口线程',订阅接口的事件
接收:消费订阅的接口的事件消息
停止:删除/停止接口消费信息
停止:停止订阅线程

事件:类似topic

相关代码:
  1. RedisRegistry

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值