服務網關之SpringCloudGateway


服務網關應用場景

一般微服務架構如下圖

后端服務比較健全,但是當涉及到前后端交互時,存在如下問題:

1,客戶端需要維護服務端的各個地址,代碼困難

2,認證、鑒權復雜

3,跨域問題嚴重

為了解決以上問題,微服務架構的五大關鍵技術之一服務網關就登場了。

服務網關

  所謂服務網關(API網關),就是指系統的統一入口,它封裝了應用程序的內部結構,為客戶提供統一服務,一些與業務本身無關的公共邏輯可以在這里實現,諸如認證、鑒權、監控、路由轉發等等。常見的服務網關有Nginx+lua、Kong、Zuul、SpringCloudGateway。

 SpringCloudGateway

  SpringCloudGateway是Spring公司基於Spring5.0、SpringBoot2.0、Project Reactor等技術開發的網關,它旨在為微服務架構提供一種簡單有效統一的API路由管理方式。它的目標是替代Netflix Zuul,其不僅提供統一的路由方式,並且基於Filter鏈的方式提供了網關的基本功能更,例如:安全、監控和限流。

優點:

  性能強勁,是第一代網關Zuul的1.6倍。

  功能強大,內置了很多實用功能,例如轉發、監控、限流等。

  設計優雅,容易擴展。

缺點:

  其實現依賴Netty與WebFlux,不是傳統的Servlet編程模型,學習成本高。

  不能將其部署在tomcat、Jetty等Servlet容器里,只能打成jar包執行。

  需要SpringBoot2.0及以上的版本。

Gateway路由

  路由(Route)是Gateway中最基本的組件之一,表示一個具體的路由信息載體。主要定義了下面幾個信息:

  id:路由標識符,區別於其他Route。

  uri:路由指向的目的地uri,即客戶端請求最終被轉發到的微服務。

  order:用於多個Route之間的排序,數值越小排序越靠前,匹配優先級越高。

  predicate:斷言的作用是進行條件判斷,只有判斷都發返回真,才會真正的執行路由。

  filter:用於修改請求和響應信息。

Gateway斷言

  Predicate(斷言、謂詞)用於進行條件判斷,只有斷言都返回真,才會真正執行路由。即在什么條件下,才能進行路由轉發。

  Gateway中有許多內置斷言工廠,這些斷言都與http請求的不同屬性匹配,比較常見的有:基於Datetime類型的斷言工廠、基於遠程地址的、基於Header的、基於Host的、基於Path的......

Gateway過濾器

  過濾器(filter)就是在請求的傳遞過程中,對請求和響應做一些處理。生命周期為pre和post。

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

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

  在Gateway中內置了很多不同種類的網關路由過濾器,常見的有:addRequestHeader、addRequestParameter、addResponseHeader、addResponseParameter、Hystrix、PrefixPath......

  全局過濾器作用於所有路由,無需配置,通過全局過濾器可以實現對權限的統一鑒權、安全驗證等功能。Gateway內置的全局過濾器如下:

   內置的過濾器可以完成絕大多數功能,但是對於企業開發的一些業務功能處理,還能需要我們自己編寫過濾器來實現的,那么我們一起通過代碼的形式自定義一個過濾器,去完成統一的權限校驗。

自定義全局過濾器,開發鑒權邏輯:

  1. 當客戶端第一次請求服務時,服務端對用戶進行信息認證(登錄)。
  2. 認證通過,將用戶信息進行加密形成token,返回給客戶端,作為登錄憑證。
  3. 以后每次請求,客戶端都攜帶認證的token
  4. 服務端對token進行解密,判斷是否有效

 網關限流

  sentinel提供了gateway的適配模塊,可以提供兩種資源維度的限流。

  route維度:即在spring配置文件中配置的路由條目,資源名為對應routeId。

  自定義API維度:用戶可以利用提供的API來自定義一些API分組。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM