Sofaboot之SofaBootRpcStartEvent/SofaBootRpcStartAfterEvent

    Sofa rpc结合springboot之后,定义了SofaBootRpcStartEvent/SofaBootRpcStartAfterEvent事件。

    List-1

public class SofaBootRpcStartEvent extends ApplicationContextEvent {

    public SofaBootRpcStartEvent(ApplicationContext applicationContext) {
        super(applicationContext);
    }
}

public class SofaBootRpcStartAfterEvent extends ApplicationContextEvent {

    public SofaBootRpcStartAfterEvent(ApplicationContext applicationContext) {
        super(applicationContext);
    }
}

    什么时候会触发这俩个事件呢?

    如下List-2,实现了ReadinessCheckCallback,在Sofa rpc启动完成后,会调用ReadinessCheckCallback的onHealthy方法,如下,会发布SofaBootRpcStartEvent、SofaBootRpcStartAfterEvent事件。

    List-2

public class RpcAfterHealthCheckCallback implements ReadinessCheckCallback, PriorityOrdered {

    /**
     * 健康检查
     *
     * @param applicationContext Spring 上下文
     * @return 健康检查结果
     */
    @Override
    public Health onHealthy(ApplicationContext applicationContext) {
        Health.Builder builder = new Health.Builder();

        //rpc 开始启动事件监听器
        applicationContext.publishEvent(new SofaBootRpcStartEvent(applicationContext));

        //rpc 启动完毕事件监听器
        applicationContext.publishEvent(new SofaBootRpcStartAfterEvent(applicationContext));

        return builder.status(Status.UP).build();
    }

    @Override
    public int getOrder() {
        return PriorityOrdered.LOWEST_PRECEDENCE;
    }
}

    此外还有ApplicationContextRefreshedListener也会触发这俩个事件,但是是在ReadinessCallback没有的情况下,如下List-3

    List-3

public class ApplicationContextRefreshedListener implements
                                                ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        ApplicationContext applicationContext = event.getApplicationContext();
        //rpc 开始启动事件监听器
        applicationContext.publishEvent(new SofaBootRpcStartEvent(applicationContext));
        //rpc 启动完毕事件监听器
        applicationContext.publishEvent(new SofaBootRpcStartAfterEvent(applicationContext));
    }
}

@Bean
@ConditionalOnMissingClass({ "com.alipay.sofa.healthcheck.startup.ReadinessCheckCallback" })
@ConditionalOnClass(SofaBootRpcProperties.class)
public ApplicationContextRefreshedListener applicationContextRefreshedListener() {
    return new ApplicationContextRefreshedListener();
}

    ApplicationContext关闭的时候,会关闭spring上下文,首先调用ProviderConfigContainer.unExportAllProviderConfig(),之后调用ServerConfigContainer.closeAllServer()

    List-4

public class ApplicationContextClosedListener implements ApplicationListener {
    private final ProviderConfigContainer providerConfigContainer;
    private final ServerConfigContainer   serverConfigContainer;

    public ApplicationContextClosedListener(ProviderConfigContainer providerConfigContainer,
                                            ServerConfigContainer serverConfigContainer) {
        this.providerConfigContainer = providerConfigContainer;
        this.serverConfigContainer = serverConfigContainer;
    }

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if ((event instanceof ContextClosedEvent) || (event instanceof ContextStoppedEvent)) {
            providerConfigContainer.unExportAllProviderConfig();
            serverConfigContainer.closeAllServer();
        }
    }
}

    SofaBootRpcStartListener中,如下List-5

  1. 获取所有的ProviderConfig,之后在ProviderConfig不为空的情况下,才启动ServerConfigContainer.startServers
  2. providerConfigContainer.publishAllProviderConfig()中会获取所有的ProviderConfig,之后获取对应的Registry,之后调用Registry.init、start、registry方法进行注册到注册中心(unRegistry是摘除注册)
  3. 除此外会进行Dubbo服务的暴露

    List-5

@Override
public void onApplicationEvent(SofaBootRpcStartEvent event) {
    //choose disable metrics lookout
    disableLookout();

    //extra info
    processExtra(event);

    //start fault tolerance
    faultToleranceConfigurator.startFaultTolerance();

    Collection<ProviderConfig> allProviderConfig = providerConfigContainer
        .getAllProviderConfig();
    if (!CollectionUtils.isEmpty(allProviderConfig)) {
        //start server
        serverConfigContainer.startServers();
    }

    //set allow all publish
    providerConfigContainer.setAllowPublish(true);

    //register registry
    providerConfigContainer.publishAllProviderConfig();

    //export dubbo
    providerConfigContainer.exportAllDubboProvideConfig();
}

    List-5中只有ProviderConfig的集合不为空的情况下才会启动server,这是不是就是平时遇到的如果没有rpc配置,是不会启动对应的rpc.port的?待验证

HealthChecker

ComponentHealthChecker

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章