我们可以通过cloud的官方文档,或者网上搜索,一般都可以找到ribbon的饥饿加载配置是这样的:
ribbon:
eager-load:
enabled: true
clients: xxx,xxx
一般情况下,这样都能满足项目需要,但是如果我们使用cloudgateway的话,后端的服务是很多的,这样配起来相当繁琐,那么为了简化配置,我们可以仿照源码的操作进行改造
@Component
@Slf4j
public class TestRefreshRoutesListener implements ApplicationListener<ApplicationReadyEvent> {
@Autowired
private GatewayProperties gatewayProperties;
@Autowired
private SpringClientFactory springClientFactory;
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
try {
for (RouteDefinition route : gatewayProperties.getRoutes()) {
URI uri = route.getUri();
if (uri.toString().startsWith("lb")) {
Method getContext = SpringClientFactory.class.getDeclaredMethod("getContext", String.class);
getContext.setAccessible(true);
getContext.invoke(this.springClientFactory,route.getId());
log.info("执行操作");
}
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
然后源码中这样做的:
package org.springframework.cloud.netflix.ribbon;
import java.util.List;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
public class RibbonApplicationContextInitializer
implements ApplicationListener<ApplicationReadyEvent> {
private final SpringClientFactory springClientFactory;
// List of Ribbon client names
private final List<String> clientNames;
public RibbonApplicationContextInitializer(SpringClientFactory springClientFactory,
List<String> clientNames) {
this.springClientFactory = springClientFactory;
this.clientNames = clientNames;
}
protected void initialize() {
if (clientNames != null) {
for (String clientName : clientNames) {
this.springClientFactory.getContext(clientName);
}
}
}
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
initialize();
}
}
我这里就是提供了一个思路,欢迎指正