由于公司一直用的是dubbo,就想看看dubbo底层是怎么使用netty的。所有的分析过程基本都写在代码的注释里
dubbo是通过spi的方式获取到各个对象的处理器的。看META-INF下的spring.handlers配置
使用的是DubboNamespaceHandler这个处理器。看下这个类:
public class DubboNamespaceHandler extends NamespaceHandlerSupport {
static {
Version.checkDuplicate(DubboNamespaceHandler.class);
}
@Override
public void init() {
registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true)); // dubbo:application
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)); // dubbo:provider
registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true)); // dubbo:consumer
registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true)); // dubbo:service
registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false)); // dubbo:reference
registerBeanDefinitionParser("annotation", new AnnotationBeanDefinitionParser());
}
}
dubbo xml文件每个对象都定义对应的处理器。
dubbo通信的时候使用的是provider和consumer。provider在对应的标签是dubbo:service, consumer对应的标签是reference,对应的类分别是ServiceBean和ReferenceBean我们分别研究。
Provider
类似xml配置如下:
<dubbo:service interface="com.dfire.soa.consumer.service.IVersionService" ref="versionService"
version="${consumer.dubbo.version}" timeout="${timeout_100ms}"/>
对应的处理器类为ServiceBean。看它的类声明,实现了ApplicationListener接口,关注了ContextRefreshedEvent事件
public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean,
ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware,
ApplicationEventPublisherAware
看这个类对ContextRefreshedEvent的处理
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (isDelay() && !isExported() && !isUnexported()) {
if (logger.isInfoEnabled()) {
logger.info("The service ready on spring started. service: " + getInterface());
}
export(); // 根据dubbo的架构图,这一步应该就是用来暴露协议的
}
}
只可能是export方法里处理了什么,看export方法
// ServiceBean.java
public void export() {
super.export();
// Publish ServiceBeanExportedEvent
publishExportEvent();
}
// ServiceConfig.java
public synchronized void export() {
// ...
if (delay != null && delay > 0) {
//...
} else {
doExport();
}
}
protected synchronized void doExport() {
// ... 各种各样的判断
if (ref instanceof GenericService) {