SpringCloudAlibaba - Gateway 自定义过滤器工厂

前言

Gateway中的过滤器可以为路由添加业务逻辑,修改请求以及响应


环境

Spring Cloud Hoxton.SR9 + Spring Cloud Alibaba 2.2.6.RELEASE


Gateway过滤器的生命周期

  • pre: Gateway转发请求之前
  • post: Gateway转发请求之后

过滤器工厂

内置过滤器工厂

  • AddRequestHeader GatewayFilter Factory示例,为原始请求添加请求参数foo=bar
gateway:
  discovery:
    locator:
      # 让gateway通过服务发现组件找到其他的微服务
      enabled: true
  routes:
    - id: user-center
      uri: lb://user-center
      predicates:
        - Path=/**
      filters:
        - AddRequestParameter=foo, bar
  • 输入日志

在这里插入图片描述


自定义过滤器工厂

自定义过滤器工厂 - 实现方式

  • 实现自定义过滤器工厂有两种方式
继承 AbstractGatewayFilterFactory
继承 AbstractNameValueGatewayFilterFactory

自定义过滤器工厂 - 具体实例

  • 实现自定义过滤器工厂 - 日志打印
  • application.yml
gateway:
  discovery:
    locator:
      # 让gateway通过服务发现组件找到其他的微服务
      enabled: true
  routes:
    - id: user-center
      uri: lb://user-center
      predicates:
        - Path=/**
      filters:
        - PreLog=参数1,参数2
  • PreLogGatewayFilterFactory.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

/**
 * 自定义过滤器工厂 - 日志打印
 * 必须以GatewayFilterFactory结尾
 */
@Slf4j
@Component
public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
    @Override
    public GatewayFilter apply(NameValueConfig config) {
        return ((exchange, chain) -> {
            log.info("自定义过滤器工厂 - 日志打印参数:{},{}", config.getName(), config.getValue());

            // 修改请求
            ServerHttpRequest modifiedRequest = exchange.getRequest()
                    .mutate()
                    .build();

            // 修改exchange
            ServerWebExchange modifiedExchange = exchange.mutate()
                    .request(modifiedRequest)
                    .build();

            // 传递给下一个过滤器处理
            return chain.filter(modifiedExchange);
        });
    }
}
  • 访问GATEWAY_URL/**

在这里插入图片描述


自定义过滤器工厂- 核心API

exchange.getRequest().mutate().xxx // 修改request
exchange.mutate().xxx // 修改exchange
chain.filter(exchange) // 传递给下一个过滤器处理
exchange.getResponse() // 拿到响应

- End -
白嫖有风险
点赞加收藏
posted @ 2021-09-30 12:50  Maggieq8324  阅读(168)  评论(0编辑  收藏  举报