api網(wǎng)關(guān)
??????網(wǎng)關(guān)在后端架構(gòu)中之a(chǎn)pi gateway,接口調(diào)用經(jīng)過的網(wǎng)關(guān)。大家在微服務(wù)的開發(fā)環(huán)境下,對網(wǎng)關(guān)并不陌生,如是復(fù)雜一點(diǎn)的微服務(wù)架構(gòu)基本都會有網(wǎng)關(guān)層。springcloud體系中用的可能是zuul、gateway等
??????我們從軟件的體系發(fā)展來看,網(wǎng)關(guān)也是隨著微服務(wù)興起的,傳統(tǒng)單體應(yīng)用只有一個應(yīng)用直接訪問,由于單體應(yīng)用頂不住現(xiàn)在的數(shù)據(jù)流量,產(chǎn)生的微服務(wù)、分布式等,后臺服務(wù)從單體應(yīng)用劇增,為了安全以及流量的管控等,服務(wù)需要一個統(tǒng)一的入口和出口,網(wǎng)關(guān)因此而生。

??????很明顯,網(wǎng)關(guān)作為后臺服務(wù)的一個入口和出口;決定了他需要保證高性能高可用;以及進(jìn)行流量的管控;容錯、降級等安全防護(hù)。
api生命周期
??????從swagger等工具中可以總結(jié)到api應(yīng)該有哪幾種狀態(tài)
??????設(shè)計(jì)-構(gòu)建-文檔-測試-分享-運(yùn)行-下線
泛化調(diào)用
??????泛化調(diào)用對我來說第一次聽到,確實(shí)在復(fù)雜、大流量的架構(gòu)下才會產(chǎn)生這種概念,簡單來說就是網(wǎng)關(guān)中是所有服務(wù)的入口,會調(diào)用很多rpc,rpc調(diào)用需要依賴api的jar包,如果每個服務(wù)提供者都依賴它的jar包,那網(wǎng)關(guān)就會變得很臃腫。
??????泛化調(diào)用很多rpc框架都有,如dubbo的GenericService,原理和依賴api調(diào)用是一樣的,都是通過序列化,網(wǎng)絡(luò),反射等技術(shù)實(shí)現(xiàn),不過泛化不需要api了,不需要pojo,全部用map來表示,簡化了眾多服務(wù)下的網(wǎng)關(guān)結(jié)構(gòu),網(wǎng)關(guān)只需要依賴一個rpc泛化調(diào)用服務(wù)。


api發(fā)布至網(wǎng)關(guān)
??????依據(jù)以上所述,網(wǎng)關(guān)和rpc服務(wù)是有所依賴的,泛化之后,沒有了依賴,網(wǎng)關(guān)依賴了一個rpc泛化服務(wù),因此這個服務(wù)作為了網(wǎng)關(guān)的api調(diào)用口,也是rpc api發(fā)布的平臺,這里api發(fā)布上來后一般通過緩存存儲

管道技術(shù)
夜深,明日更。。。
繼續(xù)
??????網(wǎng)關(guān)中是沒有業(yè)務(wù)的,不過很很多種校驗(yàn),結(jié)合這種處理,我們利用管道技術(shù)會非常優(yōu)雅(上面圖再截一遍發(fā)現(xiàn)模糊,于是以下用原圖,需要旋轉(zhuǎn)一下)
??????可以看到如下圖,管道技術(shù)首先是一種解耦,把每種校驗(yàn)(處理)拆開,而且可插拔可配置很方便;管道的實(shí)現(xiàn)如圖下方,用pipe接口處理檢驗(yàn)邏輯,線程類包裝pipe,再交給線程池處理。

如何獲取管道
??????每個api都有管道,因此在以上的api平臺入口可以在發(fā)布時配置管道,之后通過接口即可獲取到管道;管道中處理根據(jù)管道的順序向下傳遞
優(yōu)點(diǎn)
??????管道解耦也在于可以隨時去掉某些管道,如黑白名單,開始需要后面可以撤掉等。
與責(zé)任鏈
??????管道與責(zé)任鏈很容易聯(lián)想起來,非常相似;責(zé)任鏈的處理是每個處理中存有變量nextHandler和方法handlerRequest();管道技術(shù)會更加靈活自由,責(zé)任鏈比較限制,而且實(shí)際的實(shí)現(xiàn)看起來會更復(fù)雜。
傳統(tǒng)網(wǎng)關(guān)弊端
??????網(wǎng)關(guān)演進(jìn)的階段為:同步、半同步、全異步
傳統(tǒng)
??????這里的傳統(tǒng)指的是同步、半同步的網(wǎng)關(guān);同步即從接受請求到調(diào)用api都是同步,半同步是io請求和業(yè)務(wù)請求分開,業(yè)務(wù)處理內(nèi)部還是同步調(diào)用api;
??????網(wǎng)關(guān)的特點(diǎn)已經(jīng)知道,承受流量大、rpc調(diào)用多、各種系統(tǒng)、接口調(diào)用;外部復(fù)雜度到了服務(wù)器內(nèi)部,我們就需要關(guān)注計(jì)算機(jī)每個部件、負(fù)載以及網(wǎng)絡(luò)等。
關(guān)注點(diǎn)
- cpu cpu是最寶貴的資源;關(guān)注cpu利用率和負(fù)載,利用率是實(shí)時占用百分比,負(fù)載是最近平均任務(wù)數(shù)。都需要關(guān)注
- 磁盤 網(wǎng)關(guān)調(diào)用量大,實(shí)時關(guān)注磁盤使用率,例如日志系統(tǒng);進(jìn)入容器時代,更需關(guān)注
- 網(wǎng)絡(luò) 關(guān)注每個環(huán)節(jié)的耗時,尤其rpc調(diào)用跨進(jìn)程跨網(wǎng)絡(luò)
servlet3異步
??????異步化處理,網(wǎng)關(guān)請求量超大,io線程和業(yè)務(wù)處理線程需要分開,不能一個請求進(jìn)來一個線程處理到結(jié)束。servlet3開啟異步支持,asyncSupported=true,注解或者xml。
tomcat nio/servlet3 async/spring mvc
- nio是一個io模型,和異步?jīng)]有關(guān)系,是一種通信模式,可以用少量線程處理大量請求
- servlet3異步是請求接收和業(yè)務(wù)處理的異步化,如此可以業(yè)務(wù)隔離。
- spirngmvc是基于servlet3封裝的
servlet3非阻塞io
數(shù)據(jù)量大的接收參數(shù)時可以異步化

整體流程

全異步網(wǎng)關(guān)
rpc調(diào)用異步化

脫庫與多緩存
脫庫
??????不建議使用數(shù)據(jù)庫,直接使用緩存,緩存也要考慮高可用。
多級緩存

熱更新
??????熱更新其實(shí)很多地方都需要,網(wǎng)關(guān)層需要管理的東西多,配置更新等;二流量大不適合重啟,因此需要熱更新支持
??????熱更新可以用mq/rpc/zk....方法很多。
網(wǎng)關(guān)功能總結(jié)
- 降級
- 限流
- 熔斷
- 線程池隔離
- 管道技術(shù)
- 熱更新
- 異步