javascript
SpringCloud-25-Gateway:动态路由、过滤器使用
9.4 Spring Cloud Gateway 動態路由
-
默認情況下,Spring Cloud Gateway 會根據服務注冊中心(例如 Eureka Server)中維護的服務列表,以服務名(spring.application.name)作為路徑創建動態路由進行轉發,從而實現動態路由功能。
-
我們可以在配置文件中,將 Route 的 uri 地址修改為以下形式。
-
以上配置說明如下:
- lb:uri 的協議,表示開啟 Spring Cloud Gateway 的負載均衡功能。
- service-name:服務名,Spring Cloud Gateway 會根據它獲取到具體的微服務地址。
-
測試下 Spring Cloud Gateway 是如何實現動態路由的, 修改microservice-cloud-gateway-8015 中 application.yml 的配置,使用注冊中心中的微服務名創建動態路由進行轉發,配置如下。
- 依次啟動 Eureka 服務注冊中心(集群)、服務提供者集群(microservice-cloud-provider-dept-8001/8002/8003)以及 microservice-cloud-gateway-8015。
- 在瀏覽器中訪問“http://localhost:8015/dept/list”,結果如下圖。發現數據來源于三個提供者服務
9.5 Filter 過濾器
-
通常情況下,出于安全方面的考慮,服務端提供的服務往往都會有一定的校驗邏輯,例如用戶登陸狀態校驗、簽名校驗等。
-
在微服務架構中,系統由多個微服務組成,所有這些服務都需要這些校驗邏輯,此時我們就可以將這些校驗邏輯寫到 Spring Cloud Gateway 的 Filter 過濾器中。
-
Filter 的分類:Spring Cloud Gateway 提供了以下兩種類型的過濾器,可以對請求和響應進行精細化控制。
| Pre 類型 | 這種過濾器在請求被轉發到微服務之前可以對請求進行攔截和修改,例如參數校驗、權限校驗、流量監控、日志輸出以及協議轉換等操作。 |
| Post 類型 | 這種過濾器在微服務對請求做出響應后可以對響應進行攔截和再處理,例如修改響應內容或響應頭、日志輸出、流量監控等。 |
- 按照作用范圍劃分,Spring Cloud gateway 的 Filter 可以分為 2 類:
- GatewayFilter:應用在單個路由或者一組路由上的過濾器。
- GlobalFilter:應用在所有的路由上的過濾器。
9.5.1 GatewayFilter 網關過濾器
-
GatewayFilter 是 Spring Cloud Gateway 網關中提供的一種應用在單個或一組路由上的過濾器。它可以對單個路由或者一組路由上傳入的請求和傳出響應進行攔截,并實現一些與業務無關的功能,比如登陸狀態校驗、簽名校驗、權限校驗、日志輸出、流量監控等。
-
GatewayFilter 在配置文件(例如 application.yml)中的寫法與 Predicate 類似,格式如下。
- Spring Cloud Gateway 內置了多達 31 種 GatewayFilter,下表中列舉了幾種常用的網關過濾器及其使用示例。
| AddRequestHeader | 攔截傳入的請求,并在請求上添加一個指定的請求頭參數。 | name:需要添加的請求頭參數的 key; value:需要添加的請求頭參數的 value。 | - AddRequestHeader=my-request-header,1024 |
| AddRequestParameter | 攔截傳入的請求,并在請求上添加一個指定的請求參數。 | name:需要添加的請求參數的 key; value:需要添加的請求參數的 value。 | - AddRequestParameter=my-request-param,cloud.zk.com |
| AddResponseHeader | 攔截響應,并在響應上添加一個指定的響應頭參數。 | name:需要添加的響應頭的 key; value:需要添加的響應頭的 value。 | - AddResponseHeader=my-response-header,cloud.zk.com |
| PrefixPath | 攔截傳入的請求,并在請求路徑增加一個指定的前綴。 | prefix:需要增加的路徑前綴。 | - PrefixPath=/consumer |
| PreserveHostHeader | 轉發請求時,保持客戶端的 Host 信息不變,然后將它傳遞到提供具體服務的微服務中。 | 無 | - PreserveHostHeader |
| RemoveRequestHeader | 移除請求頭中指定的參數。 | name:需要移除的請求頭的 key。 | - RemoveRequestHeader=my-request-header |
| RemoveResponseHeader | 移除響應頭中指定的參數。 | name:需要移除的響應頭。 | - RemoveResponseHeader=my-response-header |
| RemoveRequestParameter | 移除指定的請求參數。 | name:需要移除的請求參數。 | - RemoveRequestParameter=my-request-param |
| RequestSize | 配置請求體的大小,當請求體過大時,將會返回 413 Payload Too Large。 | maxSize:請求體的大小。 | - name: RequestSize args: maxSize: 5000000 |
- 來測試 GatewayFilter 的配置,在 microservice-cloud-gateway-8015 的 application.yml 中在修改成一個包含斷言和過濾器動態路由,配置內容如下。
- 重啟 microservice-cloud-gateway-8015,使用瀏覽器訪問“http://localhost:8015/get/1”或,結果如下圖。
9.5.2 GlobalFilter 全局過濾器
- GlobalFilter 是一種作用于所有的路由上的全局過濾器,通過它,我們可以實現一些統一化的業務功能,例如權限認證、IP 訪問限制等。當某個請求被路由匹配時,那么所有的 GlobalFilter 會和該路由自身配置的 GatewayFilter 組合成一個過濾器鏈。
- Spring Cloud Gateway 為我們提供了多種默認的 GlobalFilter,例如與轉發、路由、負載均衡等相關的全局過濾器。但在實際的項目開發中,通常我們都會自定義一些自己的 GlobalFilter 全局過濾器以滿足我們自身的業務需求,而很少直接使用 Spring Cloud Config 提供這些默認的 GlobalFilter。
關于默認的全局過濾器的詳細內容,請參考 Spring Cloud 官網。
- 測試下,如何自定義 GlobalFilter 全局過濾器。在 com.example.filter 包下,新建一個名為 MyGlobalFilter 全局過濾器配置類,代碼如下。
-
重啟 microservice-cloud-gateway-8015,使用瀏覽器訪問“http://localhost:8015/list”或,結果如下圖。 直接報400錯誤
-
訪問“http://localhost:8015/list?acc=2”或,結果如下圖。 直接報400錯誤
下一篇:SpringCloud-26-Zuul:路由網關介紹和使用
總結
以上是生活随笔為你收集整理的SpringCloud-25-Gateway:动态路由、过滤器使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pip install 后面加个点是什么
- 下一篇: 关于TensorFlow使用GPU加速