调整下路由刷新的算法

This commit is contained in:
2025-09-01 13:59:18 +08:00
parent 132de994b1
commit 03baddbda1
2 changed files with 47 additions and 41 deletions

View File

@ -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));

View File

@ -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());
} }