dubbo服务暴露流程
IOC容器启动过程中spring加载配置文件完成初始化过程中,dubbo标签处理器会解析标签并分装成对应的组件
com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
@Override
public void init() {
registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
registerBeanDefinitionParser("annotation", new AnnotationBeanDefinitionParser());
}
其中serviceBean.class实现了InitializingBean 、ApplicationListener 这两个接口,实现了以下2个方法
// 监听ContextRefreshedEvent事件:IOC容器刷新完成,即所有对象创建完成,会调用
public void onApplicationEvent(ContextRefreshedEvent event) {
}
// serviceBean容器创建完成对象后调用:属性设置完之后会回调这个方法
public void afterPropertiesSet() throws Exception {
}
之后的流程,可以debug这2个方法具体看下,特别是onApplicationEven中的export()方法
服务暴露关键代码:
com.alibaba.dubbo.registry.integration.RegistryProtocol#doLocalExport
// 启动netty服务器,监听对应端口的dubbo服务
com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#openServer(基于netty的服务暴露)
com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#createServer
注册表:com.alibaba.dubbo.registry.support.ProviderConsumerRegTable
dubbo服务的注册表信息:每一个dubbo服务已经对应的url信息会保存在注册表中
rul地址,已经对应的服务执行器信息
public class ProviderConsumerRegTable {
public static ConcurrentHashMap<String, Set<ProviderInvokerWrapper>> providerInvokers = new ConcurrentHashMap<String, Set<ProviderInvokerWrapper>>();
public static ConcurrentHashMap<String, Set<ConsumerInvokerWrapper>> consumerInvokers = new ConcurrentHashMap<String, Set<ConsumerInvokerWrapper>>();
}