架構(gòu)修煉之道(一)

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)因此而生。


image.png

??????很明顯,網(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ù)。


image.png

image.png

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ā)布上來后一般通過緩存存儲


image.png

管道技術(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,再交給線程池處理。


image.png

如何獲取管道

??????每個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ù)時可以異步化


image.png

整體流程


image.png

全異步網(wǎng)關(guān)

rpc調(diào)用異步化


image.png

脫庫與多緩存

脫庫

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

多級緩存

image.png

熱更新

??????熱更新其實(shí)很多地方都需要,網(wǎng)關(guān)層需要管理的東西多,配置更新等;二流量大不適合重啟,因此需要熱更新支持
??????熱更新可以用mq/rpc/zk....方法很多。

網(wǎng)關(guān)功能總結(jié)

  • 降級
  • 限流
  • 熔斷
  • 線程池隔離
  • 管道技術(shù)
  • 熱更新
  • 異步
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容