Zookeeper client与 server通讯源码分析

转载请注明出处:https://blog.csdn.net/dhtx_wzgl/article/details/83999300

 

以dubbo 的provider注册和consumer订阅为例(下列过程默认dubbo的注册中心使用的是zookeeper)

Dubbo provider注册过程

首先从Dubbo jar包的spring.handlers中找到入口DubboNamespaceHandler;其中的ServiceBean就是处理provider的暴露和注册用的。

进入到ServiceBean看afterPropertiesSet方法,它会加载ProviderConfig、ApplicationConfig、ModuleConfig、RegistryConfig、MonitorConfig、ProtocolConfig和服务地址path,最后调用ServiceConfig的export方法。

ServiceConfig的export方法中会调用doExport方法进行暴露服务;

doExport方法前面会对一些没有加载的config再次加载,然后调用doExportUrls方法对url进行暴露。

doExportUrls-> doExportUrlsFor1Protocol

doExportUrlsFor1Protocol方法会根据url的scope配置选择暴露为本地服务还是远程服务。如果是暴露为远程服务,会调用RegistryProtocol的export方法,找到Invoker的Exporter。

RegistryProtocol#export

该方法会先通过originInvoker找到对应的注册中心和需要注册的服务url,然后将该url注册到注册中心;注册完之后还会自己订阅该服务,主要用于监听该节点的状态变化。

FailbackRegistry#register->doRegister

register方法会调用FailbackRegistry 的实现类ZookeeperRegistry的doRegister方法。

ZookeeperRegistry#doRegister会调用ZookeeperClient的实现类AbstractZookeeperClient的create方法。

AbstractZookeeperClient#create方法会根据传入的ephemeral参数选择创建临时节点还是持久化节点,dubbo的provider注册默认是传建临时节点。其中创建临时节点的方法是其子类ZkclientZookeeperClient具体实现的。

ZkclientZookeeperClient#createEphemeral会调用ZkClient的createEphemeral方法。

ZkClient#createEphemeral->create

ZkConnection#create

Zookeeper#create调用IZkConnection的实现类ZkConnection的create方法,该方法接着往下调用Zookeeper的create方法。此时会通过ClientCnxn的submitRequest方法向Zookeeper的服务端发送请求了。

ClientCnxn#submitRequest->queuePacket

ClientCnxn.SendThread#run()

该方法会调用ClientCnxnSocketNIO的doTransport方法。

接下来的逻辑就是NIO的客户端向服务端发送请求的

ClientCnxnSocketNIO#doTransport

ClientCnxnSocketNIO#doIO

SocketChannelImpl#write

Dubbo consumer注册过程

Dubbo consumer订阅服务的入口为ReferenceBean#afterPropertiesSet方法,该方法前面的逻辑和ServiceBean的afterPropertiesSet方法类似;最后会调用getObject()方法,它会直接调用ReferenceConfig的get()方法。

ReferenceConfig#get->init

ReferenceConfig#createProxy

该方法用于创建引用代理,它会在创建代理之前调用RegistryProtocol的refer方法获得需要引用的Invoker。

RegistryProtocol#refer

RegistryProtocol#doRefer

RegistryDirectory#subscribe->FailbackRegistry#subscribe

FailbackRegistry#subscribe->doSubscribe

ZookeeperRegistry#doSubscribe

该方法后续过程和provider注册一样都是创建zk 节点,只是consumer创建的是持久化节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值