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