DubboBootstrapApplicationListener
DubboBootstrapApplicationListener是一个监听器,可以监听Dubbo的启动或者关闭事件,如果是启动事件,会通过DubboBootstrap启动dubbo。
1 | public class DubboBootstrapApplicationListener extends OneTimeExecutionApplicationContextEventListener |
DubboBootstrap
DubboBootstrap是dubbo启动的核心,首先它会调用initialize方法进行一些初始化操作,然后调用exportServices进行服务暴露。
在exportServices中获取所有需要暴露的服务,进行遍历,对每一个服务进行暴露,Dubbo将每一个服务封装为ServiceConfig类型,具体的暴露过程在ServiceConfig的export方法中。
1 | public class DubboBootstrap extends GenericEventListener { |
ServiceConfig
在export中,首先会初始化Metadata元数据相关信息,然后调用doExport进行服务暴露,doExport又是调用doExportUrls完成的。
在doExportUrls中,会获取注册中心的地址,因为一个服务可以支持多种协议,所以会遍历每一个协议,对每一个协议的服务进行暴露,向注册中心注册,同时会将当前的服务加入ServiceRepository容器中,服务暴露具体的过程是在doExportUrlsFor1Protocol中完成的。
doExportUrlsFor1Protocol方法中,会判断协议是否为空,如果为空,默认使用dubbo协议,然后根据协议信息构建URL。根据不同的scope会选择不同的暴露方式,包括本地暴露和远程暴露。
1 | public class ServiceConfig<T> extends ServiceConfigBase<T> { |
本地暴露
本地暴露是将服务暴露在本地的JVM中,可以看到协议是injvm:
1 | /** |
远程暴露
首先会遍历注册中心地址,因为一个服务可以向多个注册中心注册,并且判断协议是否是injvm,如果是的话不进行注册。然后为url添加动态参数和监控相关的配置,接着通过代理工厂PROXY_FACTORY生成服务的Invoker代理类,并且对Invoker进行了一层包装,包装后的类型为DelegateProviderMetaDataInvoker,最后调用PROTOCOL的export进行服务远程暴露。
1 |
|
ProxyFactory
PROXY_FACTORY是一个ProxyFactory类型的对象:
1 | private static final ProxyFactory PROXY_FACTORY = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension(); |
ProxyFactory类中使用了SPI注解,由此可知,dubbo默认使用javassist生成代理对象:
1 | "javassist") ( |
Protocol
ServiceConfig中PROTOCOL的实例化如下,可以看到是通过ExtensionLoader进行实例化的,dubbo是支持多种协议的,那么如何根据配置为不同的协议生成不同的Protocol对象,dubbo就是通过ExtensionLoader实现的:
1 | private static final Protocol PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension(); |
进入Protocol,可以看到使用@SPI注解,并且export方法中使用了@Adaptive注解,通过ExtensionLoader动态生成Protocol$Adaptive类,根据不同的类型决定使用哪种实现类,默认使用dubbo协议DubboProtocol:
1 | "dubbo") ( |
DubboProtocol
dubbo协议的实现在DubboProtocol中,export方法中是具体的服务暴露过程:
- 将Invoker又包装为了DubboExporter,加入到exporterMap
- 创建服务,最终是通过Exchangers进行的,生成了ExchangeServer对象
1 | public class DubboProtocol extends AbstractProtocol { |
Exchangers
进入到Exchangers的bind方法中,可以看到又是通过 ExtensionLoader来生成具体的扩展类的:
1 | public class Exchangers { |
Exchanger
Exchanger使用了SPI机制,默认使用HeaderExchanger:
1 | (HeaderExchanger.NAME) |
HeaderExchanger
进入到 ExtensionLoader的bind方法,调用了Transporters的bind方法进行ExchangeServer创建的:
1 | public class HeaderExchanger implements Exchanger { |
Transporters
同样使用ExtensionLoader来生成扩展类:
1 | public class Transporters { |
Transporter
Transporter使用SPI机制,默认为netty,所以底层默认使用netty网络通信:
1 | "netty") ( |
参考
dubbo版本:2.7.7