1.简介
Gateway 作用:过滤器就是在请求的传递过程中,对请求和响应做一些手脚。
Gateway 生命周期:Pre Post。
- PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
- POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
Gateway 分类:局部过滤器和全局过滤器。
- 局部过滤器(GatewayFilter):应用到单个路由或者一个分组的路由上。
- 全局过滤器(GlobalFilter):应用到所有的路由上。
2. 配置方式
过滤器的配置分为两种方式,一种是通过配置文件的方式,一种是通过编码的方式。
2.1 配置文件方式
#这种是局部过滤器配置
spring:
cloud:
gateway:
routes:
- id: resource
uri: http://localhost:9000
predicates:
- Path=/resource
filters:
- TokenRelay=
#这种是全局过滤器配置,只需要设置default-filters就可以了
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Response-Default-Red, Default-Blue
- PrefixPath=/httpbin
2.2编码方式
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("resource", r -> r.path("/resource")
.filters(f -> f.tokenRelay())
.uri("http://localhost:9000"))
.build();
}
3. 过滤器分类
3.1 局部过滤器(GatewayFilter)
局部过滤器(GatewayFilter)是针对单个路由的过滤器,对访问的URL过滤,切面处理。在Spring Cloud Gateway中通过GatewayFilter的形式内置了很多不同类型的局部过滤器。内置了31种过滤器。
序号 | 过滤器 | 作用 | 参数名 | 参数值 | 示例(filters配置) | 备注 |
1 | AddRequestHeader | 添加请求头 | name,value | 添加的请求头及其值 | AddRequestHeader=X-Request-red, blue | |
2 | AddRequestParameter | 在Query String中添加请求参数,参数值可以是变量,具体值可以从PATH或Host中匹配 | name,value | 添加的参数名及其值 | AddRequestParameter=foo, bar-{segment} | |
3 | AddResponseHeader | 添加响应头 | name,value | 添加的响应头及其值 | AddResponseHeader=X-Response-Red, Blue | |
4 | DedupeResponseHeader | 过滤重复响应头 | name,strategy | 需要过滤的响应头及策略(保留第一个,保留最后一个,保留唯一值) | DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin | |
5 | CircuitBreaker | 熔断器 | name,fallbackUri,statusCodes | 熔断器名称、熔断后的默认URI、熔断触发状态 | #NAME? | 使用熔断器需配置spring-cloud-starter-circuitbreaker-reactor-resilience4j,详见Resilience4J Documentation |
6 | FallbackHeaders | 指定发生熔断时fallback响应头 | executionExceptionTypeHeaderName, executionExceptionMessageHeaderName, rootCauseExceptionTypeHeaderName, rootCauseExceptionMessageHeaderName | 异常类型、详情、根因类型、根因详情等响应头名称 | executionExceptionTypeHeaderName: Test-Header | |
7 | MapRequestHeader | 添加新的请求头,值从已有请求头中获取 | fromHeader,toHeader | 已有请求头名称,新请求头名称 | MapRequestHeader=Blue, X-Request-Red | |
8 | PrefixPath | 请求路径增加前缀 | prefix | 需增加的前缀 | PrefixPath=/mypath | |
9 | PreserveHostHeader | 配置是否将原始请求头发送到服务方 | - | - | PreserveHostHeader | |
10 | RequestRateLimiter | 请求频度控制 | - | - | 默认提供了基于Redis的频度控制过滤器,也可以自定义 | |
11 | RedirectTo | 重定向过滤器 | status,url | 重定向http status及重定向后的url | RedirectTo=302, https://acme.org | |
12 | RemoveRequestHeader | 删除请求头 | name | 待删除的请求头 | RemoveRequestHeader=X-Request-Foo | |
13 | RemoveResponseHeader | 删除响应头 | name | 待删除的响应头 | RemoveResponseHeader=X-Response-Foo | |
14 | RemoveRequestParameter | 删除请求参数 | name | 待删除的请求参数名 | RemoveRequestParameter=red | |
15 | RewritePath | 重写PATH | regexp,replacement | 重写部分匹配规则,需替换的值 | RewritePath=/red/?(?<segment>.*), /$\{segment} | 匹配规则采用正则表达式,替换值支持从匹配中获取 |
16 | RewriteLocationResponseHeader | 重写响应头中的Location | stripVersionMode, locationHeaderName, hostValue, protocolsRegex | path中version处理模式,location响应头名称,host值,url协议头 | RewriteLocationResponseHeader=AS_IN_REQUEST, Location, , | |
17 | RewriteResponseHeader | 重写响应头 | name,regexp,replacement | 响应头名称,需修改值的匹配规则,需替换的值 | RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=*** | |
18 | SaveSession | 强制触发WebSession::save | - | - | SaveSession | |
19 | SecureHeaders | 添加一组安全相关的头信息到响应中 | - | - | SecureHeaders | |
20 | SetPath | 设置请求path | template | path模板 | SetPath=/{segment} | |
21 | SetRequestHeader | 设置请求头(不添加新的) | name,value | 请求头及其值 | SetRequestHeader=X-Request-Red, Blue | |
22 | SetResponseHeader | 设置响应头(不添加新的) | name,value | 响应头及其值 | SetResponseHeader=X-Response-Red, Blue | |
23 | SetStatus | 设置响应状态 | status | 响应状态 | SetStatus=401 | |
24 | StripPrefix | 截断请求PATH | parts | 需截断的长度(’/'个数) | StripPrefix=2 | |
25 | Retry | 重试过滤器 | - | - | - | 详细配置 |
26 | RequestSize | 限流器 | maxSize | 请求最大报文大小 | maxSize: 5000000 | |
27 | SetRequestHostHeader | 设置请求host | host | 分组及权重 | SetRequestHostHeader=example.org | |
28 | ModifyRequestBody | 修改请求报文 | - | - | - | 只能通过 Java DSL 配置 |
29 | ModifyResponseBody | 修改响应报文 | - | - | - | 只能通过 Java DSL 配置 |
30 | TokenRelay | 配合OAuth2使用 | - | - | TokenRelay= | |
31 | CacheRequestBody | 根据权重进行路由 | bodyClass | 请求体类型 | - | 详细配置 |
3.2 全局过滤器(GlobalFilter)
全局过滤器作用于所有路由,无需配置。通过全局过滤器可以实现对权限的统一校验,安全性验证等功能。
4.自定义过滤器
4.1 自定义全局过滤器(GlobalFilter)
a.前置过滤器
@Component
public class MyCustomGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("this is custom pre filter");
return chain.filter(exchange).then();
}
@Override
public int getOrder() {
return 0;
}
}
b.后置过滤器
@Component
public class MyCustomGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
System.out.println("this is post filter");
}));
}
@Override
public int getOrder() {
return 0;
}
}
4.2 自定义局部过滤器
局部过滤器实现需要继承AbstractGatewayFilterFactory类,并且实现apply方法
import lombok.Data;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Component
public class MyCustomLocalFiterFactory extends AbstractGatewayFilterFactory<MyCustomLocalFiterFactory.ParamsConfig> {
@Override
public String name() {
return "mycustomlocalfiter";
}
public MyCustomLocalFiterFactory() {
super(ParamsConfig.class);
}
@Override
public GatewayFilter apply(ParamsConfig config) {
return (exchange, chain) -> {
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
System.out.println("name=" + config.getParamName() + ";value=" + config.getParamValue());
}));
};
}
@Data
public static class ParamsConfig {
private String paramName;
private String paramValue;
}
}
然后还需配置过滤器到路由上
spring:
cloud:
gateway:
routes: #1路由
- id: producer-one
uri: lb://producter-one
predicates: #2通过path断言
- Path=/*/producterone/**
filters: #3过滤器,过滤器可以不用配置
- StripPrefix=1
- name: mycustomlocalfiter
args:
paramname: "this is paramName"
paramvalue: "this is paramValue"
- id: producer-two
uri: http://localhost:8080
predicates:
- Path=/*/productertwo/
filters:
- StripPrefix=1
参考:
Gateway过滤器详解_wh柒八九的博客-CSDN博客_gateway 过滤器
Spring Cloud Gateway配置详解-过滤器_EngineZhang的博客-CSDN博客文章来源:https://www.toymoban.com/news/detail-524993.html
gateway自定义过滤器_小菜鸡9527的博客-CSDN博客_gateway自定义过滤器文章来源地址https://www.toymoban.com/news/detail-524993.html
到了这里,关于SpringCloudGateway学习(2)-过滤器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!