转载请注明出处: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创建的是持久化节点。