国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring Cloud Gateway實戰之五:內置filter

reclay / 1084人閱讀

摘要:歡迎訪問我的歡迎訪問我的內容所有原創文章分類匯總及配套源碼,涉及等本篇概覽本篇概覽作為實戰系列的第五篇,是時候了解過濾器的作用了,本篇咱們一起來了解內置好的過濾器,真是種類繁多功能強大過濾器顧名思義,就是在請求頭部添加指定的內容帶有的完整配

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內容:所有原創文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;

本篇概覽

  • 作為《Spring Cloud Gateway實戰》系列的第五篇,是時候了解過濾器(filter)的作用了,本篇咱們一起來了解Spring Cloud Gateway內置好的過濾器,真是種類繁多功能強大

AddRequestHeader

  • AddRequestHeader過濾器顧名思義,就是在請求頭部添加指定的內容
  • 帶有predicate的完整配置:
server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:            - Path=/hello/**          filters:            - AddRequestHeader=x-request-foo, bar-config
  • 帶有predicate的完整動態配置:
[    {        "id": "path_route_addr",        "uri": "http://127.0.0.1:8082",        "predicates": [            {                "name": "Path",                "args": {                    "pattern": "/hello/**"                }            }        ],        "filters": [            {                "name": "AddRequestHeader",                "args": {                    "name": "x-request-foo",                    "value": "bar-dynamic"                }            }        ]    }]
  • 實際效果:

在這里插入圖片描述

AddRequestParameter

  • AddRequestParameter過濾器顧名思義,就是添加請求參數

  • 配置如下,服務提供方收到的請求中會多一個參數,名為foo,值為bar-config:

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:            - Path=/hello/**          filters:            - AddRequestParameter=foo, bar-config
  • 帶有predicate的完整動態配置:
[    {        "id": "path_route_addr",        "uri": "http://127.0.0.1:8082",        "predicates": [            {                "name": "Path",                "args": {                    "pattern": "/hello/**"                }            }        ],        "filters": [            {                "name": "AddRequestParameter",                "args": {                    "name": "foo",                    "value": "bar-dynamic"                }            }        ]    }]
  • 實際效果:

在這里插入圖片描述

AddResponseHeader

  • AddResponseHeader過濾器就是在響應的header中添加參數

  • 配置如下,客戶端收到的響應,其header中會多一個參數,名為foo,值為bar-config-response:

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:          - Path=/hello/**          filters:          - AddResponseHeader=foo, bar-config-response
  • 帶有predicate的完整動態配置:
[    {        "id": "path_route_addr",        "uri": "http://127.0.0.1:8082",        "predicates": [            {                "name": "Path",                "args": {                    "pattern": "/hello/**"                }            }        ],        "filters": [            {                "name": "AddResponseHeader",                "args": {                    "name": "foo",                    "value": "bar-dynamic-response"                }            }        ]    }]
  • 實際效果:

在這里插入圖片描述

DedupeResponseHeader

  • 服務提供方返回的response的header中,如果有的key出線了多個value(例如跨域場景下的Access-Control-Allow-Origin),DedupeResponseHeader過濾器可以將重復的value剔除調,剔除策略有三種:RETAIN_FIRST (保留第一個,默認), RETAIN_LAST(保留最后一個), RETAIN_UNIQUE(去重)

  • 配置如下,指定了兩個header key的去重,策略是保留最后一個:

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:          - Path=/hello/**          filters:          - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_LAST

DedupeResponseHeader

  • 服務提供方返回的response的header中,如果有的key出線了多個value(例如跨域場景下的Access-Control-Allow-Origin),DedupeResponseHeader過濾器可以將重復的value剔除調,剔除策略有三種:RETAIN_FIRST (保留第一個,默認), RETAIN_LAST(保留最后一個), RETAIN_UNIQUE(去重)

  • 配置如下,指定了兩個header key的去重,策略是保留最后一個:

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:          - Path=/hello/**          filters:          - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_LAST

CircuitBreaker

  • CircuitBreaker即斷路器,咱們在多帶帶的一篇中深入體驗這個強大的功能吧

FallbackHeaders

  • FallbackHeaders一般和CircuitBreaker配合使用,來看下面的配置,發生斷路后,請求會被轉發FallbackHeaders去處理,此時FallbackHeaders會在header中指定的key上添加異常信息:
spring:  cloud:    gateway:      routes:      - id: ingredients        uri: lb://ingredients        predicates:        - Path=//ingredients/**        filters:        - name: CircuitBreaker          args:            name: fetchIngredients            fallbackUri: forward:/fallback      - id: ingredients-fallback        uri: http://localhost:9994        predicates:        - Path=/fallback        filters:        - name: FallbackHeaders          args:            executionExceptionTypeHeaderName: Test-Header

MapRequestHeader

  • MapRequestHeader用于header中的鍵值對復制,如下配置的意思是:如果請求header中有Blue就新增名為X-Request-Red的key,其值和Blue的值一樣

  • 配置如下,指定了兩個header key的去重,策略是保留最后一個:

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:          - Path=/hello/**          filters:          - MapRequestHeader=Blue, X-Request-Red
  • 如下圖,請求header中有Blue:

在這里插入圖片描述

  • 再看服務提供方的日志,顯示header中多了X-Request-Red:

在這里插入圖片描述

  • 如果請求的header中已經存在X-Request-Red會出現什么情況呢?如下圖,咱們把X-Request-Red寫在請求header中:

在這里插入圖片描述

  • 在服務提供方打斷點,可以發現神奇的一幕,header中的所有key,對應的值其實都是集合,只是大多數情況下集合里面只有一個元素,而MapRequestHeader新增的元素會被放入這個集合,不會影響原有內容:

在這里插入圖片描述

PrefixPath

  • PrefixPath很好理解,就是轉發到服務提供者的時候,給path加前綴

  • 例如我這邊服務提供者原始地址是http://127.0.0.1:8082/hello/str配置如下,如果我給網關配置PrefixPath=hello,那么訪問網關的時候,請求路徑中就不需要hello了,配置如下:

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:          - Path=/str          filters:          - PrefixPath=/hello
  • 如下圖,請求路徑無需hello

在這里插入圖片描述

PreserveHostHeader

  • PreserveHostHeader在轉發請求到服務提供者的時候,會保留host信息(否則就只能由HTTP client來決定了)

  • 先看不使用PreserveHostHeader的效果,如下圖,服務提供者收到的請求header中的host就是網關配置的信息:

在這里插入圖片描述

  • 加上PreserveHostHeader試試,如下圖紅框,是真正的host信息:

在這里插入圖片描述

RequestRateLimiter

  • RequestRateLimiter用于限流,涉及內容較多,就放在多帶帶的章節深入研究吧

RedirectTo

  • RedirectTo的功能簡單直白:跳轉到指定位置,下面的配置中,uri字段明顯是一個無效的地址,但請求還是會被RedirectTo轉發到指定位置去:
server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.1.1.1:11111          predicates:          - Path=/hello/**          filters:          - RedirectTo=302, http://127.0.0.1:8082/hello/str

RemoveRequestHeader

  • RemoveRequestHeader很好理解,刪除請求header中的指定值

  • 下面的配置會刪除請求header中的foo:

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:          - Path=/hello/**          filters:          - RemoveRequestHeader=foo

RemoveResponseHeader

  • RemoveResponseHeader刪除響應header中的指定值

  • 下面的配置會刪除響應header中的foo:

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:          - Path=/hello/**          filters:          - RemoveResponseHeader=foo

RemoveRequestParameter

  • RemoveRequestParameter 刪除請求參數中的指定參數

  • 下面的配置會刪除請求參數中的foo:

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:          - Path=/hello/**          filters:          - RemoveRequestParameter=foo1

RewritePath

  • RewritePath非常實用,將請求參數中的路徑做變換

  • 下面的配置會將/test/str轉成/hello/str

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:          - Path=/test/**          filters:          - RewritePath=/test/?(?.*), /hello/$/{segment}
  • 請求如下,可見path中的test會被網關修改成hello,變成正確的請求路徑:

在這里插入圖片描述

RewriteLocationResponseHeader

  • RewriteLocationResponseHeader用于改寫response中的location信息

  • 配置如下,一共是四個參數:stripVersionMode、locationHeaderName、hostValue、protocolsRegex

  • 例如請求是api.example.com/some/object/name,response的location是object-service.prod.example.net/v2/some/object/id,最終會被下面的filter改寫為api.example.com/some/object/id

spring:  cloud:    gateway:      routes:      - id: rewritelocationresponseheader_route        uri: http://example.org        filters:        - RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,
  • stripVersionMode的策略一共三種:

NEVER_STRIP:不執行
AS_IN_REQUEST :原始請求沒有vesion,就執行
ALWAYS_STRIP :固定執行

  • Location用于替換host:port部分,如果沒有就是用Request中的host

  • protocolsRegex用于匹配協議,如果匹配不上,name過濾器啥都不做

RewriteResponseHeader

  • RewriteResponseHeader很好理解:修改響應header,參數有三個:header的key,匹配value的正則表達式,修改value的結果

  • 下面的配置表示修改響應header中X-Response-Red這個key的value,找到password=xxx的內容,改成password=***

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:          - Path=/test/**          filters:          - RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***

SecureHeaders

  • SecureHeaders會在響應的header中添加很多和安全相關的內容,配置如下:
server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:          - Path=/hello/**          filters:          - SecureHeaders
  • 響應如下,可見header中添加了很多信息:

在這里插入圖片描述

  • 如果不想返回上圖中的某些內容,可以在配置文件中關閉掉,如下圖紅框,x-frame-options和strict-transport-security兩項被設置為不返回了:

在這里插入圖片描述

  • 再試試,得到如下響應,可見x-frame-options和strict-transport-security都沒有返回:

在這里插入圖片描述

SetPath

  • SetPath配合predicates使用,下面的配置會將請求/test/str改成/hello/str,可見這個segment是在predicates中賦值的,然后再filters中拿來用:
server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      filter:        secure-headers:          disable:            - x-frame-options            - strict-transport-security      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:            - Path=/test/{segment}          filters:            - SetPath=/hello/{segment}

SetRequestHeader

  • SetRequestHeader顧名思義,就是改寫請求的header,將指定key改為指定value,如果該key不存在就創建:
server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      filter:        secure-headers:          disable:            - x-frame-options            - strict-transport-security      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:            - Path=/hello/**          filters:            - SetRequestHeader=X-Request-Red, Blue
  • 和SetPath類似,SetRequestHeader也可以和predicates配合,在predicates中定義的變量可以用在SetRequestHeader中,如下所示,當請求是/hello/str的時候,header中X-Request-Red的值就是Blue-str
server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      filter:        secure-headers:          disable:            - x-frame-options            - strict-transport-security      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:            - Path=/hello/{segment}          filters:            - SetRequestHeader=X-Request-Red, Blue-{segment}

SetResponseHeader

  • SetResponseHeader顧名思義,就是改寫響應的header,將指定key改為指定value,如果該key不存在就創建:
server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      filter:        secure-headers:          disable:            - x-frame-options            - strict-transport-security      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:            - Path=/hello/**          filters:            - SetResponseHeader=X-Request-Red, Blue

SetStatus

  • SetStatus很好理解:控制返回code,下面的設置會返回500:
server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:            - Path=/hello/**          filters:            - SetStatus=500
  • 測試效果如下圖,服務提供者的內容會正常返回,但是返回碼已經被改為500了:

在這里插入圖片描述

  • 如果您想用SetStatus修改返回碼,同時又不想丟掉真實的返回碼,可以增加如下配置,這樣真實的返回碼就被放在名為original-status-header-name的key中了:
server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      set-status:        original-status-header-name: aaabbbccc      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:            - Path=/hello/**          filters:            - SetStatus=500

StripPrefix

  • StripPrefix是個很常用的filter,例如請求是/aaa/bbb/hello/str,我們要想將其轉為/hello/str,用StripPrefix=2即可,前面兩級path都被刪掉了:
server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      set-status:        original-status-header-name: aaabbbccc      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:            - Path=/aaa/**          filters:            - StripPrefix=2
  • 如下圖,響應正常:

在這里插入圖片描述

Retry

  • 顧名思義,Retry就是重試,需要以下參數配合使用:
  1. retries:重試次數
  2. statuses:遇到什么樣的返回狀態才重試,取值參考:org.springframework.http.HttpStatus
  3. methods:那些類型的方法會才重試(GET、POST等),取值參考:org.springframework.http.HttpMethod
  4. series:遇到什么樣的series值才重試,取值參考:org.springframework.http.HttpStatus.Series
  5. exceptions:遇到什么樣的異常才重試
  6. backoff:重試策略,由多個參數構成,例如firstBackoff
  • 參考配置如下:
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            methods: GET,POST            backoff:              firstBackoff: 10ms              maxBackoff: 50ms              factor: 2              basedOnPreviousValue: false

RequestSize

  • RequestSize也很常用:控制請求大小,可以使用KB或者MB等單位,超過這個大小就會返回413錯誤(Payload Too Large),
spring:  cloud:    gateway:      routes:      - id: request_size_route        uri: http://localhost:8080/upload        predicates:        - Path=/upload        filters:        - name: RequestSize          args:            maxSize: 5000000
  • 注意,如果沒有設置RequestSize,Spring Cloud Gateway默認的上限是5MB

SetRequestHostHeader

  • SetRequestHostHeader會修改請求header中的host值

  • 下面的配置,會將請求header中的host改為aaabbb

server:  #服務端口  port: 8081spring:  application:    name: hello-gateway  cloud:    gateway:      routes:        - id: path_route          uri: http://127.0.0.1:8082          predicates:            - Path=/hello/**          filters:        - name: SetRequestHostHeader        args:          host: aaabbb
  • 在服務提供者的代碼中打斷點,如下圖,可見host已經被改為aaabbb

在這里插入圖片描述

ModifyRequestBody

  • ModifyRequestBody用于修改請求的body內容,這里官方推薦用代碼來配置,如下所示,請求body中原本是字符串,結果被改成了Hello對象的實例:
@Beanpublic 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;    }}

ModifyResponseBody

  • ModifyResponseBody與前面的ModifyRequestBody類似,官方建議用代碼實現,下面的代碼作用是將響應body的內容改為全部大寫:
@Beanpublic 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();}

TokenRelay

  • 在使用第三方鑒權的時候,如OAuth2,用TokenRelay可以將第三方的token轉發到服務提供者那里去:
spring:  cloud:    gateway:      routes:      - id: resource        uri: http://localhost:9000        predicates:        - Path=/resource        filters:        - TokenRelay=
  • 記得還要添加jar包依賴org.springframework.boot:spring-boot-starter-oauth2-client

設置全局filter

  • 前面的例子中,所有filter都放在路由策略中,配合predicates一起使用的,如果您想配置全局生效的filter,可以在配置文件中做以下設置,下面的配置表示AddResponseHeader和PrefixPath會處理所有請求,和路由設置無關:
spring:  cloud:    gateway:      default-filters:      - AddResponseHeader=X-Response-Default-Red, Default-Blue      - PrefixPath=/httpbin
  • 至此,大部分內置過濾器咱們已經了解了,有幾個略微復雜的留待后面的章節深入學習

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 數據庫+中間件系列
  6. DevOps系列

歡迎關注公眾號:程序員欣宸

微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/123758.html

相關文章

  • Spring Cloud Gateway修改請求和響應body的內容

    摘要:歡迎訪問我的歡迎訪問我的內容所有原創文章分類匯總及配套源碼,涉及等本篇概覽本篇概覽作為實戰系列的第九篇,咱們聊聊如何用修改原始請求和響應內容,以及修改過程中遇到的問題首先是修改請求,如下圖,瀏覽器是請求發起方,真實參數只有,經過網關時被塞歡迎訪問我的GitHubhttps://github.com/zq2599/blog_demos內容:所有原創文章分類匯總及配套源碼,涉及Java、Dock...

    ivyzhang 評論0 收藏0
  • Spring Cloud Gateway 之 AddRequestHeader GatewayFil

    摘要:類似的工廠類還有和,,,這幾個就不做單獨講解了,使用方式是一樣的。配置示列配置示列討論時間文章中講的這幾個工廠類的作用我們已經了解了,那具體的使用場景有哪些適合在什么場景下使用呢歡迎大家留言討論。 今天我們來學習下GatewayFilter Factory,中文解釋就是過濾器工廠。 官方文檔對GatewayFilter Factory的介紹: Route filters allow t...

    宋華 評論0 收藏0
  • Spring Cloud Gateway限流實戰

    摘要:歡迎訪問我的歡迎訪問我的內容所有原創文章分類匯總及配套源碼,涉及等本篇概覽本篇概覽本文是實戰系列的第八篇,經過前面的學習,咱們對過濾器已了解得差不多,今天來補全過濾器的最后一個版塊限流默認的限流器是基于實現的,限流算法是大家熟悉的令牌桶關于歡迎訪問我的GitHubhttps://github.com/zq2599/blog_demos內容:所有原創文章分類匯總及配套源碼,涉及Java、Doc...

    stonezhu 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<