dubbo服务启动

DubboBootstrapApplicationListener

  private void onContextRefreshedEvent(ContextRefreshedEvent event) {
        this.dubboBootstrap.start();
    }

DubboBootstrap

DubboBootstrap主要处理dubbo所有的配置信息,功能主要有:

  • 持有ConfigManager、Environment对象并且对其初始化,这两个对象都是与配置相关的;
  • 更新配置中心配置对象ConfigCenterConfig的属性值;
  • 加载元数据中心对象;
  • 检查各个配置对象的属性值是否合法;
  • 注册java的关闭钩子;
  • 服务端服务的暴露。
public DubboBootstrap start() {
         //started是AtomicBoolean类型,只初始化一次
        if (this.started.compareAndSet(false, true)) {
            this.ready.set(false);
            this.initialize();    //1.调用初始化方法
            if (this.logger.isInfoEnabled()) {
                this.logger.info(NAME + " is starting...");
            }

            this.exportServices();    //2.暴露服务
            if (!this.isOnlyRegisterProvider() || this.hasExportedServices()) {
                this.exportMetadataService();   //3.暴露本地元数据服务
                this.registerServiceInstance();  //4.将dubbo实例注册到专用于服务发现的注册中心
            }

            this.referServices();
            if (this.asyncExportingFutures.size() > 0) {
                (new Thread(() -> {
                    try {
                        this.awaitFinish();
                    } catch (Exception var2) {
                        this.logger.warn(NAME + " exportAsync occurred an exception.");
                    }

                    this.ready.set(true);
                    if (this.logger.isInfoEnabled()) {
                        this.logger.info(NAME + " is ready.");
                    }

                })).start();
            } else {
                this.ready.set(true);
                if (this.logger.isInfoEnabled()) {
                    this.logger.info(NAME + " is ready.");
                }
            }

            if (this.logger.isInfoEnabled()) {
                this.logger.info(NAME + " has started.");
            }
        }

        return this;
    }

initialize

服务端启动的时候,dubbo在start方法中调用initialize方法做初始化,而客户端启动的时候会跳过initialize方法。

 public void initialize() {
        if (this.initialized.compareAndSet(false, true)) {
            ApplicationModel.initFrameworkExts();
            this.startConfigCenter();
            this.loadRemoteConfigs();
            this.checkGlobalConfigs();
            this.startMetadataCenter();
            this.initMetadataService();
            this.initMetadataServiceExports();
            this.initEventListener();
            if (this.logger.isInfoEnabled()) {
                this.logger.info(NAME + " has been initialized!");
            }
        }
    }

exportServices

    private void exportServices() {
        this.configManager.getServices().forEach((sc) -> {
            ServiceConfig serviceConfig = (ServiceConfig)sc;
            serviceConfig.setBootstrap(this);
            if (this.exportAsync) {
                ExecutorService executor = this.executorRepository.getServiceExporterExecutor();
                Future<?> future = executor.submit(() -> {
                    sc.export();  //1.暴露服务
                    this.exportedServices.add(sc);
                });
                this.asyncExportingFutures.add(future);
            } else {
                sc.export();
                this.exportedServices.add(sc);
            }

        });
    }

referServices

 private void referServices() {
        if (this.cache == null) {
            this.cache = ReferenceConfigCache.getCache();
        }

        this.configManager.getReferences().forEach((rc) -> {
            ReferenceConfig referenceConfig = (ReferenceConfig)rc;
            referenceConfig.setBootstrap(this);
            if (rc.shouldInit()) {
                if (this.referAsync) {
                    CompletableFuture<Object> future = ScheduledCompletableFuture.submit(this.executorRepository.getServiceExporterExecutor(), () -> {
                        return this.cache.get(rc);
                    });
                    this.asyncReferringFutures.add(future);
                } else {
                    this.cache.get(rc);
                }
            }

        });
    }

ConfigManager

ConfigManager存储了所有dubbo的配置对象:RegistryConfig、ConsumerConfig、ModuleConfig、ProtocolConfig、ProviderConfig、ApplicationConfig、MonitorConfig。
类似于一个本地的配置中心,如果要查询配置信息,访问ConfigManager获取对应的配置对象即可,任何配置对象修改了,都要刷新ConfigManager,比如ApplicationConfig修改了属性值,便会调用refreshAll方法修改ConfigManager。
在dubbo中,一般访问ConfigManager,是使用ApplicationModel.getConfigManager()通过SPI获取对象的。

Environment

Environment主要处理的与系统配置相关,比如Java系统配置,以及配置中心的配置。
获取Environment对象,是通过ApplicationModel.getEnvironment()得到。

重新启动Dubbo服务的方法有多种。首先,你可以检查服务端和客户端是否都报错了。如果是这样,可能是服务断线导致的问题。你可以尝试重新连接服务以解决此问题。另外,如果你在使用jdk1.8下启动dubbo-admin时遇到了报错问题,你可以尝试下载dubbo源码并进行修改重新编译打包发布解决这个问题。此外,你还可以考虑升级Daojia自有dubbo版本到3.0.2-SNAPSHOT或以上版本,这可能会解决一些问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Dubbo服务重启后不停报错[DUBBO] disconected from 问题原因解析](https://blog.csdn.net/qq_38975553/article/details/104494713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [解决dubbo-admin在jdk1.8下启动报错](https://download.csdn.net/download/u010781073/10121031)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [dubbo如何平滑重启](https://blog.csdn.net/m0_67401228/article/details/126328123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值