diff --git a/src/main/java/com/sczx/gateway/component/DynamicRouteScheduler.java b/src/main/java/com/sczx/gateway/component/DynamicRouteScheduler.java index 03f656d..8c0bdf1 100644 --- a/src/main/java/com/sczx/gateway/component/DynamicRouteScheduler.java +++ b/src/main/java/com/sczx/gateway/component/DynamicRouteScheduler.java @@ -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)); diff --git a/src/main/java/com/sczx/gateway/config/DynamicRouteConfig.java b/src/main/java/com/sczx/gateway/config/DynamicRouteConfig.java index 625189e..bf1f3d0 100644 --- a/src/main/java/com/sczx/gateway/config/DynamicRouteConfig.java +++ b/src/main/java/com/sczx/gateway/config/DynamicRouteConfig.java @@ -44,47 +44,53 @@ public class DynamicRouteConfig implements RouteDefinitionLocator { @Override public Flux 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 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}") - )); - - // 设置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 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}") + )); + + // 设置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()); }