前言:長(zhǎng)亮科技API網(wǎng)關(guān)自誕生以來(lái),已在交通銀行、渤海銀行、民生銀行信用卡、北農(nóng)商等幾十家金融客戶項(xiàng)目應(yīng)用,在高性能和高可靠方面經(jīng)歷了大量的生產(chǎn)實(shí)踐考驗(yàn)。
隨著微服務(wù)架構(gòu)的發(fā)展,原本粗粒度的應(yīng)用被拆分為眾多細(xì)粒度的微服務(wù),每個(gè)服務(wù)都有其需要對(duì)外暴露的API服務(wù),服務(wù)之間的調(diào)用變得錯(cuò)綜復(fù)雜,微服務(wù)及其API的統(tǒng)一管理、API的安全防范、流量轉(zhuǎn)發(fā)、流量治理等問(wèn)題變得尤為突出。
破局—引入API網(wǎng)關(guān)
如何解決這些問(wèn)題?
那就需要在客戶端和服務(wù)之間引入一個(gè)額外層,作為從客戶端向服務(wù)發(fā)起請(qǐng)求路由的反向代理,類似面向?qū)ο笤O(shè)計(jì)中的外觀模式,為封裝底層系統(tǒng)架構(gòu)的API提供了一個(gè)單一入口,稱為API網(wǎng)關(guān)。
簡(jiǎn)而言之,API網(wǎng)關(guān)就是用一套單一且統(tǒng)一的API入口點(diǎn),來(lái)組合一個(gè)或多個(gè)內(nèi)部API。通過(guò)引入API網(wǎng)關(guān),能夠?qū)PI的生命周期進(jìn)行統(tǒng)一管理,API網(wǎng)關(guān)接管所有的入口流量,將所有用戶的請(qǐng)求轉(zhuǎn)發(fā)給后端的服務(wù)器。
但網(wǎng)關(guān)做的僅僅是轉(zhuǎn)發(fā)這么簡(jiǎn)單嗎?
當(dāng)然不是,API會(huì)針對(duì)流量做一些治理(如鑒權(quán)、限流、權(quán)限、熔斷、協(xié)議轉(zhuǎn)換、錯(cuò)誤碼統(tǒng)一、緩存)、流量監(jiān)控(如日志、監(jiān)控、告警)、安全防范(如協(xié)議安全、訪問(wèn)安全、報(bào)文安全等),將通用的邏輯抽出來(lái),由網(wǎng)關(guān)統(tǒng)一去做,業(yè)務(wù)方也能夠更專注于業(yè)務(wù)邏輯,提升迭代的效率,其重要性可見(jiàn)一斑。
API網(wǎng)關(guān)可為微服務(wù)架構(gòu)系統(tǒng)帶來(lái)多項(xiàng)價(jià)值:
? 網(wǎng)關(guān)層對(duì)外部和內(nèi)部進(jìn)行了隔離,保障了后臺(tái)服務(wù)的安全性
? 對(duì)外訪問(wèn)控制由網(wǎng)絡(luò)層面轉(zhuǎn)換成了運(yùn)維層面,減少變更的流程和錯(cuò)誤成本
? 減少客戶端與服務(wù)的耦合,服務(wù)可以獨(dú)立發(fā)展。通過(guò)網(wǎng)關(guān)層來(lái)做映射
? 通過(guò)網(wǎng)關(guān)層聚合,減少外部訪問(wèn)的頻次,提升訪問(wèn)效率
? 節(jié)約后端服務(wù)開(kāi)發(fā)成本,減少上線風(fēng)險(xiǎn)
? 為服務(wù)熔斷,灰度發(fā)布,線上測(cè)試提供簡(jiǎn)單方案
? 便于進(jìn)行應(yīng)用層面的擴(kuò)展
因此作為流量的入口,網(wǎng)關(guān)本身的高性能、高可用、可擴(kuò)展性等非功能特性也至關(guān)重要。
長(zhǎng)亮科技API網(wǎng)關(guān)依賴其良好的擴(kuò)展性,在功能上不斷完善豐富,對(duì)接了眾多內(nèi)外部的系統(tǒng),擴(kuò)展了多種接入接出協(xié)議;支持多種流量治理策略,提供較為全面的安全防控手段。
下面將從API網(wǎng)關(guān)總體設(shè)計(jì)、API治理設(shè)計(jì)、API安全防范三方面詳細(xì)分析長(zhǎng)亮科技API網(wǎng)關(guān)的設(shè)計(jì)實(shí)踐。
長(zhǎng)亮科技API網(wǎng)關(guān)總體設(shè)計(jì)
1、技術(shù)架構(gòu)設(shè)計(jì)——最大功能上解耦
目前市面上基本都是一個(gè)服務(wù),沒(méi)有做到最大功能上的解耦,在此基礎(chǔ)上長(zhǎng)亮科技全面創(chuàng)新,將網(wǎng)關(guān)服務(wù)分為管控端和運(yùn)行端兩部分,單獨(dú)運(yùn)行,讓網(wǎng)關(guān)運(yùn)行服務(wù)脫離外界依賴,真正將gateway最大化限度的解耦。
API網(wǎng)關(guān)采用前后端分離架構(gòu)模式,以Java語(yǔ)言開(kāi)發(fā),選用當(dāng)前主流技術(shù)棧Spring Boot,Spring Cloud體系。
? 管控端主要作用為管理網(wǎng)關(guān)配置、UI交互、推送數(shù)據(jù)到網(wǎng)關(guān)運(yùn)行端等,管控端和服務(wù)端分工明確,讓真正負(fù)責(zé)處理請(qǐng)求的網(wǎng)關(guān)運(yùn)行端,爭(zhēng)取資源最大化。
? 網(wǎng)關(guān)運(yùn)行端為真正被調(diào)用的網(wǎng)關(guān)服務(wù),核心機(jī)制為過(guò)濾器鏈機(jī)制、接入接出機(jī)制、配置數(shù)據(jù)jvm緩存及本地緩存機(jī)制等;網(wǎng)關(guān)運(yùn)行端對(duì)接了多種基礎(chǔ)組件,包括監(jiān)控中心、注冊(cè)中心、鏈路中心、日志中心、配置中心等。為保證用戶配置的參數(shù)出現(xiàn)推送丟失的情況,網(wǎng)關(guān)運(yùn)行服務(wù)還會(huì)定時(shí)向網(wǎng)關(guān)管控服務(wù)拉取數(shù)據(jù),達(dá)到雙向數(shù)據(jù)同步效果。
2、高擴(kuò)展性的設(shè)計(jì)——提供更全的擴(kuò)展
網(wǎng)關(guān)運(yùn)行端采用了SPI機(jī)制,大大的增加了網(wǎng)關(guān)的擴(kuò)展性,除市面上都支持的Fileter擴(kuò)展、治理功能的擴(kuò)展外,長(zhǎng)亮科技還可提供接入接出(協(xié)議)的擴(kuò)展,加解密方式、報(bào)文等多處位置的擴(kuò)展,大大增加了網(wǎng)關(guān)的可擴(kuò)展點(diǎn):
? Filter擴(kuò)展
網(wǎng)關(guān)的功能在整個(gè)項(xiàng)目中屬于一個(gè)過(guò)濾器鏈,可通過(guò)頁(yè)面動(dòng)態(tài)配置對(duì)網(wǎng)關(guān)的各個(gè)過(guò)濾器選擇是否使用;如增加某種認(rèn)證機(jī)制等,也就是針對(duì)過(guò)濾器鏈進(jìn)行擴(kuò)展。
? 接入接出擴(kuò)展
在現(xiàn)有網(wǎng)關(guān)多協(xié)議基礎(chǔ)上,擴(kuò)展一種接入接出協(xié)議,如dubbo、TSF等;
? 加解密擴(kuò)展
擴(kuò)展新的算法和規(guī)則,對(duì)請(qǐng)求響應(yīng)報(bào)文加解密、加驗(yàn)簽;
? 網(wǎng)關(guān)請(qǐng)求響應(yīng)二次擴(kuò)展
支持在網(wǎng)關(guān)層面對(duì)接入的請(qǐng)求,接收的響應(yīng)進(jìn)行修改;
? 擴(kuò)展網(wǎng)關(guān)響應(yīng)碼及響應(yīng)信息
對(duì)網(wǎng)關(guān)響應(yīng)碼和響應(yīng)信息的擴(kuò)展,用以適配各種不同的響應(yīng)碼響應(yīng)格式要求。
除Filter擴(kuò)展是在過(guò)濾器中進(jìn)行擴(kuò)展,其余擴(kuò)展均是針對(duì)inbound和outbound進(jìn)行擴(kuò)展。
3、高可用設(shè)計(jì)——更易管理和維護(hù)的邏輯集群劃分
網(wǎng)關(guān)分為管控端(數(shù)據(jù)控制)和運(yùn)行端(API調(diào)用)兩個(gè)服務(wù),且單獨(dú)運(yùn)行,運(yùn)行端采取本地緩存存儲(chǔ)信息不需要任何讀庫(kù)操作,在管控端Down機(jī)情況下,仍可以繼續(xù)進(jìn)行API調(diào)用。
網(wǎng)關(guān)服務(wù)器采用無(wú)狀態(tài)集群架構(gòu),一個(gè)網(wǎng)關(guān)集群可以包含多個(gè)網(wǎng)關(guān)實(shí)例,集群可以作為邏輯上的實(shí)例分類,每個(gè)實(shí)例只對(duì)應(yīng)一個(gè)網(wǎng)關(guān)管控端,防止數(shù)據(jù)混亂。相對(duì)市面上普遍使用的物理上集群劃分,這種邏輯集群劃分則更好管理和維護(hù)。
網(wǎng)關(guān)管控端會(huì)主動(dòng)向運(yùn)行端發(fā)送心跳檢測(cè),同時(shí)網(wǎng)關(guān)運(yùn)行端會(huì)定時(shí)向管控端進(jìn)行數(shù)據(jù)同步,預(yù)防管控端數(shù)據(jù)同步異常導(dǎo)致的不一致。
客戶端通過(guò)負(fù)載均衡器訪問(wèn)網(wǎng)關(guān)實(shí)例,負(fù)載均衡器可采用軟負(fù)載或硬負(fù)載方式,負(fù)載均衡器可使用MS架構(gòu)避免單點(diǎn)故障。
API治理設(shè)計(jì)
1、API限流
限制API被訪問(wèn)的次數(shù),保證服務(wù)在可承受壓力內(nèi)正常運(yùn)行,防止因過(guò)高流量導(dǎo)致服務(wù)發(fā)生崩潰,分布式限流采取分布式緩存Redis實(shí)現(xiàn)。
當(dāng)請(qǐng)求進(jìn)入RateLimiter Filter 限流過(guò)濾器時(shí),會(huì)先根據(jù)當(dāng)前的請(qǐng)求構(gòu)建一組Key,然后判斷Redis是否可用,當(dāng)其可用時(shí)使用Redis進(jìn)行集群限流:
? 先判斷當(dāng)前實(shí)例的緩存是否有該key,如果存在則請(qǐng)求redis lua腳本,腳本中會(huì)對(duì)遍歷到的規(guī)則執(zhí)行 incr rule,給對(duì)應(yīng)的規(guī)則自增1,并判斷返回值,如果返回值小于等于最大值,則允許通過(guò),否則拋出限流異常。
? 當(dāng)Redis不可用時(shí),則使用JVM級(jí)別的實(shí)例限流。會(huì)直接從當(dāng)前實(shí)例的緩存中獲取一個(gè)Semaphore信號(hào)量,并嘗試獲取其許可,當(dāng)獲取成功則表示限流通過(guò),反之拋出限流異常。
2、熔斷降級(jí)
當(dāng)服務(wù)故障時(shí),為了防止整個(gè)系統(tǒng)的故障,對(duì)系統(tǒng)采取熔斷降級(jí)策略??筛鶕?jù)平均響應(yīng)時(shí)間、秒級(jí)異常比例、分鐘級(jí)異常數(shù)等維度進(jìn)行熔斷降級(jí)處理。
熔斷降級(jí)的三種維度:
? 平均響應(yīng)時(shí)間:如在1s內(nèi)連續(xù)處理5個(gè)請(qǐng)求,它的平均響應(yīng)時(shí)間都超過(guò)閾值,那么在后續(xù)的時(shí)間窗口中,對(duì)于這個(gè)API的調(diào)用都會(huì)自動(dòng)熔斷或降級(jí)。
? 異常比例:當(dāng)指定資源每秒請(qǐng)求量大于等于5,并且每秒的異??倲?shù)占通過(guò)量的比值超過(guò)閾值之后(如每秒處理1000個(gè)請(qǐng)求,那么其中異常請(qǐng)求數(shù)為500,那么當(dāng)前的比值是50%),那么該資源會(huì)進(jìn)入降級(jí)狀態(tài)。異常的比率范圍是[0.0.1.0]表示0%到100%。
? 異常數(shù):當(dāng)資源在1分鐘的異常數(shù)據(jù)超過(guò)閾值后會(huì)進(jìn)行熔斷或降級(jí)針對(duì)這些規(guī)則。
3、API路由
API路由指根據(jù)調(diào)用將調(diào)用路由對(duì)不同的后端服務(wù)、網(wǎng)關(guān)支持基于客戶端IP、比例、調(diào)用者、自定義方式進(jìn)行路由,同時(shí)支持配置優(yōu)先級(jí)。
API路由的四種模式:
? IP模式:根據(jù)不同IP路由到不同的服務(wù)提供者實(shí)例。
? 關(guān)鍵字模式:通過(guò)在請(qǐng)求頭或者查詢參數(shù)中的關(guān)鍵字進(jìn)行路由。
? 租戶模式:不同租戶路由不同的服務(wù)提供者。
? 比例模式:設(shè)置不同的比例進(jìn)行路由,例如實(shí)例A消化掉90%的API調(diào)用,實(shí)例B消化掉10%的API。
API安全防范
1、協(xié)議安全
為保證訪問(wèn)API過(guò)程中的安全問(wèn)題,API網(wǎng)關(guān)在設(shè)計(jì)上增加了對(duì)https的支持,可直接使用https的訪問(wèn)方式訪問(wèn)網(wǎng)關(guān)中的API。
2、訪問(wèn)安全
很多情況下,API都直接暴露在公網(wǎng),所以很可能會(huì)出現(xiàn)被惡意訪問(wèn),而網(wǎng)關(guān)要做的就是防止這種惡意訪問(wèn)的出現(xiàn)。通過(guò)訪問(wèn)JTW認(rèn)證、權(quán)限控制、簽名認(rèn)證、黑白名單等手段來(lái)降低API被惡意訪問(wèn)的風(fēng)險(xiǎn)。
相對(duì)單一的訪問(wèn)安全方式,長(zhǎng)亮科技的訪問(wèn)安全更為全面,且在除現(xiàn)有的幾個(gè)訪問(wèn)安全外,仍可繼續(xù)擴(kuò)展其他安全手段。
? 權(quán)限控制:只有通過(guò)管理員授權(quán)的接口,客戶端才有權(quán)限訪問(wèn) 。如果未授權(quán),在網(wǎng)關(guān)處攔截,響應(yīng)給客戶端沒(méi)有訪問(wèn)權(quán)限。
? 簽名認(rèn)證:按規(guī)則將請(qǐng)求參數(shù)通過(guò)SHA256算法|RSA|國(guó)密等運(yùn)算生成簽名值,網(wǎng)關(guān)對(duì)客戶的簽名進(jìn)行驗(yàn)簽,驗(yàn)簽成功后繼續(xù)往下,否則直接被攔截。
? 黑白名單:按黑白名單的配置進(jìn)行驗(yàn)證,如果在黑名單中,則直接攔截,不在黑名單中可繼續(xù)往下。
? JWT認(rèn)證:在訪問(wèn)API前先向網(wǎng)關(guān)申請(qǐng)一個(gè)Token,每次API訪問(wèn)時(shí)帶入這個(gè)Token,網(wǎng)關(guān)則會(huì)對(duì)Token解析,主要包括Token有效期驗(yàn)證、訪問(wèn)權(quán)限驗(yàn)證、訪問(wèn)者身份認(rèn)證;通過(guò)后繼續(xù)往下,否則直接攔截。
3、報(bào)文安全
在客戶端調(diào)用API時(shí),傳入報(bào)文的安全是至關(guān)重要的,網(wǎng)關(guān)在這塊通過(guò)報(bào)文的加密/加簽的方式確保報(bào)文的安全性。
? 加密:通過(guò)對(duì)報(bào)文的加密確保訪問(wèn)過(guò)程中報(bào)文的安全性;除現(xiàn)支持的AES、DES、RSA、國(guó)密方式外,并可以通過(guò)SPI的機(jī)制,擴(kuò)展其他的加解密方式。
? 加簽:通過(guò)對(duì)報(bào)文的加簽確保報(bào)文在訪問(wèn)過(guò)程中的完整性,除現(xiàn)支持的RSA、SHA256、國(guó)密方式外,也可以通過(guò)SPI的機(jī)制,擴(kuò)展其他加簽方式。
4、流量安全
網(wǎng)關(guān)作為所有應(yīng)用的一個(gè)入口,承載著海量流量的訪問(wèn),以及隨時(shí)可能爆發(fā)的惡意流量攻擊的壓力。因此流量控制是網(wǎng)關(guān)安全中必須的一環(huán),以保證服務(wù)的正常運(yùn)行,防止服務(wù)因過(guò)高流量導(dǎo)致服務(wù)發(fā)生崩潰。
總結(jié)
在豐富的金融客戶實(shí)踐中,長(zhǎng)亮科技認(rèn)為,API網(wǎng)關(guān)作為企業(yè)能力開(kāi)放的一個(gè)門戶,除了具備基本的請(qǐng)求轉(zhuǎn)發(fā)、協(xié)議轉(zhuǎn)換、路由、安全控制等功能,以及高性能和高穩(wěn)定性外,還需具備良好的擴(kuò)展性,以便于網(wǎng)關(guān)能力的不斷增強(qiáng)。在網(wǎng)關(guān)實(shí)施過(guò)程中,要規(guī)劃好網(wǎng)關(guān)層與服務(wù)層的交互方式,盡量使得網(wǎng)關(guān)層與服務(wù)層解耦,便于各個(gè)團(tuán)隊(duì)工作的獨(dú)立性;同時(shí)在API的管理上,需要提供API全生命周期的發(fā)布、配置、鑒權(quán)、流控、監(jiān)控等配套的管理功能。
無(wú)論是微服務(wù)、分布式架構(gòu),還是網(wǎng)格化服務(wù)架構(gòu),API網(wǎng)關(guān)都是不可或缺的部分,隨著各服務(wù)之間的流量變化呈現(xiàn)出爆發(fā)性的增長(zhǎng),API網(wǎng)關(guān)作為系統(tǒng)的入口,將在提升系統(tǒng)的性能和可靠性中承擔(dān)著越來(lái)越重要的作用。