PS:dubbo启动需要注册中心,提供一个个人云zk地址:159.75.49.126:2181,还有其他组件,redis、kafka、mysql,端口是默认端口。
其实dubbo官网文档已经是比较清晰了,以下两张图,基本是核心思路。

image.png

image.png
dubbo服务生产者服务注册流程,版本:3.0.10
a、注册流程大致调用栈
// 一般dubbo依赖spring启动,spring启动流程不清楚的要另外看下
org.springframework.context.support.AbstractApplicationContext#finishRefresh
// spring事件发布
org.springframework.context.support.AbstractApplicationContext#publishEvent(org.springframework.context.ApplicationEvent)
// dubbo实现的监听器接口
org.apache.dubbo.config.spring.context.DubboDeployApplicationListener#onApplicationEvent
// 启动dubbo部署
org.apache.dubbo.config.deploy.DefaultModuleDeployer#start
// 发布dubbo接口到注册中心
org.apache.dubbo.config.ServiceConfig#export
// 这里就是主要的发布逻辑了
org.apache.dubbo.registry.integration.RegistryProtocol#export
// 将服务注册到注册中心
org.apache.dubbo.registry.support.FailbackRegistry#register
b、消费者向注册中心注册监听器,以及注册中心回调消费者过程,以zk为例
// 消费者发布接口到zk
org.apache.dubbo.registry.integration.RegistryProtocol#export
// dubbo客户端注册zk watcher监听
org.apache.dubbo.registry.zookeeper.ZookeeperRegistry#doSubscribe
// 会调到zk提供的注册监听api
org.apache.zookeeper.ZooKeeper#getData(java.lang.String, org.apache.zookeeper.Watcher, org.apache.zookeeper.data.Stat)
// 当zk节点发生修改时
org.apache.zookeeper.server.DataTree#setData
// 触发zk节点事件监听
org.apache.zookeeper.server.watch.WatchManager#triggerWatch(java.lang.String, org.apache.zookeeper.Watcher.Event.EventType, org.apache.zookeeper.server.watch.WatcherOrBitSet)
// 发送节点事件给消费者客户端
org.apache.zookeeper.server.NIOServerCnxn#process
// 消费者客户端接收到节点修改事件通知
org.apache.zookeeper.ClientCnxn.SendThread#readResponse
// 消费者客户端将通知放入等待事件队列
org.apache.zookeeper.ClientCnxn.EventThread#queueEvent(org.apache.zookeeper.WatchedEvent, java.util.Set<org.apache.zookeeper.Watcher>)
// 消费者客户端线程消费等待事件队列
org.apache.zookeeper.ClientCnxn.EventThread#run
// 消费者客户端处理节点变更事件,这个就是回调前面注册的监听器
org.apache.zookeeper.ClientCnxn.EventThread#processEvent