您好,登錄后才能下訂單哦!
轉(zhuǎn)載本文需注明出處:微信公眾號EAWorld,違者必究。
引言:
普元EOS 8 API Gateway作為一個獨(dú)立模塊,可以對API進(jìn)行創(chuàng)建、發(fā)布、維護(hù)、監(jiān)控等全生命周期管理。
目錄:
一、為什么引入EOS8網(wǎng)關(guān)
二、EOS 8網(wǎng)關(guān)的技術(shù)框架
三、API接入和監(jiān)控示例
隨著微服務(wù)的熱度不斷上升,線上商業(yè)的發(fā)展和人們需求的擴(kuò)增,企業(yè)中業(yè)務(wù)服務(wù)種類眾多,數(shù)量巨大,對如此規(guī)模的服務(wù)做升級、管理和維護(hù),時間和資源成本的開銷不言而喻。API Gateway的價(jià)值隨之彰顯出來。與此同時對API Gateway的選擇也尤為重要。
統(tǒng)一的API管理、高并發(fā)請求全周期異步化、靈活的API適配是EOS 8 API Gateway的優(yōu)勢。
API Gateway 在各個模塊間如何運(yùn)作?
上圖展示了EOS 8 API Gateway模塊間的進(jìn)程視圖,方便我們理解整個業(yè)務(wù)執(zhí)行過程。
首先,需要將網(wǎng)關(guān)和后端應(yīng)用注冊到Eureka(如果后端服務(wù)不是微服務(wù),可以忽略這一步)。
然后,在governor界面創(chuàng)建需要發(fā)布的API,并配置相應(yīng)的ip認(rèn)證和流控配置,這些操作都會同步到Gateway Server的緩存。
最后,服務(wù)消費(fèi)者系統(tǒng)需要在Governor訂閱API,獲得網(wǎng)關(guān)頒發(fā)給調(diào)用方的token憑證(后面的版本會加入IAM授權(quán)),消費(fèi)方系統(tǒng)拿到token憑證訪問已發(fā)布的API,Gateway Server從Redis讀取緩存進(jìn)行ip和流控校驗(yàn),從自身緩存中讀取token信息(后面版本鑒權(quán)由IAM完成)、API配置進(jìn)行請求和API適配,各個EventHeadler都完成后,由Ribbon路由到Eureka注冊的應(yīng)用(如果后端服務(wù)沒有注冊到Eureka,由異步的NioClient接出)。
EOS8 網(wǎng)關(guān)部署拓?fù)浼軜?gòu)
EOS 8 API Gateway 有兩種部署模式。
EOS 8 API Gateway可以不依賴微服務(wù)架構(gòu)中的注冊中心、配置中心進(jìn)行單獨(dú)部署。整個生命周期中API鑒權(quán)、ip認(rèn)證、流控、配置管理,協(xié)議數(shù)據(jù)轉(zhuǎn)換和調(diào)用日志監(jiān)控等功能依然具備。但是依賴注冊中心的服務(wù)路由、配置中心的統(tǒng)一配置API、監(jiān)控/日志中心的后端服務(wù)監(jiān)控等功能會缺失。
EOS 8 API Gateway 作為微服務(wù)治理的重要成員,可依賴注冊中心、配置中心和監(jiān)控/日志中心做微服務(wù)治理。
a、將API Gateway、后端應(yīng)用注冊到注冊中心。當(dāng)配置需要管理的API時,可選擇注冊中心的應(yīng)用,亦可手動輸入后端服務(wù)地址。
b、在配置中心可以對網(wǎng)關(guān)API進(jìn)行統(tǒng)一配置,譬如:統(tǒng)一配置請求頭響應(yīng)頭、統(tǒng)一請求參數(shù)響應(yīng)參數(shù)等。
c、監(jiān)控/日志中心可以監(jiān)控注冊到注冊中心的后端服務(wù)調(diào)用和資源使用情況。
管理門戶(Governor)是EOS 8微服務(wù)架構(gòu)中服務(wù)治理和資產(chǎn)管理的門戶,由管理員頁面操作,進(jìn)行API配置發(fā)布、API分組管理、黑白名單配置、流控配置、系統(tǒng)/應(yīng)用注冊、統(tǒng)一配置等操作,不過上述的功能的接口都有詳細(xì)的swagger文檔,可以根據(jù)需求自行擴(kuò)展。
API_Gateway_Monitor是網(wǎng)關(guān)自帶的日志解析組件。網(wǎng)關(guān)現(xiàn)支持Mysql、Oracle、PG數(shù)據(jù)庫,Redis存放流控?cái)?shù)據(jù)。
EOS8 網(wǎng)關(guān)部署拓?fù)浼軜?gòu)主要技術(shù)
注冊中心使用Spring Cloud Eureka,配置中心使用Ctrip Apollo。
網(wǎng)關(guān)主要的技術(shù)框架:
網(wǎng)關(guān)使用了Oauth3鑒權(quán)技術(shù)(后續(xù)配合IAM做權(quán)限校驗(yàn))。
在java8、Spring4的大環(huán)境下,Spring Boot加大了開發(fā)效率。
嵌入了Jetty容器讓網(wǎng)關(guān)更輕,讓系統(tǒng)性能維持在一個可接受狀態(tài)。
使用了基于傳輸層的Netty框架,提供異步的、事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用程序框架,為我們核心框架分階段消息異步處理架構(gòu)奠定基礎(chǔ)。
分階段消息異步處理
可以將一次請求Api Gateway,并從API Gateway獲得響應(yīng)視為整個流程。
邏輯分段。將整個流程劃分成:請求接入/響應(yīng)接出、代理服務(wù)處理、業(yè)務(wù)服務(wù)處理、請求接出/響應(yīng)接入四個業(yè)務(wù)Stage。
段之間基于隊(duì)列/消息通信。每個業(yè)務(wù)Stage都有自己獨(dú)立的業(yè)務(wù)處理Event Handler、Event Queue和線程池,每個階段之間沒有任何依賴,當(dāng)前的Stage事件處理完成,封裝到Message中,然后派發(fā)到其他Stage的Event Queue,直到整個Stage處理完成有Nio Client或者Ribbon Client接出。當(dāng)Event queue吸納過量的負(fù)載,有限的線程池維持并發(fā)。
Stage控制器負(fù)責(zé)資源的分配和調(diào)度,控制派發(fā)給Event Handler的事件的數(shù)量和順序,Event Handler可能在內(nèi)部丟棄、過濾、重排序事件。
分階段消息異步處理架構(gòu)實(shí)現(xiàn)了EOS 8網(wǎng)關(guān)高并發(fā)請求全周期異步化。
API Gateway 提供了統(tǒng)一的API管理
EOS 8 API Gateway從功能層面提供了統(tǒng)一的API管理。
首先,具有多協(xié)議接入和接出,例如HTTP協(xié)議、REST協(xié)議、WS協(xié)議等,發(fā)布出來的API可供企業(yè)內(nèi)部系統(tǒng)、第三方應(yīng)用系統(tǒng)和前端研發(fā)人員調(diào)用。
其次,在服務(wù)接入層,實(shí)現(xiàn)了權(quán)限認(rèn)證、IP認(rèn)證和用戶名密碼認(rèn)證,再加上可靠的流控機(jī)制保障了通過網(wǎng)關(guān)的傳輸安全。
最后,Api Gateway Server服務(wù)引擎有以下幾個內(nèi)容:
Api Gateway Server內(nèi)部實(shí)現(xiàn)了協(xié)議擴(kuò)展和消息轉(zhuǎn)換,根據(jù)需求在Governor管理頁面進(jìn)行配置。
Server端的接出由Ribbon Client實(shí)現(xiàn),可根據(jù)Eureka注冊的應(yīng)用進(jìn)行路由。
流控?cái)?shù)據(jù)皆保存在Redis中,在有限的JVM資源下優(yōu)先保障傳輸效率。
server附帶的普元自主研發(fā)的API Gateway Monitor,可以輕松解析千萬級并發(fā)調(diào)用的日志文件,為governor呈現(xiàn)有效的API的調(diào)用詳情和調(diào)用趨勢。
API Gateway可使用F5或者Nginx進(jìn)行橫向擴(kuò)展,應(yīng)對更大調(diào)用需求。
斷路器機(jī)制可以有效的保護(hù)JVM主線程,為傳輸安全提供保障。
豐富的服務(wù)引擎使API管理更加完善。
如何使用EOS 8網(wǎng)關(guān)?用EOS 8網(wǎng)關(guān)如何注冊和發(fā)布一個API?服務(wù)消費(fèi)者系統(tǒng)又如何根據(jù)token調(diào)用已發(fā)布的網(wǎng)關(guān)?
API注冊
創(chuàng)建后端應(yīng)用
如果需要API Gateway動態(tài)路由到后端應(yīng)用,需要將該應(yīng)用服務(wù)注冊到Eureka,然后在Governor注冊。為API注冊選擇后端服務(wù)時做好準(zhǔn)備。
創(chuàng)建API第一步(配置基本信息)
創(chuàng)建API第一步配置基本信息,對需要注冊的API進(jìn)行定義分組、協(xié)議、名稱的配置。
創(chuàng)建API第二步(配置API接入【協(xié)議/數(shù)據(jù)轉(zhuǎn)換】)
創(chuàng)建API第二步,配置API接入,當(dāng)外部系統(tǒng)調(diào)用網(wǎng)關(guān)發(fā)布的API時涉及到的配置。
一共有四個基本配置:
“請求Path”是API的URI。
“HTTP Method”是http請求的方法。
“入?yún)⒛J健狈謨煞N:穿透和轉(zhuǎn)換,穿透與轉(zhuǎn)換的區(qū)別是前者網(wǎng)關(guān)在服務(wù)調(diào)用生命周期只做代理轉(zhuǎn)發(fā),后者可以對請求報(bào)文進(jìn)行適配和轉(zhuǎn)換。
“報(bào)文類型”請求報(bào)文的數(shù)據(jù)類型,默認(rèn)有:JSON、XML、FORM表單,如有其他需求,可在數(shù)據(jù)字典擴(kuò)展。
本次示例是http穿透,路徑參數(shù) ”num1“加入了參數(shù)列表,參數(shù)列表中定義過的參數(shù)皆可在后端服務(wù)的Path、Header、Body中使用。
在系統(tǒng)對接過程,常見的API適配有json轉(zhuǎn)json、xml轉(zhuǎn)json、json轉(zhuǎn)xml。
在EOS8 API Gateway中,無論請求方的報(bào)文是什么格式的,只要能在請求的Path、Header或者Body中提取出后端服務(wù)請求所需的報(bào)文數(shù)據(jù),便可重構(gòu)后端服務(wù)請求報(bào)文。
如圖所示,在入?yún)⒍x中,當(dāng)提取HTTP報(bào)文體,”參數(shù)路徑“是根據(jù)報(bào)文類型而選擇,當(dāng)請求報(bào)文是JSON格式,用“$.*”JSONPath提取參數(shù),當(dāng)報(bào)文是XML格式,就用“/*/*”XPath提取參數(shù)。
將請求報(bào)文的關(guān)鍵數(shù)據(jù)都提取出來保存到參數(shù)列表中,待后端服務(wù)配置使用。
創(chuàng)建API第三步(配置API后端服務(wù))
創(chuàng)建API第三步,配置API后端服務(wù)。
一共有6個基本配置:
“后端協(xié)議”是請求后端服務(wù)的網(wǎng)絡(luò)協(xié)議(HTTPS協(xié)議將在下個版本加入)。
“服務(wù)地址”是后端服務(wù)的地址,如果部署架構(gòu)中將網(wǎng)關(guān)獨(dú)立部署,這里可以選擇“手動輸入”配置后端服務(wù),如果部署EOS8微服務(wù)架構(gòu),可選擇“應(yīng)用”進(jìn)行動態(tài)路由。
“HTTP Method”是請求后端服務(wù)的方法。
“超時時間”是后端服務(wù)響應(yīng)的熔斷時間。
“后端請求Path”是后端服務(wù)請求的URI。
“報(bào)文類型”是請求后端服務(wù)的請求報(bào)文類型。
后端服務(wù)參數(shù)中,可根據(jù)參數(shù)位置配置參數(shù)路徑,如:在“后端請求Path””/json/library/book/{library}”路徑中,library可作為參數(shù)路徑變量,在參數(shù)列表中找到對應(yīng)的參數(shù)進(jìn)行賦值。
對于后端服務(wù)報(bào)文的重構(gòu),根據(jù)已知的后端服務(wù)請求報(bào)文格式,使用了VTL語言重構(gòu),使用參數(shù)列表中的參數(shù)對重構(gòu)報(bào)文的value進(jìn)行賦值。VTL重構(gòu)的報(bào)文示例:
{
"id":"$ReqBody_Did.asText()",
"name":"$ReqBody_Dname.asText()",
"isbn":"$ReqBody_Disbn.asText()",
"author":"$ReqBody_Dauthor.asText()",
"price":$ReqBody_Dprice.asText()
}
關(guān)于VTL腳本語言更多介紹請參考(http://t.cn/EGsgPrP)
創(chuàng)建API第四步(響應(yīng)結(jié)果配置)
創(chuàng)建API第四步,響應(yīng)結(jié)果配置。
“返回ContentType”配置后端服務(wù)響應(yīng)的報(bào)文類型。
“錯誤碼定義”可以自定義后端服務(wù)非正常響應(yīng)。
到這里,一個完整的實(shí)現(xiàn)了報(bào)文轉(zhuǎn)換的API注冊成功,接下來介紹剛注冊好的API如何添加策略配置。
API策略配置
ip配置
首先創(chuàng)建黑白名單策略,“控制類型”可選擇黑名單或者白名單,“IP列表”可用正則表達(dá)式定義,然后在剛剛創(chuàng)建好的白名單策略上綁定API,綁定成功則白名單策略生效。
調(diào)用數(shù)配置
首先創(chuàng)建調(diào)用數(shù)控制策略,配置單位時間內(nèi)的API被調(diào)用次數(shù)和單位時間內(nèi)調(diào)用方的調(diào)用次數(shù),然后在剛剛創(chuàng)建好的調(diào)用數(shù)策略上綁定API,綁定成功則調(diào)用數(shù)策略生效。
接下來開始介紹如何調(diào)用API。
調(diào)用API
API發(fā)布
API處于“已發(fā)布”狀態(tài)才能被調(diào)用。
創(chuàng)建調(diào)用方系統(tǒng)
首先創(chuàng)建調(diào)用方系統(tǒng)。
調(diào)用方系統(tǒng)訂閱API
然后調(diào)用方系統(tǒng)訂閱API。
獲取網(wǎng)關(guān)頒發(fā)給調(diào)用方系統(tǒng)的憑證token
訂閱完成后,網(wǎng)關(guān)會頒發(fā)一個令牌,調(diào)用系統(tǒng)想要調(diào)用剛才訂閱的API需要傳這個令牌做認(rèn)證。
調(diào)用系統(tǒng)調(diào)用訂閱后的API
請求已發(fā)布的API,將剛剛獲取的令牌放入“access_token”請求頭中,在IP策略和調(diào)用數(shù)策略允許范圍內(nèi),調(diào)用成功。
多調(diào)用幾次后,監(jiān)控調(diào)用詳情。
API調(diào)用監(jiān)控
剛才調(diào)用后,API Gateway Server會產(chǎn)生日志文件,API_Gateway_Monitor自動解析完日志后會產(chǎn)生監(jiān)控?cái)?shù)據(jù),如上圖展示。
總結(jié):
EOS 8 API Gateway有以上諸多優(yōu)點(diǎn),更為關(guān)鍵的是,兩種部署模式能夠滿足廣大用戶的不同需求。其消息異步處理機(jī)制和統(tǒng)一API管理等功能,必將吸引廣泛的用戶體驗(yàn)并得到他們的青睞。而豐富的服務(wù)引擎也將會使API管理更加完善,給用戶以最優(yōu)的開發(fā)體驗(yàn)。
精選提問:
問1:請問網(wǎng)關(guān)本身的高可用和擴(kuò)展性怎么保證?
答:當(dāng)高并發(fā)調(diào)用時,EOS8網(wǎng)關(guān)可部署在容器云,通過F5或Nginx等工具做橫向擴(kuò)展。流控機(jī)制可對API、調(diào)用方進(jìn)行限流,減少并發(fā)問題的發(fā)生。業(yè)務(wù)服務(wù)端有熔斷機(jī)制保障線程高可用,接出時可配置后端服務(wù)超時的重連次數(shù),當(dāng)調(diào)用異常發(fā)生做相應(yīng)的處理。
問2:api授權(quán)是采取什么模式?
答:授權(quán)采取API發(fā)布訂閱模式。當(dāng)API處于“已發(fā)布”狀態(tài),消費(fèi)者系統(tǒng)可訂閱API獲取網(wǎng)關(guān)頒發(fā)的令牌,當(dāng)調(diào)用網(wǎng)關(guān)的目標(biāo)API,網(wǎng)關(guān)會根據(jù)令牌校驗(yàn)調(diào)用是否合法。
問3:單節(jié)點(diǎn)部署支持訪問多少并發(fā)?
答:1K報(bào)文在1000并發(fā)下,網(wǎng)關(guān)的TPS有2362,隨著報(bào)文增加,TPS會隨之有所下降。
關(guān)于作者:李鋮,普元java開發(fā)工程師,負(fù)責(zé)ESB/BIIP/DSB的維護(hù),參與普元EOS 8網(wǎng)關(guān)的開發(fā),現(xiàn)階段進(jìn)行ESB 6.7升級的研發(fā)工作。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。