前言
目前我们的后台管理服务,因为引入的提供者太多,导致项目启动太慢,打印了很多The configBean[type:ReferenceBean] has been built.的日志,在启动过程中,Dubbo需要去初始化提供者同时需要和zookeeper建立连接,在开发和测试环境中启动速度太慢,导致开发人员每次重启需要等待很久,所以需要迫切的解决这个问题,目前有2种方案来解决这个问题,下面分别对这2种方案进行测试。
Dubbo创建提供者的日志

第一种方案
目前我们在很多的service中都引入了很多相同的提供者,考虑把所有的提供者在一个位置统一管理,这样项目中所有使用这个提供者的位置都引用同一个引用。
统一管理提供者的BaseService

使用BaseService的位置

经过测试,速度提升不高,由此判断Dubbo在初始化提供者的时候会做判断,如果该提供者已经初始化,不再进行初始化,所以在一个项目中不同的位置引用同一个提供者,不会造成重复初始化。
第二种方案
通过Spring懒加载的形式,因为我们的Dubbo版本比较低,所以并没有Dubbo相关的懒加载的配置例如:lazyInit,所以计划通过Spring的功能来实现。
配置如下
import com.ctrip.framework.apollo.build.ApolloInjector;
import com.ctrip.framework.apollo.core.enums.Env;
import com.ctrip.framework.apollo.util.ConfigUtil;
import lombok.SneakyThrows;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.annotation.Configuration;
import static com.ctrip.framework.apollo.core.enums.Env.*;
/**
* @author lwh
* @date 2023/12/22
* @description 提升启动速度
**/
@Configuration
public class LazyInitBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@SneakyThrows
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
Env apolloEnv = ApolloInjector.getInstance(ConfigUtil.class).getApolloEnv();
if (apolloEnv == DEV || apolloEnv == FAT || apolloEnv == UAT) {
for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {
beanFactory.getBeanDefinition(beanDefinitionName).setLazyInit(true);
}
}
}
}
通过在启动的过程中,修改所有Bean的元数据信息,给所有的Bean设置lazyInit属性,当然你也可以通过一些手段和配置,只给你想要的Bean进行懒加载,经过测试启动速度提升较明显,不建议生产环境使用这种方式,因为会影响性能,第一次调用会耗时。
文章讨论了如何解决Dubbo项目因过多提供者导致启动缓慢的问题,提出了两种方案:统一管理提供者和使用Spring懒加载。第一种方式效果不明显,第二种方式虽然能显著提升启动速度,但不建议在生产环境使用。
1万+

被折叠的 条评论
为什么被折叠?



