dubbo中是如何使用netty的

由于公司一直用的是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) { // 如果实现是泛化服务
            interfaceClass = G
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值