Dubbo之服务导出源码分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo之服务导出源码分析相关的知识,希望对你有一定的参考价值。

参考技术A 要了解服务导出做了什么,需要了解导出的目的是什么?
dubbo是一款面向接口代理的高性能RPC调用,说白了就是提供远程服务。

服务导出需要做的:简单说就是根据服务参数、服务协议构建服务URL,注册到注册中心,并启动Server。其中服务参数可以动态配置也需要监听。

1、onApplicationEvent
org.apache.dubbo.config.spring.ServiceBean#onApplicationEvent
发布ContextRefreshedEvent,进行导出服务

2、export
org.apache.dubbo.config.spring.ServiceBean#export
调用父类ServiceConfig导出,之后发布一个ServiceBeanExportedEvent

②、shouldExport检查服务是否需要导出
org.apache.dubbo.config.ServiceConfig#shouldExport

org.apache.dubbo.config.ServiceConfig#checkAndUpdateSubConfigs

1、completeCompoundConfigs
ServiceConfig中的某些属性如果是空的,那么就从ProviderConfig、ModuleConfig、ApplicationConfig中获取
①、如果配置了ProviderConfig provider,如果application、module、registries、monitor、protocols、configCenter这些属性为空的情况下,可以从provider中获取信息并赋值

③、如果ApplicationConfig application不为空,可以为registries、monitor为空的赋值
2、startConfigCenter
从配置中心获取配置,包括应用配置和全局配置

SystemConfiguration:是系统环境变量,可以在服务启动时通过-D指定参数
AbstractConfig:是通过@Service注解配置的参数
PropertiesConfiguration:是dubbo.properties文件配置的
AppExternalConfiguration和ExternalConfiguration:是在配置中心Dubbo-Admin中配置的,AppXxx是应用级别
配置优先级是:SystemConfiguration -> AppExternalConfiguration -> ExternalConfiguration -> AbstractConfig -> PropertiesConfiguration
如果放到第二个位置优先级是:SystemConfiguration -->AbstractConfig -> AppExternalConfiguration -> ExternalConfiguration -> -> PropertiesConfiguration
c、根据setXX()方法和setParameters()方法进行参数值覆盖

②、prepareEnvironment
管理台上的动态配置中心,如果是zookeeper,获取的就是/dubbo/config/dubbo/dubbo.properties节点中的内容。如果是应用级别的则获取的就是/dubbo/config/dubbo-demo-consumer-application/dubbo.properties节点中的内容(dubbo-demo-consumer-application应用名,这里是以dubbo-demo为例)

4、checkProtocol 从配置中心设置Protocol配置

10、Local、Stub、Mock
local和stub一样,不建议使用了。如果Local存根为true,则存根类为interfaceName + "Local"。如果Stub本地存根为true,则存根类为interfaceName + "Stub"

org.apache.dubbo.config.ServiceConfig#doExport

unexported表示:当前服务已经被取消了,就不需要再导出了
exported表示:已经导出了,就不再重复导出了
1、doExportUrls
org.apache.dubbo.config.ServiceConfig#doExportUrls

②、遍历protocols协议
pathKey = group/应用名/path服务名:version
例如:mygroup/dubbo-demo/org.apache.dubbo.demo.DemoService:1.0.1
ProviderMethodModel表示某一个方法、方法名所属的服务的,包含实现类,接口,以及接口中的各个方法

ApplicationModel表示应用中有哪些服务提供者和引用了哪些服务
每种协议都会导出一个单独的服务,并注册到各个注册中心
2、doExportUrlsFor1Protocol
org.apache.dubbo.config.ServiceConfig#doExportUrlsFor1Protocol

③、methods方法参数处理

⑦、scope导出方式(scope=null进行远程导出)

生成的注册服务URL是在registryURL和export参数是服务url的拼装
b、DelegateProviderMetaDataInvoker也表示服务提供者,包括了Invoker和服务的配置。是对Invoker的包裹
c、protocol.export(wrapperInvoker)这是导出的核心,使用了SPI。
使用特定的协议来对服务进行导出,这里的协议是registry,导出成功后得到一个Exporter
由于注册地址也是服务,所以会先使用RegistryProtocol进行服务注册(服务导出),然后注册(服务导出)完了之后,再使用DubboProtocol进行导出
自适应SPI会获取url
org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker#getUrl

⑩、当存在注册中心时,是先使用Registy协议注册服务,然后在使用Http协议导出服务。而没有注册中心时,是直接使用Http协议导出服务。根据服务url,讲服务的元信息存入元数据中心MetadataReportService

RegistryProtocol被ProtocolFilterWrapper包裹,ProtocolFilterWrapper被ProtocolListenerWrapper包裹(SPI原理)

1、export
org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper#export
如果协议是REGISTRY_PROTOCOL(registry)则会直接走到下一个protocol实现类ProtocolFilterWrapper。
如果不是则会使用ListenerExporterWrapper处理

②、获取providerUrl 服务提供者url

③、生成overrideSubscribeUrl,与监听有关
在服务提供者url的基础上,生成一个overrideSubscribeUrl,协议为provider://,增加参数category=configurators&check=false
overrideSubscribeUrl是用来对动态配置监听的,需要监听的服务和监听的类型(configurators, 老版本)
一个overrideSubscribeUrl对应一个OverrideListener,用来监听overrideSubscribeUrl变化事件

④、doLocalExport导出
此时服务协议是dubbo,DubboProtocol被ProtocolFilterWrapper包裹,ProtocolFilterWrapper被ProtocolListenerWrapper包裹

1、export
org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper#export
返回结果被ListenerExporterWrapper包裹

2、export
org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper#export

EchoFilter、ClassLoaderFilter、GenericFilter、ContextFilter、TraceFilter、TimeoutFilter、MonitorFilter、ExceptionFilter
返回包裹了Filter的CallbackRegistrationInvoker
3、export
org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol#export

②、register
org.apache.dubbo.registry.support.FailbackRegistry#register

在服务导出过程中,需要对动态配置中心的数据进行监听。如果发生更改,可以及时做出反映。
这里用到了Zookeeper的Watcher机制。
1、配置中心的路径与动态配置路径是不相同的,这里需要区分开来
配置中心的路径是:
①、应用:/dubbo/config/dubbo/org.apache.dubbo.demo.DemoService/dubbo.properties节点的内容
②、全局:/dubbo/config/dubbo/dubbo.properties节点的内容
2、对于动态配置的监听有版本的差别
在2.7之前,只可以对单个服务进行监听,不可以对应用监听
/dubbo/org.apache.dubbo.demo.DemoService/configurators/* 只对路径名字监听,不监听内容
在2.7之后,服务和应用都可以监听
服务: /dubbo/config/dubbo/org.apache.dubbo.demo.DemoService.configurators 节点的内容
应用: /dubbo/config/dubbo/dubbo-demo-provider-application.configurators 节点的内容
3、监听时机RegistryProtocol#export
org.apache.dubbo.registry.integration.RegistryProtocol#export

以上是关于Dubbo之服务导出源码分析的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo 源码分析 - 服务导出全过程解析

Dubbo 源码分析 - 集群容错之 Router

dubbo源码分析 之 服务本地暴露

Dubbo之服务暴露源码分析

3.dubbo源码分析之API配置二(服务提供者)

1.dubbo源码分析之dubbo项目结构