Browse Source

nacos规则设置

dev
zhuibobo 2 months ago
parent
commit
7b4f1459da
  1. 56
      zdxt-web-server/zdxt-gateway-web-server/src/main/java/com/zdxt/gateway/webserver/filter/PreferredRoleFilter.java

56
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;
/**
* 优先角色注入过滤器
* <p>
* 从命中的路由 metadata 中读取 role-order逗号分隔的角色优先级列表
* 复制为请求头 {@link PreferredFirstLoadBalancer#HEADER_ROLE_ORDER}
* {@link PreferredFirstLoadBalancer} 在负载均衡阶段读取
* <p>
* 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<Void> 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;
}
}
Loading…
Cancel
Save