Dubbo3.x核心流程
2025-07-17 15:09:23 2 举报
Dubbo3.x源码分析
作者其他创作
大纲/内容
创建NettyServer
referServices()服务引用
DubboBootstrapApplicationListener的替代
配置中心配置文件下发(推荐)
createProxy
更新本地内存信息
STARTED
startMetadataCenter启动元数据中心
InterfaceCompatibleRegistryProtocol.export接口级远程服务导出协议
重试、负载均衡
触发
底层
exportMetadataService导出元数据服务
启动nettyClient
InterfaceCompatibleRegistryProtocol接口级远程服务引入协议
ServiceDiscovery#register注册服务实例
directory是ServiceDiscoveryRegistryDirectory
bind
那么,应用级服务注册信息什么时候真正的同步到注册中心的呢?实际上在DefaultModuleDeployer#startSync方法中,在经过了exportServices服务导出和referServices服务引用之后的onModuleStarted方法中,此时才会进行应用级服务数据的真正注册。
InvokerInvocationHandler#invoke()
使用javassist和jdk动态代理技术
ServiceDiscoveryRegistry#doSubscribe
接口级别的服务引入
DefaultModuleDeployer#initialize方法初始化导出/引用模块的服务
registry.register方法将消费者注册信息url注册到注册中心
ServiceDiscoveryMigrationInvoker
RegistryProtocol.export应用级远程服务导出协议
仅更新内存信息
MigrationRuleListener迁移规则监听器
ClusterInvoker
组装url
根据迁移规则
ReferenceConfigBase.get
directory.subscribe方法进行接口级服务发现、引入并订阅服务
directory.buildRouterChain方法构建服务调用路由链
根据映射到注册中心找
DefaultModuleDeployer.prepare
ServiceInstanceMetadataUtils#refreshMetadataAndInstance定期(30s)刷新服务实例元数据
exportServices()服务导出
DefaultModuleDeployer.start
本地导出
更新Invoker
createServer
元数据中心
注意APPLICATION_FIRST会进行双引入
Invoker
InterfaceCompatibleRegistryProtocol.getInvoker
这里不是FilterChain,directory是RegistryDirectory
getMigrationInvoker获取可迁移Invoker
监听
loadRegistries加载注册中心地址
ZookeeperRegistry#doSubscribe
开始
启动参数配置
toInvokers将URL转换为Invoker
DubboDeployApplicationListener
genCompatibleRegistries获取兼容的双注册地址
APPLICATION_FIRST(应用级优先)
refreshInvoker刷新invoker
ServiceInstancesChangedListener#onEvent
Spring.finishRefresh
proxyFactory.getProxy(invoker)生成代理类
这里的思路是根据获取到的服务实例信息,选择其中一个服务实例进行连接,获取其上的获取服务接口元数据信息;或者是连接到元数据中心,获取一个服务实例的接口元数据信息(假设服务实例的revesion也就是元数据信息是一致的)
主动调用
startConfigCenter读取配置(本地、配置中心等)
本地文件配置
javassist技术生成
ServiceDiscoveryRegistry
ServiceBean实例
手动调用
DubboConfigApplicationListener比DubboDeployApplicationListener更早触发
serviceNameMapping#getAndListen从元数据中心获取当前服务接口映射的服务提供者服务名列表
Netty请求/响应
Protocol.refer
initServiceMetadata初始化服务元数据
设置启动状态
onModuleStarted
@DubboService
当前版本可用的监听器仅一个MigrationRuleListener,它用于通过动态更改规则来控制迁移行为,同时它的onRefer方法才是真正的服务引入的方法
MetadataServiceNameMapping.map将应用级服务接口到服务名的映射关系发布到元数据中心
Protocol.export
Zookeeper注册中心
发布 ContextRefreshedEvent事件
connect连接服务端
publishServiceDefinition发布服务元数据信息
生成
RegistryProtocol#getServiceDiscoveryInvoker
saveProperties方法更新缓存文件
ReferenceAnnotationBeanPostProcessor#postProcessBeanFactory
doExportUrls()导出服务url
DubboConfigApplicationListener加载Dubbo配置
遍历调用所有RegistryProtocolListener.onRefer方法,用于更改invoker
RegistryProtocol应用级远程服务引入协议
DubboProtocol
serviceDiscovery.getInstances获取服务实例信息
doCreateInvoker
DubboProtocol.export
MigrationInvoker
远程导出
startSync
registerService
发布DubboConfigInitEvent事件
类比DubboBootstrapApplicationListener中的start
AbstractRegistry#notify通知更新
registerServiceInstance注册服务实例
refreshInstance刷新内存服务实例
当注册中心由于网络抖动而订阅失败时,至少可以返回现有的缓存的URL
publishAll定时发布元数据到元数据中心
ServiceDiscoveryRegistryDirectory#notify通知服务更新
refreshInterfaceInvoker
AbstractServiceDiscovery#getRemoteMetadata获取远程服务接口配置元数据信息
调用cluster.join方法进行集群容错能力包装
默认情况下,客户端为饿加载,客户端与服务端的连接,在消费者客户端启动引用服务的时候就已经建立了,即服务提供者url转换为invoker的时候,就已经建立了连接。
这里的registry是ServiceDiscoveryRegistry,注意的是,应用级服务引入的服务消费者url将不会注册到注册中心,所以这里不会进行注册
addListenerAndNotify添加监听器并且通知ServiceDiscoveryRegistryDirectory
directory.subscribe方法进行应用级服务发现、引入并订阅服务
doExportUrlsFor1Protocol多协议多注册中心导出服务
exportRemote远程导出
migrateToXXXInvoker
exported
迁移规则
init
refreshServiceDiscoveryInvoker
MigrationInvoker#invoke决策调用Invoker
register注册服务到注册中心
interceptInvoker
消费者能发现远程服务提供方的地址列表
这里的registry是ZookeeperRegistry
DefaultApplicationDeployer#initialize方法初始化并启动应用程序实例
它可用于选择不同的Invoker执行调用,用于应用级服务发现和接口级服务发现之间的迁移,以及实现灰度调用
ZookeeperRegistry
Protocol
注册
openServer
RegistryDirectory#notify
应用级别的服务引入
服务提供者Invoker#invoke发起RPC调用
getServiceUrlsCache获取服务提供者url缓存
MigrationRuleHandler#doMigrate执行迁移
subscribeURLs方法执行真正的订阅
FORCE_APPLICATION(强制应用级)
doRegister
FORCE_INTERFACE(强制接口级)
CopyOfFilterChainNode#invoke过滤器链式调用
parseMetadata解析服务元数据
notify
ClusterInvoker#doInvoke
监听到变更
0 条评论
下一页