優秀網關應該具備的功能

基礎功能:

1 路由轉發

  路由轉發是網關最最基礎的功能,沒有之一,一個不具備轉發功能的網關不具備任何使用價值。轉發功能的優劣取決於轉發策略的豐富度,常用的轉發策略有基於host轉發、path轉發、加權輪詢、根據自己業務場景在request中根據header內容進行轉發等等。在實現這些邏輯時我們要注意一些網關層的“潛規則”,例如最長匹配規則(當host或path同時滿足多個匹配規則時要把請求路由到匹配度最精確的目的地)、IpSource規則(儘量將同一客戶端ip請求路由到同一個目的地)。

2 過濾增強

  之所以叫增強,是借鑑了AOP中的概念,分爲前置增強、後置增強、環繞增強、異常增強等等,在網關層就是指對request或response報文的修改。通過給增強器設置order來協調它們之間的優先級。過濾增強是網關層與業務息息相關的核心功能,如果一個網關層不具備過濾增強,那我們也沒有使用它的必要。

3 限流保護

  限流保護雖然不是網關層最核心的功能,但往往是業務部門願意接入網關層的最重要原因,因爲在代碼設計上並不是所有的服務節點都開發了自我流量保護,所以躲在網關層下面是個不錯的選擇。限流保護的策略也很多,按不同的維度也可以拆分爲不同的策略。按南向是否動態擴容縮容可以分爲靜態限流和動態限流。靜態限流是固定了限流的閾值,常用於物理機房或包年包月機器;動態限流會根據真實服務能力做動態的閾值變更,常用於雲平臺具備彈性能力的服務節點。按統計方式可以分爲信號量限流和連接數限流,前者可以理解爲打點器,後者是維護連接數。

4 XFF維護

  該功能在網關層雖然可有可無,但是這是Http協議中規定作爲網關層必須要遵守的“潛規則”,網絡中每一層代理都要在X-Forwarded-For中追加自己的ip,這一點很容易被忽視。

 

輔助功能:

1 動態配置

  網關不同於其他產品可以隨時更新,穩定性永遠是網關的第一要求,所以盡最大可能通過配置來影響網關並且支持熱更新,否則頻繁的迭代或重啓是一個生產級別網關不能容忍的。動態配置框架推薦netfix的archaius,支持很多種動態加載方式。

2 灰度策略

  這個功能點是緊接着動態配置來講的,因爲網關的任何一次配置的變更影響的不僅是網關層本身,而是整個網關覆蓋到的所有業務,極端情況下一次配置錯誤可能會引起所有業務的崩潰!所以勢必需要一個灰度的過程來避免全網癱瘓,所以網關層配置更新、新版本發佈等都必須要支持灰度策略,先少量機器嘗試下,確定安全無害後再全網點更新。

3 自我保護

  網關層作爲所有流量的唯一入口,自我保護也是相當重要的。

  第一,限流保護。此處的限流不是南向的限流,而是北向的限流,保證網關層自身不被洪峯壓垮。常用的限流策略是令牌桶,優先保證拿到令牌的http請求,溢出部分不予理會。

  第二,超時服務剔除。網關層的資源是所有業務公用的,如果有響應超時、南向無返回、一直等待等情況出現會導致網關資源無法釋放。雖然新一代的NIO網關中開銷可以小的忽略不計,但“勿以惡小而爲之”,假如沒有一套剔除機制整個網關處理能力越來越差,最終資源耗盡引發重大故障。

4 訪問日誌

  訪問日誌看似可有可無,對整個網關服務沒任何價值,但這是日常運維中鏈路分析的數據依據,否則你連自己對一次請求處理了多少時長、request是什麼、response是什麼、http方法是什麼、返回code是什麼都清楚。

  日誌不要洛本地,不要洛本地,不落本地,重要的事情說三遍,因爲日誌量會大到你根本落不下。

5 請求重試

  該功能不強求,因爲重試需要建立在南向提供服務的節點具備冪等性,否則重試不但不會帶來任何收益,還會造成災難。一般來講"GET", "HEAD", "OPTIONS"這三種http方法的請求是需要重試的。

6 統計與監控

  網關層一般需要提供入網流量波動圖、頻響圖等統計報表,還需要配合監控系統提供監控數據,例如Prometheus的exporter,雖然這些通過訪問日誌也可以在日誌收集端清洗出來,但無論是從時效性還是成本上考慮都不如網關層直接提供來的方便。

 

高階功能:

1 擴展性

  擴展性是任何產品從設計初就應該作爲第一優先考慮的部分,一般分爲水平擴展和垂直擴展兩個維度。水平擴展是通過更多的服務器來提供更高的併發,垂直擴展是通過寫入更多的代碼邏輯來提供更廣的服務。

2 性能調優

  優秀的網關響應時間一定要足夠的低,個人認爲要控制在10ms以內,不能讓南向感知到明顯的延時,否則就是失敗品。調優的策略基本就是算力與存儲的平衡,也就是時間和空間的交換。是犧牲時間換空間,還是犧牲空間換時間,如果網關層部署在雲平臺,理論上可以採購到任何你需要的機型,那麼一定要把響應時間作爲唯一參考。因爲響應時間越低,相同併發下qps就越高。

3 動態過濾器

  這一點我認爲是網關層的加分項吧,並不是必須的,但隨着混沌工程這一理念的興起,動態過濾器這個加分項的分值會越來越高。我們把常駐的過濾器稱爲靜態過濾器,把需要隨便創建並只使用一段時間的過濾器稱爲動態過濾器。例如混沌工程要模擬某種故障,計算節點上從http請求的header中是否存在該故障的標籤爲啓動故障的判斷依據,那麼就可以創建一個動態過濾器爲滿足一定需求的http請求打上混沌工程需要的標籤,混沌測試結束或達到超時時間點時該過濾器自動刪除。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章