apache / dubbo

The java implementation of Apache Dubbo. An RPC and microservice framework.
https://dubbo.apache.org/
Apache License 2.0
40.47k stars 26.43k forks source link

DubboBootstrap 需要增加事件机制 #7150

Closed theonefx closed 3 years ago

theonefx commented 3 years ago

目前的 DubboBootstrap 并不对外通知任何事件,只能通过方法是方法按是否运行完成来判断启动成功。 对于系统间的集成,例如同 Spring Cloud Alibaba 集成,很难保证顺序以及准确性。

所以建议增加一套事件触发和监听机制,以方便下游系统的集成。

xiaoheng1 commented 3 years ago

dubbo2.7.8 中已经有事件通知机制了吧,你能举个例子详细说明下现在的问题吗?

theonefx commented 3 years ago

Spring Cloud Alibaba 集成 Dubbo 时,对 DubboBootstrap 启动完成是有一个强依赖的。 目前在 SCA 里的做法是通过 spring 的 runner 来实现,但是如果开启了异步事件处理,很可能让这个功能失效。 所以需要一个明确的 Dubbo 启动完成的通知,这样在 Spring Cloud Alibaba 中才好做后续的集成流程。

xiaoheng1 commented 3 years ago

梳理下代码,DubboBootstrap 确实没有对外提供通知接口。 我是准备加一个接口:

/**

}


在 DubboBootstrap.start 加上如下代码,例如:

public DubboBootstrap start() { if (started.compareAndSet(false, true)) { ready.set(false); dubboBootstrapLifecycleHandle(DubboBootstrapLifecycleStateType.BEFORE_START); initialize(); ...

        referServices();
        if (asyncExportingFutures.size() > 0) {
            new Thread(() -> {
                try {
                    this.awaitFinish();
                } catch (Exception e) {
                    logger.warn(NAME + " exportAsync occurred an exception.");
                }
                ready.set(true);
                dubboBootstrapLifecycleHandle(DubboBootstrapLifecycleStateType.AFTER_STAR);
                if (logger.isInfoEnabled()) {
                    logger.info(NAME + " is ready.");
                }
            }).start();
        } else {
            ready.set(true);
            dubboBootstrapLifecycleHandle(DubboBootstrapLifecycleStateType.AFTER_STAR);
            ...
        }

    }
    return this;
}


如果觉得这个方案可行,我就提交一个 pr。