跟我學SpringCloud | 第十三篇:Spring Cloud Gateway服務化和過濾器

来源:https://www.cnblogs.com/babycomeon/archive/2019/07/13/11167514.html
-Advertisement-
Play Games

SpringCloud系列教程 | 第十三篇:Spring Cloud Gateway服務化和過濾器 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 上一篇文章服務網關 Spring Cloud Gat ...


SpringCloud系列教程 | 第十三篇:Spring Cloud Gateway服務化和過濾器

Springboot: 2.1.6.RELEASE

SpringCloud: Greenwich.SR1

如無特殊說明,本系列教程全採用以上版本

上一篇文章服務網關 Spring Cloud GateWay 初級篇,介紹了 Spring Cloud Gateway 的相關術語、技術原理,以及如何快速使用 Spring Cloud Gateway。這篇文章我們繼續學習 Spring Cloud Gateway 的高級使用方式,比如如何配置服務中心來使用,如何使用熔斷、限流等高級功能。

1. 註冊中心

1.1 準備服務和註冊中心

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

在介紹Zuul的時候,我們用到了Eureka和producer,本次演示還是需要他們兩個,將他們兩個CV過來。

1.2 服務網關註冊到註冊中心

上一篇用到的gateway也CV過來,在依賴文件裡面加入:

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

添加對eureka的依賴,在啟動文件加入註解@EnableEurekaClient。

修改配置文件application.yml:

server:
  port: 8080
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/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 級別,以便排查問題

修改完成後啟動 gateway 項目,訪問註冊中心地址 http://localhost:8761/ 即可看到名為 API-GATEWAY的服務。

1.3 測試

將 gateway 註冊到服務中心之後,網關會自動代理所有的在註冊中心的服務,訪問這些服務的語法為:

http://網關地址:埠/服務中心註冊 serviceId/具體的url

比如我們的 producer 項目有一個 /hello 的服務,訪問此服務的時候會返回:"hello "+name+",producer is ready"。

比如訪問地址:http://localhost:8081/hello?name=spring,頁面返回:hello spring,producer is ready。

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

我們將項目 producer 複製一份為 producer1,將/hello服務的返回值修改為 hello spring,producer1 is ready。修改埠號為 8082 ,修完完成後重啟,這時候訪問註冊中心後臺會發現有兩個名為 SPRING-CLOUD-PRODUCER的服務。

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

hello spring,producer is ready。
hello spring,producer1 is ready。

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

2. 基於 Filter(過濾器) 實現的高級功能

在Zuul高級篇中大概介紹過 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 做一些具體的路由配置,下麵我們做一些簡單的介紹。

2.1 快速上手 Filter 使用

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

2.1.1 配置application.yml示例

server:
  port: 8080
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: add_request_parameter_route
          uri: http://localhost:8081
          filters:
            - AddRequestParameter=foo, bar
          predicates:
            - Method=GET
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
logging:
  level:
    org.springframework.cloud.gateway: debug

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

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

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

2.2 服務化路由轉發

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

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

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

為了和 producer 中 foo() 方法有所區別,這裡使用了多加了4個@。同時將 gateway 項目配置文件中的 uri 內容修改如下:

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

修改完之後,重新啟動項目 gateway、producer1,瀏覽器訪問地址: http://localhost:8080/foo 頁面交替出現:

hello bar!
hello bar!@@@@

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

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

示例代碼-Github

參考:

http://www.ityouknow.com/springcloud/2019/01/19/spring-cloud-gateway-service.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 實現思路 獲取input的file 使用fileReader() 將圖片轉為base64 使用canvas讀取base64 並降低解析度 把canvas數據轉成blob對象 把blob對象轉file對象 完成壓縮 相關代碼: 最後回調函數中的files可以直接當做正常的input file 使用,如 ...
  • 裝飾器是什麼? 解碼器是將另一段代碼包裝在一個代碼中的簡單方法。 這個概念類似於你以前聽說過的功能成分和高階成分。 這在許多情況下都被使用過,也就是說,成都裝修公司簡單地將一個函數包裝到另一個函數中: 前面的示例生成包裝的新函數,它執行與 DoSomething 相同的操作,但它們的不同之處在於在包 ...
  • HTML代碼: js代碼: ...
  • 可以使用 window.location 獲取當前頁面url。以下是一些簡單應用。 ...
  • html代碼: js代碼: ...
  • 史上最全的,web前端零基礎,系統學習路線圖!學好web前端,前途寬廣!如今隨著“互聯網+”上升到國家戰略,軟體行業與國民經濟關係密,幾乎絕大多數行業的發展都會促進軟體行業的發展。 ...
  • 編譯原理課程設計詞法分析任務書 5)參考文獻: (1)張素琴,呂映芝. 編譯原理[M]., 清華大學出版社 (2)蔣立源、康慕寧等,編譯原理(第2版)[M],西安:西北工業大學出版社 6)課程設計進度安排 1.準備階段(4學時):選擇設計題目、瞭解設計目的要求、查閱相關資料 2.程式模塊設計分析階段 ...
  • 舉個慄子 問題描述 要求有一個簡歷類,必須要有姓名,可以設置性別和年齡,可以設置工作經歷,最終需要三份簡歷。 簡單實現 簡歷類 測試 測試結果 存在的問題 跟手寫簡歷沒有差別,三份簡歷需要三份實例化,如果客戶需要二十份簡歷,那就得實例化二十次。 原型模式 定義 用原型實例指定創建對象的種類,並且通過 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...