1. 程式人生 > 程式設計 >一文帶你瞭解什麼是Zuul閘道器

一文帶你瞭解什麼是Zuul閘道器

著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

Zuul閘道器和基本應用場景

API閘道器是如何演化出來的?

看下面這幅圖:

  • 單體應用:瀏覽器發起請求,請求直接打到單體應用所在的機器上,應用從資料庫查詢資料原路返回給瀏覽器,對於單體應用來說,它只有一個,不需要閘道器。
  • 微服務:微服務的應用可能部署在不同機房,不同地區,不同域名下。此時客戶端(瀏覽器/手機/軟體工具)想要請求對應的服務,都需要知道機器的具體的IP或者域名URL,當微服務例項眾多時,這是難以記憶的。此時就有了閘道器,客戶端相關的請求直接傳送到閘道器,由閘道器根據請求標識解析判斷出具體的微服務ip,再把請求轉發到微服務例項。這其中的記憶功能就全部交由閘道器來操作了。

API閘道器基本功能

閘道器到底是幹嘛的?有什麼用呢?關於閘道器的功能請看下圖:

這裡重點介紹Netflix Zuul閘道器 主要是因為:

  • 可動態釋出的過濾器機制
  • 同時也被整合入Spring Cloud體系

zuul 在 Netflix的使用情況(2017)

同時在國內也有很多優秀的應用案例,比如:

Zuul閘道器高階應用場景

紅綠部署

如圖右側,有紅綠2個顏色的服務叢集,從中可以看出綠色是v1版本,紅色是v2版本。可以通過閘道器控制客戶端請求具體請求到紅色還是綠色的服務例項。

開發者測試分支

同上邏輯類似,通過閘道器配置將請求轉發到test環境是服務例項。

埋點測試

同上邏輯類似,通過閘道器配置將請求轉發到有埋點的環境服務例項。

壓力測試

同上邏輯,不影響生產服務例項情況下,閘道器配置控制部分客戶端請求或擬造請求到壓力測試環境的服務例項。

除錯路由

客戶端有多種不同的裝置,通過閘道器配置,可以將制定的裝置請求路由轉發到指定環境的服務例項。

金絲雀測試

粘性金絲雀

失敗注入測試

降級測試

相關測試概念參考金絲雀釋出、滾動釋出、藍綠髮布到底有什麼差別?關鍵點是什麼?

跨區域的高可用

如圖所示:當請求打到US-West-2機器是,該機器內的服務例項掛了,但閘道器可以正常執行,可以通過配置閘道器,在請求服務例項返回失敗的時候,主動再將請求轉發到其它服務所在的機器上的閘道器繼續處理,也就是zuul閘道器叢集實現高可用。

防爬防攻擊

健康檢查和遮蔽壞節點

Zuul閘道器架構剖析

Zuul閘道器架構

  • Zuul Servlet:zuul的servlet容器
  • Zuul Filter Runner:zuul執行filter的處理器
  • Pre routing Filter:zuul請求的前置過濾器
  • Routing Filter:zuul請求的路由放行過濾器
  • Post routing Filter:zuul請求的後置過濾器
  • Request Context:zuul servlet的上下文
  • Filter Loader:filter載入器
  • Filter File Manager:filter內容管理器
  • Filter Directory:filter過濾器存放路徑
  • Filter Publisher:釋出filter的處理類
  • Filter Persister:持久化filter的處理類
  • Filter Poller:輪詢Persister中的filter並將新filter推送至Filter Directory

請求處理生命週期

  1. http傳送請求到zuul閘道器
  2. zuul閘道器首先經過pre filter;
  3. 驗證通過後進入routing filter,接著將請求轉發給遠端服務,遠端服務執行完返回結果,如果出錯,則執行error filter;
  4. 繼續往下執行post filter;
  5. 最後返回響應給http 客戶端。

過濾器關鍵概念

  • 型別Type: 定義在路由流程中,過濾器被應用的階段
  • 執行順序Execution Order: 在同一個Type中,定義過濾器執行的順序
  • 條件Criteria: 過濾器被執行必須滿足的條件
  • 動作Action: 如果條件滿足,過濾器中將被執行的動作

zuul中的過濾器型別

  • PRE:在請求被路由到源伺服器前要執行的過濾器
    • 認證
    • 選路由
    • 請求日誌
  • ROUTING:處理將請求傳送到源伺服器的過濾器
  • POST:在響應從源伺服器返回時要被執行的過濾器
    • 對響應增加HTTP頭
    • 收集統計和度量
    • 將響應以流的方式傳送回客戶端
  • ERROR:上述階段中出現錯誤要執行的過濾器

過濾器樣例Demo

import javax.servlet.http.HttpServletRequest;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
 
public class PreFilter extends ZuulFilter {
 
  @Override
  public String filterType() {
    return "pre";
  }
 
  @Override
  public int filterOrder() {
    return 1;
  }
 
  @Override
  public boolean shouldFilter() {
    return true;
  }
 
  @Override
  public Object run() {
    RequestContext ctx = RequestContext.getCurrentContext();
    HttpServletRequest request = ctx.getRequest();
 
    System.out.println("Request Method : " + request.getMethod() + " Request URL : " + request.getRequestURL().toString());
    return null;
  }
}
複製程式碼

統一Filter管理介面

因為zuul有可動態釋出的過濾器機制,所有可以有一個頁面來管理zuul閘道器的過濾器,使得閘道器的可定製性,可變性更強大。