Ribbon - 懶載入

大軍發表於2020-12-24

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<ApplicationReadyEvent>,所以當上下文準備好的時候,就會呼叫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

相關文章