Dubbo:2.7.x中 provider服务暴露过程的起点

导读:本篇文章讲解 Dubbo:2.7.x中 provider服务暴露过程的起点,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

网上关于dubbo服务暴露流程的文章挺多的,但是很多基于2.6.5版本的,并不适用2.7.x以后版本。

今天发现旧版本中,ServiceBean是实现了Spring的 ApplicationListener< ContextRefreshedEvent >,Spring IOC 容器刷新完成后会调用 onApplicationEvent 方法,开始服务暴露export。

但是截至2021年最新版(2.7.9),2.7.x版本后,ServiceBean并不实现ApplicationListener,而是增加了OneTimeExecutionApplicationContextEventListener类来专门负责dubbo的启动和停止

源码分析

OneTimeExecutionApplicationContextEventListener:

public abstract class OnceApplicationContextEventListener implements ApplicationListener, ApplicationContextAware {
	// ***
    public final void onApplicationEvent(ApplicationEvent event) {
        if (isOriginalEventSource(event) && event instanceof ApplicationContextEvent) {
            onApplicationContextEvent((ApplicationContextEvent) event);
        }
    }
    // ***

其子类中重写了onApplicationContextEvent,指定监听ContextRefreshedEvent和ContextClosedEvent,分别负责dubboBootstrap的启动和停止

	@Override
    protected void onApplicationContextEvent(ApplicationContextEvent event) {
        if (event instanceof ContextRefreshedEvent) {
            onContextRefreshedEvent((ContextRefreshedEvent) event);
        } else if (event instanceof ContextClosedEvent) {
            onContextClosedEvent((ContextClosedEvent) event);
        }
    }
    
 	private void onContextRefreshedEvent(ContextRefreshedEvent event) {
        dubboBootstrap.start();
    }

    private void onContextClosedEvent(ContextClosedEvent event) {
        dubboBootstrap.stop();
    }

在start中,进行了服务暴露

public DubboBootstrap start() {
        if (started.compareAndSet(false, true)) {
            // ***
            // 1. export Dubbo Services
            exportServices();

            // Not only provider register
            if (!isOnlyRegisterProvider() || hasExportedServices()) {
                // 2. export MetadataService
                exportMetadataService();
                //3. Register the local ServiceInstance if required
                registerServiceInstance();
            }

            referServices();
            // ***
    }

暴露开始了,然后还是老一套:
调用export
拼接url
向本地暴露 、向远程register暴露,都是PROXY_FACTORY.getInvoker生成代理
对应协议的实现类,例如dubbo,生成exporter,放到map中,并openServer,使用Exchanger与注册中心建立连接(netty实现)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/93715.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!