日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringCloud-25-Gateway:动态路由、过滤器使用

發布時間:2024/1/8 javascript 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringCloud-25-Gateway:动态路由、过滤器使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

9.4 Spring Cloud Gateway 動態路由

  • 默認情況下,Spring Cloud Gateway 會根據服務注冊中心(例如 Eureka Server)中維護的服務列表,以服務名(spring.application.name)作為路徑創建動態路由進行轉發,從而實現動態路由功能。

  • 我們可以在配置文件中,將 Route 的 uri 地址修改為以下形式。

lb://service-name
  • 以上配置說明如下:

    • lb:uri 的協議,表示開啟 Spring Cloud Gateway 的負載均衡功能。
    • service-name:服務名,Spring Cloud Gateway 會根據它獲取到具體的微服務地址。
  • 測試下 Spring Cloud Gateway 是如何實現動態路由的, 修改microservice-cloud-gateway-8015 中 application.yml 的配置,使用注冊中心中的微服務名創建動態路由進行轉發,配置如下。

server:port: 8015 spring:application:name: microServiceCloudGateway #微服務名稱,對外暴漏的微服務名稱,十分重要cloud:gateway: #網關路由配置discovery:locator:enabled: true #默認值為 false,即默認不開啟從注冊中心動態創建路由的功能,利用微服務名進行路由。啟用 DiscoveryClient 網關集成routes:- id: provider_deptlist_route #路由 id,沒有固定規則,但唯一,建議與服務名對應uri: lb://MICROSERVICECLOUDPROVIDERDEPT #動態路由,使用服務名代替上面的具體帶端口predicates:#以下是斷言條件,必選全部符合條件- Path=/dept/** #斷言,路徑匹配 注意:Path 中 P 為大寫- Method=Get #只能時 GET 請求時,才能訪問#將 microservice-cloud-provider-dept-8001 提供的服務隱藏起來,不暴露給客戶端,只給客戶端暴露 API 網關的地址 9527#eureka配置,Spring cloud 自定義服務名稱和 ip 地址 eureka:client:fetch-registry: trueregister-with-eureka: trueservice-url:#defaultZone: http://localhost:7001/eureka/ #這個地址是 7001注冊中心在 application.yml 中暴露出來額注冊地址 (單機版)defaultZone: http://eurekaserver7001.com:7001/eureka/,http://eurekaserver7002.com:7002/eureka/,http://eurekaserver7003.com:7003/eureka/ #將服務注冊到 Eureka Server 集群instance:instance-id: microservice-cloud-gateway-8015 #自定義服務名稱描述信息prefer-ip-address: true #顯示訪問路徑的 ip 地址hostname: microservice-cloud-gateway#zookeeper需要配置那些服務service被掃描,eureka則是將整個服務包注冊進去了ribbon:eager-load:enabled: true #關閉懶加載# 指的是建立連接后從服務器讀取到可用資源所用的時間ReadTimeout: 6000# 指的是建立連接所用的時間,適用于網絡狀態正常的情況下,兩端連接所用的時間ConnectTimeout: 6000MaxAutoRetriesNextServer: 1MaxAutoRetries: 1 # spring cloud 使用 Spring Boot actuator 監控完善信息 # Spring Boot 2.50對 actuator 監控屏蔽了大多數的節點,只暴露了 heath 節點,本段配置(*)就是為了開啟所有的節點 # zuul中包含actuator依賴 management:endpoints:web:exposure:include: health,info,hystrix.stream #應包含的端點 ID 或 '' 全部,* 在yaml 文件屬于關鍵字,所以需要加雙引號#include的值也可以改成*,但建議還是最小暴露原則,用啥開啟啥info:env:enabled: true #啟用配置里的info開頭的變量info: #配置一些服務描述信息,監控信息頁面顯示,,可以判斷服務是否正常app.name: microservice-cloud-zuul-8010company.name: cloud.zk.comauth: zkemail: 123@qq.combuild.aetifactId: @project.artifactId@build.version: @project.version@#網關路徑http://cloud.zk.com:8010/microservicecloudproviderdepthystrix/dept/getInfo/Hystrix/200/1
  • 依次啟動 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: routes:- id: xxxxuri: xxxxpredicates:- Path=xxxxfilters:- AddRequestParameter=X-Request-Id,1024 #過濾器工廠會在匹配的請求頭加上一對請求頭,名稱為 X-Request-Id 值為 1024- PrefixPath=/dept #在請求路徑前面加上 /dept……
  • 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 中在修改成一個包含斷言和過濾器動態路由,配置內容如下。
spring:application:name: microServiceCloudGateway #微服務名稱,對外暴漏的微服務名稱,十分重要cloud:gateway: #網關路由配置discovery:locator:enabled: true #默認值為 false,即默認不開啟從注冊中心動態創建路由的功能,利用微服務名進行路由。啟用 DiscoveryClient 網關集成routes:- id: provider_deptlist_route #路由 id,沒有固定規則,但唯一,建議與服務名對應uri: lb://MICROSERVICECLOUDPROVIDERDEPT #動態路由,使用服務名代替上面的具體帶端口predicates:#以下是斷言條件,必選全部符合條件- Path=/** #斷言,路徑匹配 注意:Path 中 P 為大寫- Method=Get #只能時 GET 請求時,才能訪問#將 microservice-cloud-provider-dept-8001 提供的服務隱藏起來,不暴露給客戶端,只給客戶端暴露 API 網關的地址 9527filters:- PrefixPath=/dept #在請求路徑上增加一個前綴 /dept
  • 重啟 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 全局過濾器配置類,代碼如下。
package com.example.filter;import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono;/*** @author CNCLUKZK* @create 2022/9/24-1:21*/ @Component @Slf4j public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("進入自定義全局過濾器!");String acc = exchange.getRequest().getQueryParams().getFirst("acc");if (acc ==null) {log.info("參數 acc 不能為 null!");exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {//過濾器的順序,0 表示第一個return 0;} }
  • 重啟 microservice-cloud-gateway-8015,使用瀏覽器訪問“http://localhost:8015/list”或,結果如下圖。 直接報400錯誤

  • 訪問“http://localhost:8015/list?acc=2”或,結果如下圖。 直接報400錯誤

下一篇:SpringCloud-26-Zuul:路由網關介紹和使用

總結

以上是生活随笔為你收集整理的SpringCloud-25-Gateway:动态路由、过滤器使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。