Ribbon – 负载均衡流程中提到,serviceId对应的AnnotationConfigApplicationContext在第一次调用的时候才创建(所以叫懒加载),那有可能造成调用的超时,那有没有办法提前加载呢?
在RibbonAutoConfiguration类中,有个RibbonApplicationContextInitializer,如果不需要懒加载,我们就需要ribbon.eager-load.enabled的值为true。
@Bean
@ConditionalOnProperty("ribbon.eager-load.enabled")
public RibbonApplicationContextInitializer ribbonApplicationContextInitializer() {
return new RibbonApplicationContextInitializer(springClientFactory(),
ribbonEagerLoadProperties.getClients());
}
RibbonApplicationContextInitializer是实现ApplicationListener,所以当上下文准备好的时候,就会调用onApplicationEvent方法,然后继续调用initialize方法,所以我们并不是说ribbon.eager-load.enabled的值设置true就可以的,还需要设置clientNames。
protected void initialize() {
if (clientNames != null) {
for (String clientName : clientNames) {
this.springClientFactory.getContext(clientName);
}
}
}
为了去掉懒加载,我的配置如下,clients可以是多个:
ribbon:
eager-load:
enabled: true
clients: eureka-provider