本文基于Spring Cloud Greenwich SR2
[TOC]
內(nèi)置的過(guò)濾器工廠
這里簡(jiǎn)單將Spring Cloud Gateway內(nèi)置的所有過(guò)濾器工廠整理成了一張表格,雖然不是很詳細(xì),但能作為速覽使用。如下:
過(guò)濾器工廠 | 作用 | 參數(shù) |
---|---|---|
AddRequestHeader | 為原始請(qǐng)求添加Header | Header的名稱(chēng)及值 |
AddRequestParameter | 為原始請(qǐng)求添加請(qǐng)求參數(shù) | 參數(shù)名稱(chēng)及值 |
AddResponseHeader | 為原始響應(yīng)添加Header | Header的名稱(chēng)及值 |
DedupeResponseHeader | 剔除響應(yīng)頭中重復(fù)的值 | 需要去重的Header名稱(chēng)及去重策略 |
Hystrix | 為路由引入Hystrix的斷路器保護(hù) |
HystrixCommand 的名稱(chēng) |
FallbackHeaders | 為fallbackUri的請(qǐng)求頭中添加具體的異常信息 | Header的名稱(chēng) |
PrefixPath | 為原始請(qǐng)求路徑添加前綴 | 前綴路徑 |
PreserveHostHeader | 為請(qǐng)求添加一個(gè)preserveHostHeader=true的屬性耍休,路由過(guò)濾器會(huì)檢查該屬性以決定是否要發(fā)送原始的Host | 無(wú) |
RequestRateLimiter | 用于對(duì)請(qǐng)求限流杠娱,限流算法為令牌桶 | keyResolver澡绩、rateLimiter肺稀、statusCode、denyEmptyKey酌毡、emptyKeyStatus |
RedirectTo | 將原始請(qǐng)求重定向到指定的URL | http狀態(tài)碼及重定向的url |
RemoveHopByHopHeadersFilter | 為原始請(qǐng)求刪除IETF組織規(guī)定的一系列Header | 默認(rèn)就會(huì)啟用,可以通過(guò)配置指定僅刪除哪些Header |
RemoveRequestHeader | 為原始請(qǐng)求刪除某個(gè)Header | Header名稱(chēng) |
RemoveResponseHeader | 為原始響應(yīng)刪除某個(gè)Header | Header名稱(chēng) |
RewritePath | 重寫(xiě)原始的請(qǐng)求路徑 | 原始路徑正則表達(dá)式以及重寫(xiě)后路徑的正則表達(dá)式 |
RewriteResponseHeader | 重寫(xiě)原始響應(yīng)中的某個(gè)Header | Header名稱(chēng)蕾管,值的正則表達(dá)式枷踏,重寫(xiě)后的值 |
SaveSession | 在轉(zhuǎn)發(fā)請(qǐng)求之前,強(qiáng)制執(zhí)行WebSession::save 操作 |
無(wú) |
SecureHeaders | 為原始響應(yīng)添加一系列起安全作用的響應(yīng)頭 | 無(wú)掰曾,支持修改這些安全響應(yīng)頭的值 |
SetPath | 修改原始的請(qǐng)求路徑 | 修改后的路徑 |
SetResponseHeader | 修改原始響應(yīng)中某個(gè)Header的值 | Header名稱(chēng)旭蠕,修改后的值 |
SetStatus | 修改原始響應(yīng)的狀態(tài)碼 | HTTP 狀態(tài)碼,可以是數(shù)字旷坦,也可以是字符串 |
StripPrefix | 用于截?cái)嘣颊?qǐng)求的路徑 | 使用數(shù)字表示要截?cái)嗟穆窂降臄?shù)量 |
Retry | 針對(duì)不同的響應(yīng)進(jìn)行重試 | retries掏熬、statuses、methods秒梅、series |
RequestSize | 設(shè)置允許接收最大請(qǐng)求包的大小旗芬。如果請(qǐng)求包大小超過(guò)設(shè)置的值,則返回 413 Payload Too Large
|
請(qǐng)求包大小捆蜀,單位為字節(jié)疮丛,默認(rèn)值為5M |
ModifyRequestBody | 在轉(zhuǎn)發(fā)請(qǐng)求之前修改原始請(qǐng)求體內(nèi)容 | 修改后的請(qǐng)求體內(nèi)容 |
ModifyResponseBody | 修改原始響應(yīng)體的內(nèi)容 | 修改后的響應(yīng)體內(nèi)容 |
Default | 為所有路由添加過(guò)濾器 | 過(guò)濾器工廠名稱(chēng)及值 |
Tips:每個(gè)過(guò)濾器工廠都對(duì)應(yīng)一個(gè)實(shí)現(xiàn)類(lèi),并且這些類(lèi)的名稱(chēng)必須以GatewayFilterFactory
結(jié)尾辆它,這是Spring Cloud Gateway的一個(gè)約定誊薄,例如AddRequestHeader
對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)為AddRequestHeaderGatewayFilterFactory
。對(duì)源碼感興趣的小伙伴就可以按照這個(gè)規(guī)律拼接出具體的類(lèi)名娩井,以此查找這些內(nèi)置過(guò)濾器工廠的實(shí)現(xiàn)代碼
1暇屋、AddRequestHeader GatewayFilter Factory
為原始請(qǐng)求添加Header,配置示例:
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: https://example.org
filters:
- AddRequestHeader=X-Request-Foo, Bar
為原始請(qǐng)求添加名為 X-Request-Foo
洞辣,值為 Bar
的請(qǐng)求頭
2咐刨、AddRequestParameter GatewayFilter Factory
為原始請(qǐng)求添加請(qǐng)求參數(shù)及值昙衅,配置示例:
spring:
cloud:
gateway:
routes:
- id: add_request_parameter_route
uri: https://example.org
filters:
- AddRequestParameter=foo, bar
為原始請(qǐng)求添加名為foo,值為bar的參數(shù)定鸟,即:foo=bar
3而涉、AddResponseHeader GatewayFilter Factory
為原始響應(yīng)添加Header,配置示例:
spring:
cloud:
gateway:
routes:
- id: add_response_header_route
uri: https://example.org
filters:
- AddResponseHeader=X-Response-Foo, Bar
為原始響應(yīng)添加名為 X-Request-Foo
联予,值為 Bar
的響應(yīng)頭
4啼县、DedupeResponseHeader GatewayFilter Factory
DedupeResponseHeader可以根據(jù)配置的Header名稱(chēng)及去重策略剔除響應(yīng)頭中重復(fù)的值,這是Spring Cloud Greenwich SR2提供的新特性沸久,低于這個(gè)版本無(wú)法使用季眷。
我們?cè)贕ateway以及微服務(wù)上都設(shè)置了CORS(解決跨域)Header的話,如果不做任何配置卷胯,那么請(qǐng)求 -> 網(wǎng)關(guān) -> 微服務(wù)子刮,獲得的CORS Header的值,就將會(huì)是這樣的:
Access-Control-Allow-Credentials: true, true
Access-Control-Allow-Origin: https://musk.mars, https://musk.mars
可以看到這兩個(gè)Header的值都重復(fù)了窑睁,若想把這兩個(gè)Header的值去重的話挺峡,就需要使用到DedupeResponseHeader,配置示例:
spring:
cloud:
gateway:
routes:
- id: dedupe_response_header_route
uri: https://example.org
filters:
# 若需要去重的Header有多個(gè)担钮,使用空格分隔
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
去重策略:
- RETAIN_FIRST:默認(rèn)值橱赠,保留第一個(gè)值
- RETAIN_LAST:保留最后一個(gè)值
- RETAIN_UNIQUE:保留所有唯一值,以它們第一次出現(xiàn)的順序保留
若想對(duì)該過(guò)濾器工廠有個(gè)比較全面的了解的話箫津,建議閱讀該過(guò)濾器工廠的源碼狭姨,因?yàn)樵创a里有詳細(xì)的注釋及示例,比官方文檔寫(xiě)得還好:org.springframework.cloud.gateway.filter.factory.DedupeResponseHeaderGatewayFilterFactory
5鲤嫡、Hystrix GatewayFilter Factory
為路由引入Hystrix的斷路器保護(hù)送挑,配置示例:
spring:
cloud:
gateway:
routes:
- id: hystrix_route
uri: https://example.org
filters:
- Hystrix=myCommandName
Hystrix是Spring Cloud第一代容錯(cuò)組件,不過(guò)已經(jīng)進(jìn)入維護(hù)模式暖眼,未來(lái)Hystrix會(huì)被Spring Cloud移除掉惕耕,取而代之的是Alibaba Sentinel/Resilience4J。所以本文不做詳細(xì)介紹了诫肠,感興趣的話可以參考官方文檔:
6司澎、FallbackHeaders GatewayFilter Factory
同樣是對(duì)Hystrix的支持,上一小節(jié)所介紹的過(guò)濾器工廠支持一個(gè)配置參數(shù):fallbackUri
栋豫,該配置用于當(dāng)發(fā)生異常時(shí)將請(qǐng)求轉(zhuǎn)發(fā)到一個(gè)特定的uri上挤安。而FallbackHeaders
這個(gè)過(guò)濾工廠可以在轉(zhuǎn)發(fā)請(qǐng)求到該uri時(shí)添加一個(gè)Header,這個(gè)Header的值為具體的異常信息丧鸯。配置示例:
spring:
cloud:
gateway:
routes:
- id: ingredients
uri: lb://ingredients
predicates:
- Path=//ingredients/**
filters:
- name: Hystrix
args:
name: fetchIngredients
fallbackUri: forward:/fallback
- id: ingredients-fallback
uri: http://localhost:9994
predicates:
- Path=/fallback
filters:
- name: FallbackHeaders
args:
executionExceptionTypeHeaderName: Test-Header
這里也不做詳細(xì)介紹了蛤铜,感興趣可以參考官方文檔:
7、PrefixPath GatewayFilter Factory
為原始的請(qǐng)求路徑添加一個(gè)前綴路徑,配置示例:
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- PrefixPath=/mypath
該配置使訪問(wèn)${GATEWAY_URL}/hello
會(huì)轉(zhuǎn)發(fā)到https://example.org/mypath/hello
8围肥、PreserveHostHeader GatewayFilter Factory
為請(qǐng)求添加一個(gè)preserveHostHeader=true的屬性剿干,路由過(guò)濾器會(huì)檢查該屬性以決定是否要發(fā)送原始的Host Header。配置示例:
spring:
cloud:
gateway:
routes:
- id: preserve_host_route
uri: https://example.org
filters:
- PreserveHostHeader
如果不設(shè)置穆刻,那么名為 Host
的Header將由Http Client控制
9置尔、RequestRateLimiter GatewayFilter Factory
用于對(duì)請(qǐng)求進(jìn)行限流,限流算法為令牌桶氢伟。配置示例:
spring:
cloud:
gateway:
routes:
- id: requestratelimiter_route
uri: https://example.org
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
這里暫且不做詳細(xì)的介紹榜轿,可以參考官方文檔:
10、RedirectTo GatewayFilter Factory
將原始請(qǐng)求重定向到指定的Url朵锣,配置示例:
spring:
cloud:
gateway:
routes:
- id: redirect_route
uri: https://example.org
filters:
- RedirectTo=302, https://acme.org
該配置使訪問(wèn) ${GATEWAY_URL}/hello
會(huì)被重定向到 https://acme.org/hello
谬盐,并且攜帶一個(gè) Location:http://acme.org
的Header,而返回客戶端的HTTP狀態(tài)碼為302
注意事項(xiàng):
- HTTP狀態(tài)碼應(yīng)為3xx诚些,例如301
- URL必須是合法的URL设褐,該URL會(huì)作為
Location
Header的值
11、RemoveHopByHopHeadersFilter GatewayFilter Factory
為原始請(qǐng)求刪除IETF組織規(guī)定的一系列Header泣刹,默認(rèn)刪除的Header如下:
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- TE
- Trailer
- Transfer-Encoding
- Upgrade
可以通過(guò)配置去指定僅刪除哪些Header,配置示例:
spring:
cloud:
gateway:
filter:
remove-hop-by-hop:
# 多個(gè)Header使用逗號(hào)(,)分隔
headers: Connection,Keep-Alive
12犀被、RemoveRequestHeader GatewayFilter Factory
為原始請(qǐng)求刪除某個(gè)Header椅您,配置示例:
spring:
cloud:
gateway:
routes:
- id: removerequestheader_route
uri: https://example.org
filters:
- RemoveRequestHeader=X-Request-Foo
刪除原始請(qǐng)求中名為 X-Request-Foo
的請(qǐng)求頭
13、RemoveResponseHeader GatewayFilter Factory
為原始響應(yīng)刪除某個(gè)Header寡键,配置示例:
spring:
cloud:
gateway:
routes:
- id: removeresponseheader_route
uri: https://example.org
filters:
- RemoveResponseHeader=X-Response-Foo
刪除原始響應(yīng)中名為 X-Request-Foo
的響應(yīng)頭
14掀泳、RewritePath GatewayFilter Factory
通過(guò)正則表達(dá)式重寫(xiě)原始的請(qǐng)求路徑,配置示例:
spring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: https://example.org
predicates:
- Path=/foo/**
filters:
# 參數(shù)1為原始路徑的正則表達(dá)式西轩,參數(shù)2為重寫(xiě)后路徑的正則表達(dá)式
- RewritePath=/foo/(?<segment>.*), /$\{segment}
該配置使得訪問(wèn) /foo/bar
時(shí)员舵,會(huì)將路徑重寫(xiě)為/bar
再進(jìn)行轉(zhuǎn)發(fā),也就是會(huì)轉(zhuǎn)發(fā)到 https://example.org/bar
藕畔。需要注意的是:由于YAML語(yǔ)法马僻,需用$\
替換 $
15、RewriteResponseHeader GatewayFilter Factory
重寫(xiě)原始響應(yīng)中的某個(gè)Header注服,配置示例:
spring:
cloud:
gateway:
routes:
- id: rewriteresponseheader_route
uri: https://example.org
filters:
# 參數(shù)1為Header名稱(chēng)韭邓,參數(shù)2為值的正則表達(dá)式,參數(shù)3為重寫(xiě)后的值
- RewriteResponseHeader=X-Response-Foo, password=[^&]+, password=***
該配置的意義在于:如果響應(yīng)頭中 X-Response-Foo
的值為/42?user=ford&password=omg!what&flag=true
溶弟,那么就會(huì)被按照配置的值重寫(xiě)成/42?user=ford&password=***&flag=true
女淑,也就是把其中的password=omg!what
重寫(xiě)成了password=***
16、SaveSession GatewayFilter Factory
在轉(zhuǎn)發(fā)請(qǐng)求之前辜御,強(qiáng)制執(zhí)行WebSession::save
操作鸭你,配置示例:
spring:
cloud:
gateway:
routes:
- id: save_session
uri: https://example.org
predicates:
- Path=/foo/**
filters:
- SaveSession
主要用在那種像 Spring Session 延遲數(shù)據(jù)存儲(chǔ)(數(shù)據(jù)不是立刻持久化)的,并希望在請(qǐng)求轉(zhuǎn)發(fā)前確保session狀態(tài)保存情況。如果你將Spring Secutiry于Spring Session集成使用袱巨,并想確保安全信息都傳到下游機(jī)器阁谆,你就需要配置這個(gè)filter。
17瓣窄、SecureHeaders GatewayFilter Factory
SecureHeaders過(guò)濾器工廠主要是參考了這篇博客中的建議笛厦,為原始響應(yīng)添加了一系列起安全作用的響應(yīng)頭。默認(rèn)會(huì)添加如下Headers(包括值):
X-Xss-Protection:1; mode=block
Strict-Transport-Security:max-age=631138519
X-Frame-Options:DENY
X-Content-Type-Options:nosniff
Referrer-Policy:no-referrer
Content-Security-Policy:default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline'
X-Download-Options:noopen
X-Permitted-Cross-Domain-Policies:none
如果你想修改這些Header的值俺夕,那么就需要使用這些Headers對(duì)應(yīng)的后綴裳凸,如下:
xss-protection-header
strict-transport-security
frame-options
content-type-options
referrer-policy
content-security-policy
download-options
permitted-cross-domain-policies
配置示例:
spring:
cloud:
gateway:
filter:
secure-headers:
# 修改 X-Xss-Protection 的值為 2; mode=unblock
xss-protection-header: 2; mode=unblock
如果想禁用某些Header,可使用如下配置:
spring:
cloud:
gateway:
filter:
secure-headers:
# 多個(gè)使用逗號(hào)(,)分隔
disable: frame-options,download-options
18劝贸、SetPath GatewayFilter Factory
修改原始的請(qǐng)求路徑姨谷,配置示例:
spring:
cloud:
gateway:
routes:
- id: setpath_route
uri: https://example.org
predicates:
- Path=/foo/{segment}
filters:
- SetPath=/{segment}
該配置使訪問(wèn) ${GATEWAY_URL}/foo/bar
時(shí)會(huì)轉(zhuǎn)發(fā)到 https://example.org/bar
,也就是原本的/foo/bar
被修改為了/bar
19映九、SetResponseHeader GatewayFilter Factory
修改原始響應(yīng)中某個(gè)Header的值梦湘,配置示例:
spring:
cloud:
gateway:
routes:
- id: setresponseheader_route
uri: https://example.org
filters:
- SetResponseHeader=X-Response-Foo, Bar
將原始響應(yīng)中 X-Response-Foo
的值修改為 Bar
20、SetStatus GatewayFilter Factory
修改原始響應(yīng)的狀態(tài)碼件甥,配置示例:
spring:
cloud:
gateway:
routes:
- id: setstatusstring_route
uri: https://example.org
filters:
# 字符串形式
- SetStatus=BAD_REQUEST
- id: setstatusint_route
uri: https://example.org
filters:
# 數(shù)字形式
- SetStatus=401
SetStatusd的值可以是數(shù)字捌议,也可以是字符串。但一定要是Spring HttpStatus
枚舉類(lèi)中的值引有。上面這兩種配置都可以返回401這個(gè)HTTP狀態(tài)碼瓣颅。
21、StripPrefix GatewayFilter Factory
用于截?cái)嘣颊?qǐng)求的路徑譬正,配置示例:
spring:
cloud:
gateway:
routes:
- id: nameRoot
uri: http://nameservice
predicates:
- Path=/name/**
filters:
# 數(shù)字表示要截?cái)嗟穆窂降臄?shù)量
- StripPrefix=2
如上配置宫补,如果請(qǐng)求的路徑為 /name/bar/foo
,那么則會(huì)截?cái)喑?code>/foo后進(jìn)行轉(zhuǎn)發(fā) 曾我,也就是會(huì)截?cái)?個(gè)路徑粉怕。
22、Retry GatewayFilter Factory
針對(duì)不同的響應(yīng)進(jìn)行重試抒巢,例如可以針對(duì)HTTP狀態(tài)碼進(jìn)行重試贫贝,配置示例:
spring:
cloud:
gateway:
routes:
- id: retry_test
uri: http://localhost:8080/flakey
predicates:
- Host=*.retry.com
filters:
- name: Retry
args:
retries: 3
statuses: BAD_GATEWAY
可配置如下參數(shù):
-
retries
:重試次數(shù) -
statuses
:需要重試的狀態(tài)碼,取值在org.springframework.http.HttpStatus
中 -
methods
:需要重試的請(qǐng)求方法蛉谜,取值在org.springframework.http.HttpMethod
中 -
series
:HTTP狀態(tài)碼序列平酿,取值在org.springframework.http.HttpStatus.Series
中
23、RequestSize GatewayFilter Factory
設(shè)置允許接收最大請(qǐng)求包的大小悦陋,配置示例:
spring:
cloud:
gateway:
routes:
- id: request_size_route
uri: http://localhost:8080/upload
predicates:
- Path=/upload
filters:
- name: RequestSize
args:
# 單位為字節(jié)
maxSize: 5000000
如果請(qǐng)求包大小超過(guò)設(shè)置的值蜈彼,則會(huì)返回 413 Payload Too Large
以及一個(gè)errorMessage
24、Modify Request Body GatewayFilter Factory
在轉(zhuǎn)發(fā)請(qǐng)求之前修改原始請(qǐng)求體內(nèi)容俺驶,該過(guò)濾器工廠只能通過(guò)代碼配置幸逆,不支持在配置文件中配置棍辕。代碼示例:
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("rewrite_request_obj", r -> r.host("*.rewriterequestobj.org")
.filters(f -> f.prefixPath("/httpbin")
.modifyRequestBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
(exchange, s) -> return Mono.just(new Hello(s.toUpperCase())))).uri(uri))
.build();
}
static class Hello {
String message;
public Hello() { }
public Hello(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Tips:該過(guò)濾器工廠處于 BETA 狀態(tài),未來(lái)API可能會(huì)變化还绘,生產(chǎn)環(huán)境請(qǐng)慎用
25楚昭、Modify Response Body GatewayFilter Factory
可用于修改原始響應(yīng)體的內(nèi)容,該過(guò)濾器工廠同樣只能通過(guò)代碼配置拍顷,不支持在配置文件中配置抚太。代碼示例:
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("rewrite_response_upper", r -> r.host("*.rewriteresponseupper.org")
.filters(f -> f.prefixPath("/httpbin")
.modifyResponseBody(String.class, String.class,
(exchange, s) -> Mono.just(s.toUpperCase()))).uri(uri)
.build();
}
Tips:該過(guò)濾器工廠處于 BETA 狀態(tài),未來(lái)API可能會(huì)變化昔案,生產(chǎn)環(huán)境請(qǐng)慎用
26尿贫、Default Filters
Default Filters用于為所有路由添加過(guò)濾器工廠,也就是說(shuō)通過(guò)Default Filter所配置的過(guò)濾器工廠會(huì)作用到所有的路由上踏揣。配置示例:
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Response-Default-Foo, Default-Bar
- PrefixPath=/httpbin
官方文檔: