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