java Spring云网关过滤器问题

ee7vknir  于 2023-01-19  发布在  Java
关注(0)|答案(1)|浏览(140)

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

@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文件如下:

server:
  port: 8080

management:
  endpoint:
    gateway:
      enabled: true
  endpoints:
    web:
      exposure:
        include: gateway

spring:
  cloud:
    discovery:
      enabled: true
    gateway:
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true
#      default-filters:
#        - name: MainFilter
      routes:
        - id: second_route
          uri: lb://auth-service
          predicates:
          - Path=/api/v1/**
          filters:
          - MainFilter

  application:
    loadbalancer:
      ribbon:
        enabled: false

但当我创建请求服务localhost:8080/auth-service/api/v1/过滤器不工作。我没有看到mwsahe www.example.com()在我的控制台上。但当我使用条件默认过滤器在我的网关。yml我的自定义过滤器工作。什么问题使用自定义过滤器与我的路线?log.info() on my console. But when i use conditions default-filter in my gateway.yml my custom filter is working. What problem for use custom filter with my route?

xlpyo6sf

xlpyo6sf1#

过滤器不起作用的原因很可能是传入的请求与配置中的路径 predicate 不匹配
路由配置为

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

其中MainFilter应用于所有匹配路径 predicate /api/v1/**的请求。如果我们更仔细地查看 predicate ,传入请求路径应该:
1.从/api/v1开始
1.在/api/v1段之后的url中有任何内容(**类似于regex .*表达式,将匹配所有内容)
因此,应匹配以下请求URL:

  • 本地主机:8080
  • 本地主机:8080应用程序接口/版本1?密钥=值
  • 本地主机:8080应用程序接口
  • 本地主机:8080/应用程序接口/版本1/测试/密钥=值
  • 等等

但是当我创建服务请求时localhost:8080/auth-service/API/v1/过滤器不工作
根据上面提供的路径 predicate Map信息,您的请求不应与您定义的路径 predicate 匹配。您的请求具有以下路径/auth-service/api/v1,而网关正在查找类似/api/v1/的路径。
由于没有匹配的路由,网关忽略请求并允许它在管道中继续前进,我假设您的auth-service API与Map匹配,并且相应的控制器直接返回响应,而不需要网关
说到默认过滤器,他们将处理所有的请求,无论他们有什么URL/标题/查询。
您应该能够使用以下配置找到路径匹配器日志

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/"

有关路径 predicate 的其他信息,请访问:

  • https://cloud.spring.io/spring-cloud-gateway/reference/html/#the-path-route-predicate-factory
  • https://www.baeldung.com/spring-cloud-gateway-routing-predicate-factories#2-defining-a-route-in-yaml

相关问题