2. zuul網關架構剖析


一. zuul網關架構剖析

 如上圖, zuul網關分為三個部分. 綠色部分, 粉色部分, 藍色部分.

1. 過濾器管理模塊(綠色模塊): 讓開發人員管理過濾器, 過濾器管理, 主要是上傳的動作和激活的動作. 過濾器上傳完是保存到數據庫中的. 開發人員可以通過界面管理過濾器的狀態. 比如,金絲雀線上激活

2. 過濾器加載模塊(粉紅色模塊): 是過濾器加載模塊, 定期的掃描過濾器, 看看過濾器有沒有變更. 過濾器管理器會先將變更的過濾器拉倒本地的過濾器目錄當中. 如果變更了,就會執行Filter Loader進行加載, 加載到網關運行時的filter Runner中

3. 過濾器運行時模塊(藍色模塊): 網關過濾器運行時模塊. 這個運行時模塊本身是一個http servlet, 可以跑在tomcat容器中的. 請求過來以后, 首先交給zuul servlet, zuul servlet再將請求交給zuul filter runner. zuul filter runner是整個網關最核心的組件.
請求會依次經過前置路油過濾器, 路由過濾器, 和后置路由過濾器. 經過過濾以后, 請求會以response的形式響應給客戶端. zuul網關最核心的部門就是過濾鏈, 依次運行過濾器. 有一個組件很重要, 就是Request Context, 當請求在zuul網關過濾鏈中流轉的時候, 他們需要共享一些過濾信息. 比如前置過濾器會設置一些信息,給路由過濾器去讀取. 信息的交換是通過Request Context, 就像是過濾器之間可以共享的存儲, 而且是線程安全的, 每個請求有一個局部的request context.

 

二. 請求處理的生命周期

 

1. 請求過來了, 首先會進入一系列的前置過濾器pre filter.

2. 前置過濾器處理完了, 進入routing filter路由過濾器, routing filter路由過濾器是真正的向后台服務發起請求, 接收響應的過濾器

3. 經過routing filter路由過濾器, 最后會傳遞過post filter 后置過濾器,進行一些后續的處理, 這時候已經拿到響應了, 然后在返回給客戶端.

4. 在這三個過濾器過濾的過程中,任何一個環節發生錯誤, 都會進入error filter. 有error filter進行統一的錯誤處理. error filter錯誤過濾器會發送給post filter, 也是以響應的方式發回給客戶端.

這是一個請求, 在網關處理的生命周期.

 

三. 過濾器基本的概念

1. 類型: 

  它被定義在路由的流程中, 過濾器被應用的階段. 有pre routing filter前置過濾器, routing filter路由過濾器, post routing filter 后置過濾器

2. 執行順序Execution Order : 在同一個type中定義過濾器執行的順序

  每一種類型的過濾器都可能有一個或者多個過濾器, 比如pre routing filter可能有多個. 他們的執行順序, 不是亂序執行的. 他們會有一個自定義的order順序.

3. 條件Criteria: 過濾器執行必須滿足的條件

  在過濾器被執行,流轉的時候, 某個過濾器到底要不要執行? 滿足什么條件執行? 這就是過濾器條件定義的. 

4. 動作Action

  如果滿足條件, 過濾器將要執行的動作是什么.

 

四. 標准的過濾器類型

 

 

1. pre:前置過濾器

在請求被路由到原服務器之前, 要執行的過濾器

  • 認證 : 認證安全, 是否符合條件, 認證為安全的才能放過
  • 選路由: 當前這個請求來了, 應該調用后面的哪個微服務呢? A還是B
  • 請求日志: 請求日志, 日志來了, 寫日志, 對其進行監控

2. routing: 路由過濾器

處理將請求發送到源服務器的過濾器

3. post

在響應從源服務器返回時要被執行的過濾器

  • 對響應增加http請求頭: 要增加調試的header日志
  • 收集統計和度量: 這次請求, 它的性能如何, 有沒有出錯? 可以搜集一些信息
  • 將響應以流的方式返回客戶端

4. error

上述三種過濾器中任何過濾器出現錯誤都要執行的過濾器

 

五. zuul網關過濾器的樣例

zuul網關過濾器是groovy的腳本, groovy腳本有一個特性是可以動態編譯的. 上傳的過濾器, 然后在zuul網關動態編譯和加載. 

 下面是一個簡單的前置路由過濾器

class DeviceDelayFilter extends ZuulFilter {

    // 這里定義過濾器的類型, pre, routing, post
    @Override
    String filterType() {
        return 'pre'
    }

    // 定義過濾器執行的順序
    @Override
    int filterOrder() {
        return 100
    }

    // 定義過濾器執行的條件
    boolean shouldFilter() {
        return RequestContext.getCurrentContext().getRouteHost() != null && RequestContext.getCurrentContext().sendZuulResponse()
    }

    // 定義過濾器執行的具體邏輯
    Object run() {
        return null
    }
}    

方法的具體含義參考上面的注釋.

 zuul 有一個自己的過濾器管理的樣例, 就是在zuul中定義了哪些過濾器

 

 

這個界面是生產過程需, 自己開發的一個管理界面. 

 

 

 

 

 

 

 

 

 

 

 

 

 

asd

 


免責聲明!

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



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