造輪子:大廠為何都要自研API網關?
又到了給大家分享新項目的時刻了。當業務發展到一定程度時,會對系統進行分布式或微服務的改造,如果不對改造后的系統進行精心的設計,就會導致對外暴露大量的API,難以統一管理和維護,一種簡單的方式就是引入API網關來對這些日益劇增的API進行統一管理和維護。
一、前言
隨著互聯網的發展,互聯網企業的業務也在飛速發展,進而促使系統的架構也在不斷的變化。總體來說,系統的架構大致經歷了:單體應用架構—垂直應用架構—分布式架構—SOA架構—微服務架構的演變。當然,很多互聯網企業的系統架構已經向Service Mesh(服務化網格)演變。
隨著微服務化的不斷普及,線上應用越來越多,并且各個應用都需要對外暴露自身的API接口,這就會導致對外暴露大量的API接口,難以統一管理和維護,并且客戶端需要明確知曉各個微服務的具體訪問地址,這無疑又增加了客戶端開發的復雜度。
此時,如果設計和研發一套高性能的API網關服務,由API網關服務統一作為后端微服務的流量入口,客戶端只需要訪問API網關,不需要關心后端微服務的具體訪問地址,只需要將請求發送給API網關,由API網關統一轉發即可。
二、什么是API網關
API網關是一種用于管理、控制和保護API(應用程序編程接口)的中間層服務。它位于客戶端和后端服務之間,充當了一個統一的入口點,處理所有進出系統的請求,總體來說,API網關提供了如下功能。
圖片
可以看到,API網關總體上會支持如下功能。
(1)路由和轉發
接收來自客戶端的請求,并根據預定義的路由規則將請求轉發到相應的后端服務或微服務。這種路由功能可以基于請求的路徑、方法、頭部信息等進行配置。
(2)協議轉換
將來自客戶端的請求從一種協議轉換為另一種協議,例如將HTTP請求轉換為HTTPS請求,或者將REST請求轉換為SOAP請求,將HTTP請求轉換成RPC或者WebSocket請求等。
(3)請求和響應轉換
對請求和響應的內容進行轉換,例如修改請求和響應的頭部信息、參數重命名、請求體的轉換、響應體的格式化等。
(4)安全認證和授權
對客戶端進行身份驗證,并根據預先定義的訪問控制策略對請求進行授權。這可以包括基于令牌、API密鑰、OAuth等機制的認證和授權。
(5)灰度發布和版本管理
支持灰度發布和版本管理,使開發人員可以逐步發布新版本的API,并控制不同版本之間的流量分配。
(6)服務注冊與發現
與服務發現和注冊中心集成,動態地發現和注冊后端服務的地址和可用性信息,以實現自動化的負載均衡和故障恢復。
(7)多協議支持
支持多種協議,如HTTP、HTTPS、WebSocket、RPC等,可以處理不同類型的請求和響應,并與各種類型的客戶端和后端服務進行通信。
(8)流控與配額管理
實施流量限制和配額管理策略,限制每個用戶或每個應用程序的訪問頻率和使用配額,防止惡意用戶或異常情況導致的過度訪問和資源浪費。
(9)多環境支持
支持多個環境(如開發環境、測試環境、生產環境等)的部署和管理,可以在不同的環境中靈活配置和管理API網關實例,滿足不同環境的需求和要求。
(10)流量控制
實施流量控制策略,包括限制請求的速率、配額管理、訪問頻率限制等,以防止過度使用或濫用API資源。
(11)監控和日志記錄
記錄請求和響應的詳細信息,包括請求來源、目標服務、處理時間、錯誤狀態等,并生成日志以供監控、故障排除和審計請求使用。
(12)緩存請求與響應
緩存經常請求的數據或響應,以減少對后端服務的請求,提高性能并減少延遲。
(13)負載均衡
分配請求到多個相同功能的后端服務實例中,以實現負載均衡,提高系統的可伸縮性和可用性。
(14)容錯處理
捕獲和處理請求中的錯誤,并向客戶端返回適當的錯誤信息,提高用戶體驗并幫助開發人員診斷和解決問題。
(15)內容轉換和協議適配
根據客戶端的需求,對請求和響應的內容進行轉換,例如將JSON格式的請求轉換為XML格式,或者將響應的內容進行壓縮或解壓縮,以適應不同的客戶端或后端服務的需求。
(16)統一性能優化
隨著服務的增加和用戶量的增長,需要確保系統能夠處理高并發的請求,并且能夠平滑處理突發流量。API網關可以幫助優化性能,并實現流量控制和限流。
(17)身份驗證與授權管理
可以對客戶端進行身份驗證,并根據預先定義的訪問控制策略對請求進行授權。這可以包括基于令牌、API密鑰、OAuth等機制的認證和授權。
(18)其他功能支持
API網關還能實現很多除了上述功能外的其他功能,例如,多租戶等。
三、大廠為何都要自研API網關
高性能API網關的出現是互聯網發展與系統架構不斷迭代更新的必然趨勢,已經成為各大互聯網公司中必不可少的基礎組件。
總體來說,高性能API網關的出現是為了解決互聯網飛速發展過程中,企業系統微服務化后統一管理和維護API接口的問題,并且高性能API網關的功能遠遠不只是管理和維護API接口那么簡單。
圖片
總體來說,高性能API網關出現的原因包括如下一些原因。
(1)微服務架構的普及
微服務架構將應用程序拆分為小型、自治的服務。這種架構增加了系統中服務的數量和復雜性,需要一個中心化的方式來管理這些服務的通信和訪問,需要對這些小型、自治的服務進行統一的API管理和維護。
(2)服務治理的需求
隨著服務數量的增加,服務之間的通信變得更加復雜,需要管理服務的發現、負載均衡、故障處理等方面的問題。API網關可以作為一個中心化的控制點,提供服務治理的功能。
(3)安全和授權的需求
隨著服務的開放和共享,安全性成為一個重要的關注點。API網關可以提供安全功能,如身份驗證、授權和訪問控制,確保只有授權的用戶可以訪問服務。
(4)性能優化和流量控制
隨著服務的增加和用戶量的增長,需要確保系統能夠處理高并發的請求,并且能夠平滑處理突發流量。API網關可以幫助優化性能,并實現流量控制和限流。
(5)簡化客戶端訪問
在面向不同客戶端的應用中,可能需要提供不同的接口版本、數據格式或協議。API網關可以隱藏底層服務的細節,向客戶端提供統一的接口,從而簡化客戶端的訪問和集成過程。
(6)協議轉換和數據格式轉換
不同的服務可能使用不同的通信協議和數據格式,需要一個中心化的方式來處理這些轉換。API網關可以充當轉換器,將不同格式的請求轉換為后端服務理解的格式,并將響應轉換回客戶端期望的格式。
(7)集成第三方服務
在服務開發的過程中,經常需要集成各種第三方服務,如支付網關、身份驗證服務等。API網關可以作為一個中心化的集成點,簡化與第三方服務的集成和管理。
(8)日志記錄和監控
收集關于請求和響應的日志信息,以及有關系統性能和健康狀況的監控指標。這些信息對于故障排除、性能優化和安全審計非常有幫助。
(9)降低開發成本和復雜性
通過集中管理和控制API,API網關可以降低開發人員的工作量和系統的復雜性。開發人員無需為每個服務實現安全、授權、監控等功能,而是將這些任務交給API網關來處理。
(10)支持多種部署模式
API網關可以部署在云端、本地或混合云環境中,以滿足不同組織和應用的需求。它可以作為一個獨立的服務或與其他組件集成,靈活適應各種部署場景。
(11)易擴展和定制化
提供豐富的插件和擴展機制,使開發人員可以根據自己的需求定制和擴展功能。這種靈活性使得API網關能夠適應不同的業務場景和需求變化。
(12)服務級別協議和合規性要求
許多應用程序需要滿足特定的服務級別協議或合規性要求,如GDPR、HIPAA等。API網關可以幫助確保服務的可靠性、可用性和合規性,通過監控、限流等方式保障SLA,并通過加密、審計等方式保障合規性。
(13)支持異構系統和技術棧
由于企業應用程序往往由多個系統和技術棧組成,API網關可以作為一個統一的接入點,將不同系統和技術棧的服務統一暴露給客戶端。
(14)其他需求
企業在建設分布式、微服務系統過程中的其他需求,例如,服務治理、灰度發布,API版本管理等等需求。
四、為何要學習API網關
對于技術人為何要學習API網關這個問題,其實最簡單,最本質的答案就是:實際工作需要,跳槽升職加薪需要。還有一個次要的原因就是所有的互聯網大廠,幾乎所有的互聯網企業都會用API網關。
所以,無論是想進更好的大廠,還是讓自己有個更好的發展前景,就需要對API網關有所了解。
API網關是整個微服務集群的訪問入口,具備超高并發和超高性能的特性。高性能API網關背后涉及到的高并發、高性能、高可用、高可擴展的技術設計思路和架構模式與架構思想等多方面的技術知識,非常考驗設計者在技術上的思維嚴謹程度以及技術的深度和廣度。
并且在高性能API網關中涉及到的技術和知識,是一個程序員通往高級架構師必須要掌握的知識,這些知識也是進互聯網大廠必備的核心知識。
接下來,我們就從技術發展層面和具體項目層面來聊聊技術人為何要學習高性能Polaris網關。
4.1 技術發展層面
從大的方向來講,技術人能夠從高性能Polaris網關中學習到如圖1-3所示的技能。
圖片
(1)學習編程技術
通過學習高性能Polaris網關,我們可以學習到超高并發場景下的基礎中間件的通信協議和網絡編程知識、提高自己的編程能力。
(2)學習中間件架構設計
API網關是所有互聯網大廠必備的應對超高并發場景的基礎中間件,學習高性能Polaris網關,可以了解中間件的架構設計和研發過程,學習在架構設計層面,Polaris網關是如何做到應對超高并發場景的。并且,Polaris網關的架構設計模式和架構設計思想可以應用到任何高并發中間件的架構設計中。
(3)學習超高并發技術
高性能Polaris網關的核心技術棧并不依賴Spring、SpringBoot等框架,采用應對高并發場景的Netty、Disruptor框架、異步交互使用asynchttpclient等(具體技術選型參見:《又又又一個高性能網關項目,正式啟動!》一文),目的就是為了使Polaris網關的性能不要受到Spring、SpringBoot等框架的影響。
(4)學習系統監控技術
Polaris網關的各項指標,我們會對接監控。所以,在高性能Polaris網關中,我們會使用到各種系統監控技術,包括:日志監控、性能監控、報警與通知、問題追蹤與診斷、系統資源管理、容器的監控、可視化分析,通過系統監控技術,可以及時獲得系統的狀態和性能信息,以便進行故障排查、性能優化和資源管理。
(5)提升硬核技術功底
通過高性能Polaris網關的學習,不僅僅可以學到很多應對超高并發場景的基礎中間件的架構設計和研發,更能系統性的提升自己的硬核技術功底,從根本上掌握應對超高并發場景的核心技術和高性能技術。并且Polaris網關會比一些成熟的開源網關性能更高,真正掌握超高并發、超高性能的編程技術。
(6)開闊技術視野
互聯網大廠都在自研自己的API網關,并且冰河在互聯網大廠基礎軟件架構部門沉淀多年,從零開始深度主導和參與了眾多基礎中間件的架構設計和研發流程,通過帶大家從零開始架構設計和研發Polaris網關,讓大家充分了解互聯網大廠架構和研發基礎中間件的流程,掌握超高并發編程的核心技術,為我們的職業發展提供更多的機會。
通過這些方面的綜合提升,能夠讓大家從根本上提升自己的技術能力、架構水平、編程內功、技術視野和應對超高并發的實際場景能力,編寫高性能、穩定可靠的代碼,這種綜合能力,才是程序員最需要提升的能力,最需要沉淀下來的寶貴經驗。
4.2 具體項目層面
說到具體項目層面,在高性能Polaris網關中,不管是后端還是運維方面,我們都能夠學習到具體的技術。
后端:熟練掌握應對超高并發場景的高性能組件:Netty和Disruptor,并能夠將其靈活應用到自身項目中。
后端:熟練掌握異步交互式框架asynchttpclient,從根本上掌握asynchttpclient框架的高性能設計。
后端:熟練掌握caffeine和guava緩存技術,提升Polaris網關的整體性能。
后端:熟練掌握protobuf和json等序列化技術,掌握高性能序列化技巧。
后端:熟練掌握主流的注冊中心技術,包括但不限于Etcd、Nacos、Zookeeper。
后端:熟練掌握Git、GitCode,對代碼工程的管理、新建代碼分支、靈活切換代碼分支、拉取與推送代碼、合并代碼等。
后端:掌握將真實場景需求轉化成架構設計的方法論,架構設計原則、系統邊界劃分與維護。
后端:熟練掌握單元測試、JMeter壓力測試工具,持續交付高質量代碼。
運維:熟練掌握Docker的部署與各種Docker命令,掌握Docker前后端鏡像的構建。
運維:熟練掌握Git、GitCode,對代碼工程的管理、新建代碼分支、靈活切換代碼分支、拉取與推送代碼、合并代碼等。
運維:熟練掌握OpenResty的配置與運維,并能夠基于OpenResty配置長鏈接轉發、配置SSL與WSS協議等。、
運維:熟練掌握使用Grafana、Prometheus對系統進行監控,包含:JVM、服務器內存、磁盤、IO、數據庫、中間件、應用服務(QPS、TPS、TTL、訪問量等)的完整鏈路監控。
通過學習高性能Polaris網關,能夠讓大家清晰的認識到自己在技術方面的不足,及時查漏補缺,更重要的是能夠學習到項目從需求立項、架構設計到編碼實現,從單元測試、集成測試、系統測試,到全鏈路壓測,再到部署上線,最后到運維監控的全流程項目周期。
所以,認真學習高性能Polaris網關,有助于我們更好的提升自己的架構水平、編程內功和解決實際場景問題的能力,也能夠不斷提升我們的技術視野,掌握前沿的技術,不管是實際工作需要,還是跳槽升職加薪需要,最終都能夠游刃有余了。