204540-17226027408e3a

Gateway微服务自定义过滤器

网关过滤器有两种,分别是

  1. GatewayFilter:路由过滤器,作用范围灵活,作用于任意指定的路由
  2. GlobalFilter:全局过滤器,作用范围是所有路由。

自定义GatewayFilter

自定义GatewayFilter不是直接实现GatewayFilter,而是实现AbstractGatewayFilterFactory。

编写过滤器逻辑

如果过滤器的类名以GatewayFilterFactory结尾,则在配置过滤器的时候可以写前缀。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Component
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
@Override
public GatewayFilter apply(Object config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 得到请求
ServerHttpRequest request = exchange.getRequest();
// 处理请求
System.out.println("这里模拟请求被处理了");
// 过滤器放行
return chain.filter(exchange);
}
};
}
}

配置过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server:
port: 6632
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
- id: car-service
uri: lb://car-service
predicates:
- Path=/car/**
default-filters:
- Custom

发起请求,测试过滤器效果

image-20241118212431379

过滤器逻辑成功触发。

增加接受参数功能

实现步骤

  1. 定义一个内部类Config
  2. 重写shortcutFieldOrder,getConfigClass方法
  3. 在配置文件中配置参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@Component
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomGatewayFilterFactory.Config> {
@Override
public GatewayFilter apply(Config config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 得到请求
ServerHttpRequest request = exchange.getRequest();
// 处理请求
System.out.println(config.getA());
System.out.println(config.getB());
System.out.println(config.getC());
// 过滤器放行
return chain.filter(exchange);
}
};
}

@Data
public static class Config {
String a;
String b;
String c;
}

// 将变量名称依次返回,顺序很重要,将来读取参数时需要按顺顺序获取
@Override
public List<String> shortcutFieldOrder() {
ArrayList<String> fileds = new ArrayList<>();
fileds.add("a");
fileds.add("b");
fileds.add("c");
return fileds;
}

// 返回内部config的类型
@Override
public Class<Config> getConfigClass() {
return Config.class;
}
}

测试效果

image-20241118213924298

成功接收到参数。

自定义GlobalFilter

直接实现GlobalFilter接口即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("MyGlobalFilter is running");
return chain.filter(exchange);
}

@Override
public int getOrder() {
// 值越小优先级越高
return 0;
}
}

测试

image-20241118215213692

成功执行