From 7b4f1459dafa5fb8eb7e97045a85bb2eb9463ca7 Mon Sep 17 00:00:00 2001 From: zhuibobo Date: Tue, 14 Jul 2026 22:33:23 +0800 Subject: [PATCH] =?UTF-8?q?nacos=E8=A7=84=E5=88=99=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webserver/filter/PreferredRoleFilter.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 zdxt-web-server/zdxt-gateway-web-server/src/main/java/com/zdxt/gateway/webserver/filter/PreferredRoleFilter.java diff --git a/zdxt-web-server/zdxt-gateway-web-server/src/main/java/com/zdxt/gateway/webserver/filter/PreferredRoleFilter.java b/zdxt-web-server/zdxt-gateway-web-server/src/main/java/com/zdxt/gateway/webserver/filter/PreferredRoleFilter.java new file mode 100644 index 00000000..97a2fd1b --- /dev/null +++ b/zdxt-web-server/zdxt-gateway-web-server/src/main/java/com/zdxt/gateway/webserver/filter/PreferredRoleFilter.java @@ -0,0 +1,56 @@ +package com.zdxt.gateway.webserver.filter; + +import com.zdxt.gateway.webserver.config.PreferredFirstLoadBalancer; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.cloud.gateway.route.Route; +import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; +import org.springframework.core.Ordered; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 优先角色注入过滤器 + *

+ * 从命中的路由 metadata 中读取 role-order(逗号分隔的角色优先级列表), + * 复制为请求头 {@link PreferredFirstLoadBalancer#HEADER_ROLE_ORDER}, + * 供 {@link PreferredFirstLoadBalancer} 在负载均衡阶段读取。 + *

+ * Order 必须早于 Spring Cloud Gateway 的 ReactiveLoadBalancerClientFilter(默认 10150), + * 否则 LoadBalancer choose 时拿不到 header。 + * + * @author zdxt + */ +@Slf4j +@Component +public class PreferredRoleFilter implements GlobalFilter, Ordered { + + /** 路由 metadata 中约定的 key */ + public static final String ROUTE_METADATA_ROLE_ORDER = "role-order"; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); + if (route != null) { + Object roleOrder = route.getMetadata().get(ROUTE_METADATA_ROLE_ORDER); + if (roleOrder != null && !roleOrder.toString().isBlank()) { + log.debug("[{}] 路由 {} 注入角色优先级: {}", + route.getId(), route.getUri(), roleOrder); + ServerHttpRequest mutated = exchange.getRequest().mutate() + .header(PreferredFirstLoadBalancer.HEADER_ROLE_ORDER, roleOrder.toString()) + .build(); + return chain.filter(exchange.mutate().request(mutated).build()); + } + } + return chain.filter(exchange); + } + + @Override + public int getOrder() { + // 早于 ReactiveLoadBalancerClientFilter(10150),晚于 AccessLogFilter(HIGHEST_PRECEDENCE) + return 10000; + } +}