Spring云网关筛选器出现问题



我尝试使用Spring Cloud Gateway Filter来处理我的请求。我尝试使用一些变体实现过滤器,如下所示:

@Component
@Slf4j
@Order(-10000)
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
public CustomFilter() {
super(Config.class);
log.info("Loaded GatewayFilterFactory [Authorize]");
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("enabled");
}

@Override
public ShortcutType shortcutType() {
return ShortcutType.DEFAULT;
}
@Override
public GatewayFilter apply(CustomFilter.Config config) {
log.info("Into apply");
return (exchange, chain)->{
log.info("Into exchange!");
System.out.println(exchange.getRequest() + " request");
return chain.filter(exchange);
};
}
public static class Config {
private boolean enabled;
public Config() {}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
}

Component
@Slf4j
public class MainFilter implements GatewayFilterFactory<MainFilter.Config> {
@Override
public GatewayFilter apply(Config config) {
log.info("[Apply]");
return (exchange, chain) -> {
log.info("[Apply: {}]", exchange);
System.out.println("gateway filter name " + config.getName());
return chain.filter(exchange);
};
}
@Override
public Class<Config> getConfigClass() {
return Config.class;
}
@Override
public Config newConfig() {
return new Config("MainFilter");
}
public static class Config {
public Config(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}

下面是我的gateway.yml文件:

服务器:端口:8080管理:端点:网关:enabled:true端点:网址:暴露:包括:网关弹簧:云:发现:enabled:true网关:发现:定位器:enabled:truelowerCaseServiceId:true#默认筛选器:#-name:主过滤器路线:-id:second_routeuri:lb://auth服务谓词:-路径=/api/v1/**过滤器:-主过滤器应用程序:负载平衡器:功能区:enabled:false

但是当我创建服务请求时localhost:8080/auth-service/api/v1/过滤器不工作。我在控制台上看不到日志.info((。但当我在gateway.yml中使用条件默认过滤器时,我的自定义过滤器正在工作。在我的路由中使用自定义筛选器有什么问题?

很可能您的过滤器不起作用,因为传入的请求与配置中的路径谓词不匹配

路线配置为

routes:
- id: second_route
uri: lb://auth-service
predicates:
- Path=/api/v1/**
filters:
- MainFilter

其中MainFilter应用于与路径谓词CCD_ 1匹配的所有请求。如果我们仔细观察谓词,传入的请求路径应该是:

  1. /api/v1开始
  2. /api/v1段之后的url中有任何内容(**类似于regex.*表达式,将匹配所有内容(

因此,应匹配以下请求URL:

  • http://localhost:8080/api/v1/
  • http://localhost:8080/api/v1?key=value
  • http://localhost:8080/api/v1/test
  • http://localhost:8080/api/v1/test/key=value
  • 等等

但是当我创建服务请求时localhost:8080/auth-service/api/v1/Filter不工作

根据上面提供的路径谓词映射信息,您的请求不应与您定义的路径谓词匹配。您的请求具有以下路径/auth-service/api/v1,而网关正在查找类似/api/v1/的路径。

由于没有匹配的路由,网关会忽略请求,并允许它在管道中继续前进,我假设您的auth-service API与映射匹配,相应的控制器直接返回响应,而不使用网关

说到默认过滤器,它们将处理所有请求,无论它们有什么URL/Header/Query。

您应该能够使用以下配置找到路径匹配器日志

logging:
level:
org.springframework.cloud.gateway: TRACE
reactor.netty.http.client: TRACE

然后查找类似的日志:

  • Pattern "[/api/v1/**]" does not match against value "/auth-service/api/v1"
  • Pattern "/api/v1/**" matches against value "/api/v1/"

关于路径谓词的其他信息可以在这里找到:

  • https://cloud.spring.io/spring-cloud-gateway/reference/html/#the-路径路由谓词工厂
  • https://www.baeldung.com/spring-cloud-gateway-routing-predicate-factories#2-确定路线

最新更新