dubbo服务暴露流程

整体流程:

 

标签管理:com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler

public class DubboNamespaceHandler extends NamespaceHandlerSupport {

    static {
        Version.checkDuplicate(DubboNamespaceHandler.class);
    }

    @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:com.alibaba.dubbo.config.spring.ServiceBean

serviceBean在容器创建完对象后调用 afterPropertiesSet方法,还会在IOC容器创建启动完成后调用onApplicationEvent方法

// 主要实现了InitializingBean 和 ApplicationListener两个接口
public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean,
        ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware,
        ApplicationEventPublisherAware {
    ......

}


// 只有一个主要的方法:属性赋值后会回调该方法
public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}

// 所用IOC容器中所有对象创建完成后会回调该方法
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
    void onApplicationEvent(E event);
}

调用afterPropertiesSer方法给每个对象赋值:

// config为provide和consume的配置文件标签内容

for (ApplicationConfig config : applicationConfigMap.values()) {
    if (config.isDefault() == null || config.isDefault().booleanValue()) {
    	if (applicationConfig != null) {
	    throw new IllegalStateException("Duplicate application configs: " + applicationConfig + " and " + config);
	}
	applicationConfig = config;
    }
}

......

moduleConfig = config;

registryConfigs.add(config);

monitorConfig = config;

protocolConfigs.add(config);

......

 调用onApplicationEvent方法来暴露服务:SpringIOC容器创建完成后触发的contextRefreshedEvent事件,export暴露服务

// export 非延迟的,需要暴露但是还未暴露的服务
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
    if (isDelay() && !isExported() && !isUnexported()) {
	if (logger.isInfoEnabled()) {
	    logger.info("The service ready on spring started. service: " + getInterface());
	}
	export();
    }
}

export方法会进行一系列参数校验,然后调用到ServiceConfig的doExportUrls方法:工厂模式

private void doExportUrls() {
    List<URL> registryURLs = loadRegistries(true);
    for (ProtocolConfig protocolConfig : protocols) {
	doExportUrlsFor1Protocol(protocolConfig, registryURLs);
    }
}


......

//doExportUrlsFor1Protocol方法核心内容
Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass,  registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);
Exporter<?> exporter = protocol.export(wrapperInvoker);
exporters.add(exporter);

protocol的export,redistryProtocol的export  ......

// 例如:RegistryProtocol的export方法
//ProviderConsumerRegTable : 提供者和消费者的注册表
// 入参:originInvoker提供者,registryUrl注册中心的地址,registeredProviderUrl提供者的地址
ProviderConsumerRegTable.registerProvider(originInvoker, registryUrl, registeredProviderUrl);

DubboProtocol的export

public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
   ......
   // 打开服务器,即启动netty服务器,监控注册的端口
   openServer(url);
   optimizeSerialization(url);
   ......
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值