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