调整下路由刷新的算法
This commit is contained in:
@ -19,7 +19,7 @@ public class DynamicRouteScheduler {
|
|||||||
private DiscoveryClient discoveryClient;
|
private DiscoveryClient discoveryClient;
|
||||||
|
|
||||||
// 延迟5秒后开始执行,避免与启动时的自动刷新冲突,每30秒刷新一次路由(可按需调整)
|
// 延迟5秒后开始执行,避免与启动时的自动刷新冲突,每30秒刷新一次路由(可按需调整)
|
||||||
@Scheduled(fixedRate = 30_000, initialDelay = 5_000)
|
@Scheduled(fixedRate = 60_000, initialDelay = 10_000)
|
||||||
public void refreshRoutes() {
|
public void refreshRoutes() {
|
||||||
log.info("refreshRoutes");
|
log.info("refreshRoutes");
|
||||||
publisher.publishEvent(new RefreshRoutesEvent(this));
|
publisher.publishEvent(new RefreshRoutesEvent(this));
|
||||||
|
|||||||
@ -44,6 +44,7 @@ public class DynamicRouteConfig implements RouteDefinitionLocator {
|
|||||||
@Override
|
@Override
|
||||||
public Flux<RouteDefinition> getRouteDefinitions() {
|
public Flux<RouteDefinition> getRouteDefinitions() {
|
||||||
long currentTime = System.currentTimeMillis();
|
long currentTime = System.currentTimeMillis();
|
||||||
|
try{
|
||||||
long lastTime = lastRefreshTime.get();
|
long lastTime = lastRefreshTime.get();
|
||||||
|
|
||||||
// 防抖处理:如果距离上次刷新时间太短,则不处理
|
// 防抖处理:如果距离上次刷新时间太短,则不处理
|
||||||
@ -85,6 +86,11 @@ public class DynamicRouteConfig implements RouteDefinitionLocator {
|
|||||||
}
|
}
|
||||||
log.info("路由加载完成,共加载 {} 个路由定义", routeDefinitions.size());
|
log.info("路由加载完成,共加载 {} 个路由定义", routeDefinitions.size());
|
||||||
return Flux.fromIterable(routeDefinitions);
|
return Flux.fromIterable(routeDefinitions);
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error("路由加载失败", e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -114,8 +120,8 @@ public class DynamicRouteConfig implements RouteDefinitionLocator {
|
|||||||
log.warn("No available instances for service: {}, returning default URI", serviceName);
|
log.warn("No available instances for service: {}, returning default URI", serviceName);
|
||||||
return URI.create("http://localhost");
|
return URI.create("http://localhost");
|
||||||
}
|
}
|
||||||
|
int idx = index.getAndIncrement() & Integer.MAX_VALUE;
|
||||||
ServiceInstance selected = instances.get(Math.abs(index.getAndIncrement()) % instances.size());
|
ServiceInstance selected = instances.get(idx % instances.size());
|
||||||
log.info("Selected instance: {}", selected);
|
log.info("Selected instance: {}", selected);
|
||||||
return URI.create("http://" + selected.getHost() + ":" + selected.getPort());
|
return URI.create("http://" + selected.getHost() + ":" + selected.getPort());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user