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

歡迎訪問 生活随笔!

生活随笔

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

javascript

Spring Cloud(七) GateWay 服务化和过滤器

發布時間:2025/3/20 javascript 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Cloud(七) GateWay 服务化和过滤器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前文回顧:

Spring Cloud(一)Eureka Server-單體及集群搭建

Spring Cloud(二) 配置Eureka Client

Spring Cloud(三) 熔斷器Hystrix

Spring Cloud(四) API網關Zuul

Spring Cloud(五) Zuul Filter

Spring Cloud(六) 服務網關GateWay 入門

注冊中心

上篇主要講解了網關代理單個服務的使用語法,在實際的工作中,服務的相互調用都是依賴于服務中心提供的入口來使用,服務中心往往注冊了很多服務,如果每個服務都需要單獨配置的話,這將是一份很枯燥的工作。Spring Cloud Gateway 提供了一種默認轉發的能力,只要將 Spring Cloud Gateway 注冊到服務中心,Spring Cloud Gateway 默認就會代理服務中心的所有服務,下面用代碼演示。

服務網關注冊到注冊中心

復制上一節的示例項目,添加 eureka 的客戶端依賴包。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>

修改 application.yml 配置文件內容如下

server:port: 8888 spring:application:name: cloud-gateway-eurekacloud:gateway:discovery:locator:enabled: true eureka:client:service-url:defaultZone: http://localhost:8000/eureka/ logging:level:org.springframework.cloud.gateway: debug

配置說明:

  • spring.cloud.gateway.discovery.locator.enabled:是否與服務注冊于發現組件進行結合,通過 serviceId 轉發到具體的服務實例。默認為 false,設為 true 便開啟通過服務中心的自動根據 serviceId 創建路由的功能。

  • eureka.client.service-url.defaultZone指定注冊中心的地址,以便使用服務發現功能

  • logging.level.org.springframework.cloud.gateway 調整相 gateway 包的 log 級別,以便排查問題

修改完成后啟動 cloud-gateway-eureka 項目,訪問注冊中心地址 http://localhost:8000/ 即可看到名為 CLOUD-GATEWAY-EUREKA的服務。

測試

將 Spring Cloud Gateway 注冊到服務中心之后,網關會自動代理所有的在注冊中心的服務,訪問這些服務的語法為:

http://網關地址:端口/服務中心注冊 serviceId/具體的url

比如我們的 spring-cloud-producer 項目有一個 /hello 的服務,訪問此服務的時候會返回:hello world。

比如訪問地址:http://localhost:9000/hello,頁面返回:hello world!

按照上面的語法我們通過網關來訪問,瀏覽器輸入:http://localhost:8888/SPRING-CLOUD-PRODUCER/hello 同樣返回:hello world!證明服務網關轉發成功。

我們將項目 spring-cloud-producer 復制一份為 spring-cloud-producer-1,將/hello服務的返回值修改為 hello world smile !,修改端口號為 9001 ,修完完成后重啟,這時候訪問注冊中心后臺會發現有兩個名為 SPRING-CLOUD-PRODUCER的服務。

在瀏覽器多次訪問地址:http://localhost:8888/SPRING-CLOUD-PRODUCER/hello,頁面交替返回以下信息:

hello world! hello world smile!

說明后端服務自動進行了均衡負載。

基于 Filter(過濾器) 實現的高級功能

Spring Cloud Gateway 的 Filter 的生命周期不像 Zuul 的那么豐富,它只有兩個:“pre” 和 “post”。

  • PRE: 這種過濾器在請求被路由之前調用。我們可利用這種過濾器實現身份驗證、在集群中選擇請求的微服務、記錄調試信息等。

  • POST:這種過濾器在路由到微服務以后執行。這種過濾器可用來為響應添加標準的 HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。

Spring Cloud Gateway 的 Filter 分為兩種:GatewayFilter 與 GlobalFilter。GlobalFilter 會應用到所有的路由上,而 GatewayFilter 將應用到單個路由或者一個分組的路由上。

Spring Cloud Gateway 內置了9種 GlobalFilter,比如 Netty Routing Filter、LoadBalancerClient Filter、Websocket Routing Filter 等,根據名字即可猜測出這些 Filter 的作者,具體大家可以參考官網內容:Global Filters

利用 GatewayFilter 可以修改請求的 Http 的請求或者響應,或者根據請求或者響應做一些特殊的限制。 更多時候我們會利用 GatewayFilter 做一些具體的路由配置,下面我們做一些簡單的介紹。

快速上手 Filter 使用

我們以 AddRequestParameter GatewayFilter 來演示一下,如何在項目中使用 GatewayFilter,AddRequestParameter GatewayFilter 可以在請求中添加指定參數。

application.yml配置示例

spring:cloud:gateway:routes:- id: add_request_parameter_routeuri: http://example.orgfilters:- AddRequestParameter=foo, bar

這樣就會給匹配的每個請求添加上foo=bar的參數和值。

我們將以上配置融入到 cloud-gateway-eureka 項目中,完整的 application.yml 文件配置信息如下:

server:port: 8888 spring:application:name: cloud-gateway-eurekacloud:gateway:discovery:locator:enabled: trueroutes:- id: add_request_parameter_routeuri: http://localhost:9000filters:- AddRequestParameter=foo, barpredicates:- Method=GET eureka:client:service-url:defaultZone: http://localhost:8000/eureka/ logging:level:org.springframework.cloud.gateway: debug

這里的 routes 手動指定了服務的轉發地址,設置所有的 GET 方法都會自動添加foo=bar,http://localhost:9000 是 spring-cloud-producer 項目,我們在此項目中添加一個 foo() 方法,用來接收轉發中添加的參數 foo。

@RequestMapping("/foo") public String foo(String foo) {return "hello "+foo+"!"; }

修改完成后重啟 cloud-gateway-eureka、spring-cloud-producer 項目。訪問地址http://localhost:9000/foo頁面返回:hello null!,說明并沒有接受到參數 foo;通過網關來調用此服務,瀏覽器訪問地址http://localhost:8888/foo頁面返回:hello bar!,說明成功接收到參數 foo 參數的值 bar ,證明網關在轉發的過程中已經通過 filter 添加了設置的參數和值。

服務化路由轉發

上面我們使用 uri 指定了一個服務轉發地址,單個服務這樣使用問題不大,但是我們在注冊中心往往會使用多個服務來共同支撐整個服務的使用,這個時候我們就期望可以將 Filter 作用到每個應用的實例上,spring cloud gateway 提供了這樣的功能,只需要簡單配置即可。

為了測試兩個服務提供者是否都被調用,我們在 spring-cloud-producer-1 項目中也同樣添加 foo() 方法。

@RequestMapping("/foo") public String foo(String foo) {return "hello "+foo+"!!"; }

為了和 spring-cloud-producer 中 foo() 方法有所區別,這里使用了兩個感嘆號。同時將 cloud-gateway-eureka 項目配置文件中的 uri 內容修改如下:

#格式為:lb://應用注冊服務名 uri: lb://spring-cloud-producer

修改完之后,重新啟動項目 cloud-gateway-eureka、spring-cloud-producer-1,瀏覽器訪問地址:http://localhost:8888/foo頁面交替出現:

hello bar! hello bar!!

證明請求依據均勻轉發到后端服務,并且后端服務均接收到了 filter 增加的參數 foo 值。

這里其實默認使用了全局過濾器 LoadBalancerClient ,當路由配置中 uri 所用的協議為 lb 時(以uri: lb://spring-cloud-producer為例),gateway 將使用 LoadBalancerClient 把 spring-cloud-producer 通過 eureka 解析為實際的主機和端口,并進行負載均衡。

總結

以上是生活随笔為你收集整理的Spring Cloud(七) GateWay 服务化和过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。

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