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
- 獲取所有的ProviderConfig,之後在ProviderConfig不爲空的情況下,才啓動ServerConfigContainer.startServers
- providerConfigContainer.publishAllProviderConfig()中會獲取所有的ProviderConfig,之後獲取對應的Registry,之後調用Registry.init、start、registry方法進行註冊到註冊中心(unRegistry是摘除註冊)
- 除此外會進行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