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

 

 

 

 

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