调整下路由刷新的算法
This commit is contained in:
@ -19,7 +19,7 @@ public class DynamicRouteScheduler {
|
||||
private DiscoveryClient discoveryClient;
|
||||
|
||||
// 延迟5秒后开始执行,避免与启动时的自动刷新冲突,每30秒刷新一次路由(可按需调整)
|
||||
@Scheduled(fixedRate = 30_000, initialDelay = 5_000)
|
||||
@Scheduled(fixedRate = 60_000, initialDelay = 10_000)
|
||||
public void refreshRoutes() {
|
||||
log.info("refreshRoutes");
|
||||
publisher.publishEvent(new RefreshRoutesEvent(this));
|
||||
|
||||
@ -44,47 +44,53 @@ public class DynamicRouteConfig implements RouteDefinitionLocator {
|
||||
@Override
|
||||
public Flux<RouteDefinition> getRouteDefinitions() {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
long lastTime = lastRefreshTime.get();
|
||||
try{
|
||||
long lastTime = lastRefreshTime.get();
|
||||
|
||||
// 防抖处理:如果距离上次刷新时间太短,则不处理
|
||||
if (currentTime - lastTime < MIN_REFRESH_INTERVAL && refreshCount.get() > 0) {
|
||||
log.info("刷新过于频繁,跳过本次刷新");
|
||||
return Flux.empty();
|
||||
}
|
||||
lastRefreshTime.set(currentTime);
|
||||
log.info("开始加载路由定义,第{}次调用", refreshCount.incrementAndGet());
|
||||
List<RouteDefinition> routeDefinitions = new ArrayList<>();
|
||||
|
||||
// 定义需要路由的服务列表
|
||||
String[] serviceNames = {"sczx-user", "sczx-store", "sczx-car", "sczx-order", "sczx-sync", "sczx-singlepay"};
|
||||
|
||||
// 为每个服务添加路由规则(如果服务存在)
|
||||
for (String serviceName : serviceNames) {
|
||||
if (hasServiceInstances(serviceName)) {
|
||||
RouteDefinition routeDefinition = new RouteDefinition();
|
||||
routeDefinition.setId(serviceName);
|
||||
|
||||
// 设置路径断言
|
||||
routeDefinition.setPredicates(Collections.singletonList(
|
||||
new PredicateDefinition("Path=/zc/" + serviceName.split("-")[1] + "/**")
|
||||
));
|
||||
|
||||
// 设置过滤器
|
||||
routeDefinition.setFilters(Collections.singletonList(
|
||||
new org.springframework.cloud.gateway.filter.FilterDefinition(
|
||||
"RewritePath=/zc/" + serviceName.split("-")[1] + "/(?<segment>.*), /$\\{segment}")
|
||||
));
|
||||
|
||||
// 设置URI
|
||||
routeDefinition.setUri(getServiceUri(serviceName));
|
||||
|
||||
routeDefinitions.add(routeDefinition);
|
||||
} else {
|
||||
log.warn("服务 {} 不存在实例,跳过路由配置", serviceName);
|
||||
// 防抖处理:如果距离上次刷新时间太短,则不处理
|
||||
if (currentTime - lastTime < MIN_REFRESH_INTERVAL && refreshCount.get() > 0) {
|
||||
log.info("刷新过于频繁,跳过本次刷新");
|
||||
return Flux.empty();
|
||||
}
|
||||
lastRefreshTime.set(currentTime);
|
||||
log.info("开始加载路由定义,第{}次调用", refreshCount.incrementAndGet());
|
||||
List<RouteDefinition> routeDefinitions = new ArrayList<>();
|
||||
|
||||
// 定义需要路由的服务列表
|
||||
String[] serviceNames = {"sczx-user", "sczx-store", "sczx-car", "sczx-order", "sczx-sync", "sczx-singlepay"};
|
||||
|
||||
// 为每个服务添加路由规则(如果服务存在)
|
||||
for (String serviceName : serviceNames) {
|
||||
if (hasServiceInstances(serviceName)) {
|
||||
RouteDefinition routeDefinition = new RouteDefinition();
|
||||
routeDefinition.setId(serviceName);
|
||||
|
||||
// 设置路径断言
|
||||
routeDefinition.setPredicates(Collections.singletonList(
|
||||
new PredicateDefinition("Path=/zc/" + serviceName.split("-")[1] + "/**")
|
||||
));
|
||||
|
||||
// 设置过滤器
|
||||
routeDefinition.setFilters(Collections.singletonList(
|
||||
new org.springframework.cloud.gateway.filter.FilterDefinition(
|
||||
"RewritePath=/zc/" + serviceName.split("-")[1] + "/(?<segment>.*), /$\\{segment}")
|
||||
));
|
||||
|
||||
// 设置URI
|
||||
routeDefinition.setUri(getServiceUri(serviceName));
|
||||
|
||||
routeDefinitions.add(routeDefinition);
|
||||
} else {
|
||||
log.warn("服务 {} 不存在实例,跳过路由配置", serviceName);
|
||||
}
|
||||
}
|
||||
log.info("路由加载完成,共加载 {} 个路由定义", routeDefinitions.size());
|
||||
return Flux.fromIterable(routeDefinitions);
|
||||
}catch (Exception e){
|
||||
log.error("路由加载失败", e);
|
||||
}
|
||||
log.info("路由加载完成,共加载 {} 个路由定义", routeDefinitions.size());
|
||||
return Flux.fromIterable(routeDefinitions);
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -114,8 +120,8 @@ public class DynamicRouteConfig implements RouteDefinitionLocator {
|
||||
log.warn("No available instances for service: {}, returning default URI", serviceName);
|
||||
return URI.create("http://localhost");
|
||||
}
|
||||
|
||||
ServiceInstance selected = instances.get(Math.abs(index.getAndIncrement()) % instances.size());
|
||||
int idx = index.getAndIncrement() & Integer.MAX_VALUE;
|
||||
ServiceInstance selected = instances.get(idx % instances.size());
|
||||
log.info("Selected instance: {}", selected);
|
||||
return URI.create("http://" + selected.getHost() + ":" + selected.getPort());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user