前言
网上关于dubbo服务暴露流程的文章挺多的,但是很多基于2.6.5版本的,并不适用2.7.x以后版本。
今天发现旧版本中,ServiceBean是实现了Spring的 ApplicationListener< ContextRefreshedEvent >,Spring IOC 容器刷新完成后会调用 onApplicationEvent 方法,开始服务暴露export。
但是截至2021年最新版(2.7.9),2.7.x版本后,ServiceBean并不实现ApplicationListener,而是增加了OneTimeExecutionApplicationContextEventListener类来专门负责dubbo的启动和停止
源码分析
OneTimeExecutionApplicationContextEventListener:
public abstract class OnceApplicationContextEventListener implements ApplicationListener, ApplicationContextAware {
// ***
public final void onApplicationEvent(ApplicationEvent event) {
if (isOriginalEventSource(event) && event instanceof ApplicationContextEvent) {
onApplicationContextEvent((ApplicationContextEvent) event);
}
}
// ***
其子类中重写了onApplicationContextEvent,指定监听ContextRefreshedEvent和ContextClosedEvent,分别负责dubboBootstrap的启动和停止
@Override
protected void onApplicationContextEvent(ApplicationContextEvent event) {
if (event instanceof ContextRefreshedEvent) {
onContextRefreshedEvent((ContextRefreshedEvent) event);
} else if (event instanceof ContextClosedEvent) {
onContextClosedEvent((ContextClosedEvent) event);
}
}
private void onContextRefreshedEvent(ContextRefreshedEvent event) {
dubboBootstrap.start();
}
private void onContextClosedEvent(ContextClosedEvent event) {
dubboBootstrap.stop();
}
在start中,进行了服务暴露
public DubboBootstrap start() {
if (started.compareAndSet(false, true)) {
// ***
// 1. export Dubbo Services
exportServices();
// Not only provider register
if (!isOnlyRegisterProvider() || hasExportedServices()) {
// 2. export MetadataService
exportMetadataService();
//3. Register the local ServiceInstance if required
registerServiceInstance();
}
referServices();
// ***
}
暴露开始了,然后还是老一套:
调用export
拼接url
向本地暴露 、向远程register暴露,都是PROXY_FACTORY.getInvoker生成代理
对应协议的实现类,例如dubbo,生成exporter,放到map中,并openServer,使用Exchanger与注册中心建立连接(netty实现)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/93715.html