springcloud apiGateWay自定义filter

自己实践:

@Slf4j
@Component
public class AppAuthCheckFilter  extends AbstractGatewayFilterFactory {

 @Override
    public GatewayFilter apply(Object config) {
        return (exchange,chain) -> {
 
            ServerHttpRequest request = exchange.getRequest();
            //todo 定义自己的过滤业务

            log.info("AppAuthCheckFilter当前请求的url:{}",request.getURI().getPath());

            return chain.filter(exchange);
    };
}
routes:
# public-admin
- id: public-admin
  predicates:
  - name: Path
    args: 
      _genkey_0: /admin/**
  filters: 
  - name: AppAuthCheckFilter       #这里配置过滤器
    args: {}
  uri: lb://public-admin
  order: 0

摘自:https://www.jianshu.com/p/f95ca4a2a305

在开发网关的时候,我们可以为我们的所有路由器定义同样的filter,这样就不用为每个route单独进行配置,有几种实现方式:
一:通过配置继承了AbstractGatewayFilterFactory的bean来进行

在配置文件中增加default-filters

spring:
  application:
    name: gateway
  profiles:
    active: prod
  cloud:
    gateway:
      default-filters:
        - name: ModifyRequestBody
        - name: MyLog
      routes:
        - id: route1
          uri: lb://route1
          predicates:
            - Path=/route1/**
        - id: route2
          uri: lb://route2
          predicates:
            - Path=/route2/**

 

ModifyRequestBodyMyLog 是过滤器的名字,他们都继承了AbstractGatewayFilterFactory,这样gateway在启动的时候,就会把配置的名字加上GatewayFilterFactory的后缀作为bean的名字进行加载,在这个例子中就是 ModifyRequestBodyGatewayFilterFactoryMyLogGatewayFilterFactory 这个两个bean,其中ModifyRequestBodyGatewayFilterFactory是gateway自带的类,MyLogGatewayFilterFactory是我自己实现的类,大家可以通过这样的方式自定义自己的过滤器。

但这种方式有一个问题,要注意一下,众所周知,路由器除了配置文件,还可以通过java 代码的方式进行配置,如下:

@Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/test/**")
                        .uri("lb://test")
                        .order(0)
                        .id("test")
                )
                .build();
    }

 

或者我们也可以自己进行动态路由的配置,网上有很多例子,我就不贴出来了

而上边那种通过yml或properties文件配置默认过滤器的方式,对 java代码配置的路由器不生效
只对配置文件和动态配置的路由生效(这个坑我进行了一上午的尝试对比才发现)

因为通过使用代码定义路由使用的是 RouteLocator 这个类
而通过配置文件或者外部存储器配置路由使用的是 RouteDefinitionLocator 的实现类进行的,有 4个实现类:

  • PropertiesRouteDefinitionLocator ,从配置文件( 例如,YML / Properties 等 ) 读取
  • RouteDefinitionRepository ,从存储器( 例如,内存 / Redis / MySQL 等 )读取(默认使用的是从内存)
  • DiscoveryClientRouteDefinitionLocator ,从注册中心( 例如,Eureka / Zookeeper 等 )读取
  • CompositeRouteDefinitionLocator ,组合多种 RouteDefinitionLocator 的实现

这里应该是,配置gateway自带的过滤器还是生效的,但是自己继承了AbstractGatewayFilterFactory的类就不生效,因为之前的项目配置过自带的Hystrix过滤器生效了

如果想让自己的过滤器对所有的路由生效,就用到这第二种方式

二:通过实现GlobalFilter的方式进行,
这样的过滤器对所有的路由都生效,而想要gateway中已有的过滤器功能,可以把其中的代码逻辑扣出来放进自己的类中。可以参照这篇 《spring cloud gateway 二次开发之 处理 requestBody》 https://www.jianshu.com/p/a5fc8039d236



 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Gateway是一个基于Spring Framework 5、Project Reactor和Spring Boot 2构建的反应式API网关。它提供了一种简单而强大的方式来路由、限流和过滤请求。 下面是Spring Cloud Gateway的全部配置详解: 1. 创建一个Spring Boot应用程序,并添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> ``` 2. 在application.yml或application.properties文件中配置网关的基本信息,例如端口号和应用名称: ```yaml server: port: 8080 spring: application: name: gateway-service ``` 3. 配置路由规则,定义请求到达网关后的转发规则。可以通过yml或properties文件进行配置: - YML格式: ```yaml spring: cloud: gateway: routes: - id: route1 uri: http://example.com predicates: - Path=/example/** ``` - Properties格式: ```properties spring.cloud.gateway.routes[0].id=route1 spring.cloud.gateway.routes[0].uri=http://example.com spring.cloud.gateway.routes[0].predicates[0]=Path=/example/** ``` 上述配置表示将以/example/**开头的所有请求转发到http://example.com。 4. 配置过滤器,对请求进行过滤和修改。可以使用内置的过滤器,也可以自定义过滤器。 - 内置过滤器使用示例: ```yaml spring: cloud: gateway: routes: - id: route1 uri: http://example.com predicates: - Path=/example/** filters: - AddRequestHeader=X-Request-Foo, Bar - AddResponseHeader=X-Response-Foo, Baz ``` 上述配置表示在转发请求之前,在请求头中添加X-Request-Foo: Bar,在响应头中添加X-Response-Foo: Baz。 - 自定义过滤器使用示例: ```java @Component public class CustomFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 自定义过滤器逻辑 return chain.filter(exchange); } @Override public int getOrder() { return Ordered.LOWEST_PRECEDENCE; } } ``` 自定义过滤器需要实现GlobalFilter接口,并通过@Component注解将其注册为Spring Bean。可以在filter方法中编写自定义的过滤逻辑。 这些是Spring Cloud Gateway的基本配置,你可以根据实际需求添加更多的路由规则和自定义过滤器。通过灵活配置,你可以实现路由转发、请求限流、负载均衡等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值