1.簡介
?Gateway?作用:過濾器就是在請求的傳遞過程中,對請求和響應(yīng)做一些手腳。
?Gateway?生命周期:Pre Post。
- PRE:這種過濾器在請求被路由之前調(diào)用。我們可利用這種過濾器實(shí)現(xiàn)身份驗(yàn)證、在集群中選擇請求的微服務(wù)、記錄調(diào)試信息等。
- POST:這種過濾器在路由到微服務(wù)以后執(zhí)行。這種過濾器可用來為響應(yīng)添加標(biāo)準(zhǔn)的HTTP Header、收集統(tǒng)計(jì)信息和指標(biāo)、將響應(yīng)從微服務(wù)發(fā)送給客戶端等。
Gateway?分類:局部過濾器和全局過濾器。
- 局部過濾器(GatewayFilter):應(yīng)用到單個(gè)路由或者一個(gè)分組的路由上。
- 全局過濾器(GlobalFilter):應(yīng)用到所有的路由上。
2.?配置方式
? ?過濾器的配置分為兩種方式,一種是通過配置文件的方式,一種是通過編碼的方式。
2.1?配置文件方式
#這種是局部過濾器配置
spring:
cloud:
gateway:
routes:
- id: resource
uri: http://localhost:9000
predicates:
- Path=/resource
filters:
- TokenRelay=
#這種是全局過濾器配置,只需要設(shè)置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)是針對單個(gè)路由的過濾器,對訪問的URL過濾,切面處理。在Spring Cloud Gateway中通過GatewayFilter的形式內(nèi)置了很多不同類型的局部過濾器。內(nèi)置了31種過濾器。
序號 | 過濾器 | 作用 | 參數(shù)名 | 參數(shù)值 | 示例(filters配置) | 備注 |
1 | AddRequestHeader | 添加請求頭 | name,value | 添加的請求頭及其值 | AddRequestHeader=X-Request-red, blue | |
2 | AddRequestParameter | 在Query String中添加請求參數(shù),參數(shù)值可以是變量,具體值可以從PATH或Host中匹配 | name,value | 添加的參數(shù)名及其值 | AddRequestParameter=foo, bar-{segment} | |
3 | AddResponseHeader | 添加響應(yīng)頭 | name,value | 添加的響應(yīng)頭及其值 | AddResponseHeader=X-Response-Red, Blue | |
4 | DedupeResponseHeader | 過濾重復(fù)響應(yīng)頭 | name,strategy | 需要過濾的響應(yīng)頭及策略(保留第一個(gè),保留最后一個(gè),保留唯一值) | DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin | |
5 | CircuitBreaker | 熔斷器 | name,fallbackUri,statusCodes | 熔斷器名稱、熔斷后的默認(rèn)URI、熔斷觸發(fā)狀態(tài) | #NAME? | 使用熔斷器需配置spring-cloud-starter-circuitbreaker-reactor-resilience4j,詳見Resilience4J Documentation |
6 | FallbackHeaders | 指定發(fā)生熔斷時(shí)fallback響應(yīng)頭 | executionExceptionTypeHeaderName, executionExceptionMessageHeaderName, rootCauseExceptionTypeHeaderName, rootCauseExceptionMessageHeaderName | 異常類型、詳情、根因類型、根因詳情等響應(yīng)頭名稱 | executionExceptionTypeHeaderName: Test-Header | |
7 | MapRequestHeader | 添加新的請求頭,值從已有請求頭中獲取 | fromHeader,toHeader | 已有請求頭名稱,新請求頭名稱 | MapRequestHeader=Blue, X-Request-Red | |
8 | PrefixPath | 請求路徑增加前綴 | prefix | 需增加的前綴 | PrefixPath=/mypath | |
9 | PreserveHostHeader | 配置是否將原始請求頭發(fā)送到服務(wù)方 | - | - | PreserveHostHeader | |
10 | RequestRateLimiter | 請求頻度控制 | - | - | 默認(rèn)提供了基于Redis的頻度控制過濾器,也可以自定義 | |
11 | RedirectTo | 重定向過濾器 | status,url | 重定向http status及重定向后的url | RedirectTo=302, https://acme.org | |
12 | RemoveRequestHeader | 刪除請求頭 | name | 待刪除的請求頭 | RemoveRequestHeader=X-Request-Foo | |
13 | RemoveResponseHeader | 刪除響應(yīng)頭 | name | 待刪除的響應(yīng)頭 | RemoveResponseHeader=X-Response-Foo | |
14 | RemoveRequestParameter | 刪除請求參數(shù) | name | 待刪除的請求參數(shù)名 | RemoveRequestParameter=red | |
15 | RewritePath | 重寫PATH | regexp,replacement | 重寫部分匹配規(guī)則,需替換的值 | RewritePath=/red/?(?<segment>.*), /$\{segment} | 匹配規(guī)則采用正則表達(dá)式,替換值支持從匹配中獲取 |
16 | RewriteLocationResponseHeader | 重寫響應(yīng)頭中的Location | stripVersionMode, locationHeaderName, hostValue, protocolsRegex | path中version處理模式,location響應(yīng)頭名稱,host值,url協(xié)議頭 | RewriteLocationResponseHeader=AS_IN_REQUEST, Location, , | |
17 | RewriteResponseHeader | 重寫響應(yīng)頭 | name,regexp,replacement | 響應(yīng)頭名稱,需修改值的匹配規(guī)則,需替換的值 | RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=*** | |
18 | SaveSession | 強(qiáng)制觸發(fā)WebSession::save | - | - | SaveSession | |
19 | SecureHeaders | 添加一組安全相關(guān)的頭信息到響應(yīng)中 | - | - | SecureHeaders | |
20 | SetPath | 設(shè)置請求path | template | path模板 | SetPath=/{segment} | |
21 | SetRequestHeader | 設(shè)置請求頭(不添加新的) | name,value | 請求頭及其值 | SetRequestHeader=X-Request-Red, Blue | |
22 | SetResponseHeader | 設(shè)置響應(yīng)頭(不添加新的) | name,value | 響應(yīng)頭及其值 | SetResponseHeader=X-Response-Red, Blue | |
23 | SetStatus | 設(shè)置響應(yīng)狀態(tài) | status | 響應(yīng)狀態(tài) | SetStatus=401 | |
24 | StripPrefix | 截?cái)嗾埱驪ATH | parts | 需截?cái)嗟拈L度(’/'個(gè)數(shù)) | StripPrefix=2 | |
25 | Retry | 重試過濾器 | - | - | - | 詳細(xì)配置 |
26 | RequestSize | 限流器 | maxSize | 請求最大報(bào)文大小 | maxSize: 5000000 | |
27 | SetRequestHostHeader | 設(shè)置請求host | host | 分組及權(quán)重 | SetRequestHostHeader=example.org | |
28 | ModifyRequestBody | 修改請求報(bào)文 | - | - | - | 只能通過 Java DSL 配置 |
29 | ModifyResponseBody | 修改響應(yīng)報(bào)文 | - | - | - | 只能通過 Java DSL 配置 |
30 | TokenRelay | 配合OAuth2使用 | - | - | TokenRelay= | |
31 | CacheRequestBody | 根據(jù)權(quán)重進(jìn)行路由 | bodyClass | 請求體類型 | - | 詳細(xì)配置 |
3.2?全局過濾器(GlobalFilter)?
? ? 全局過濾器作用于所有路由,無需配置。通過全局過濾器可以實(shí)現(xiàn)對權(quán)限的統(tǒng)一校驗(yàn),安全性驗(yàn)證等功能。
????????
?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 自定義局部過濾器
? 局部過濾器實(shí)現(xiàn)需要繼承AbstractGatewayFilterFactory類,并且實(shí)現(xiàn)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博客文章來源:http://www.zghlxwxcb.cn/news/detail-524993.html
gateway自定義過濾器_小菜雞9527的博客-CSDN博客_gateway自定義過濾器文章來源地址http://www.zghlxwxcb.cn/news/detail-524993.html
到了這里,關(guān)于SpringCloudGateway學(xué)習(xí)(2)-過濾器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!