过滤器 Prefix · SpringCloud微服务实战 · 看云

3. 过滤器 Prefix

导航

PrefixPathGatewayFilter工厂采用单个prefix参数

本节代码地址


3.1 应用配置

下面配置中,我们设置了一个路由前缀,会在我们输入的路径前面拼上我们设置的前缀,比如/1将向发送请求/user/1

server:
  port: 8699
spring:
  application:
    name: fw-gateways-gateway
  profiles:
    active: prefixpath_route
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
---
spring:
  cloud:
    gateway:
      routes:
        - id: prefixpath_route
          uri: lb://fw-cloud-ribbon-server
          predicates: 
            - After=2020-01-08T18:30:11.965+08:00[Asia/Shanghai]
          filters: 
            - PrefixPath= /user
  profiles: prefixpath_route


3.2 应用启动

浏览器或Postman 输入localhost:8699/1
ea63a38c4a818493a93f0b93bf30be0d_MD5.webp

3.3 PrefixPathGatewayFilterFactory源码

刚开始初始化的时候会设置网关是否已设置前缀gatewayAlreadyPrefixed为false,如果已经设置,就会以设置的为主。
修改gatewayAlreadyPrefixed的状态为true,并修改url的地址加上config.prefix中的值,config.prefix的值可以图片。
修改完之后重新构建ServerHttpRequest,之后交给NettyRoutingFilter执行

@Override
public GatewayFilter apply(Config config) {
   return new GatewayFilter() {
      @Override
      public Mono<Void> filter(ServerWebExchange exchange,
            GatewayFilterChain chain) {
         boolean alreadyPrefixed = exchange
               .getAttributeOrDefault(GATEWAY_ALREADY_PREFIXED_ATTR, false);
         if (alreadyPrefixed) {
            return chain.filter(exchange);
         }
         exchange.getAttributes().put(GATEWAY_ALREADY_PREFIXED_ATTR, true);

         ServerHttpRequest req = exchange.getRequest();
         addOriginalRequestUrl(exchange, req.getURI());
         String newPath = config.prefix + req.getURI().getRawPath();

         ServerHttpRequest request = req.mutate().path(newPath).build();

         exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, request.getURI());

         if (log.isTraceEnabled()) {
            log.trace("Prefixed URI with: " + config.prefix + " -> "
                  + request.getURI());
         }

         return chain.filter(exchange.mutate().request(request).build());
      }

      @Override
      public String toString() {
         return filterToStringCreator(PrefixPathGatewayFilterFactory.this)
               .append("prefix", config.getPrefix()).toString();
      }
   };
}

5ee4ae15f19878565354adcdd23c11a0_MD5.png