1.背景
為杜爾伯特等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及杜爾伯特網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、杜爾伯特網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!1.1 什么是API網(wǎng)關(guān)
API網(wǎng)關(guān)可以看做系統(tǒng)與外界聯(lián)通的入口,我們可以在網(wǎng)關(guān)進(jìn)行處理一些非業(yè)務(wù)邏輯的邏輯,比如權(quán)限驗(yàn)證,監(jiān)控,緩存,請求路由等等。
1.2 為什么需要API網(wǎng)關(guān)
RPC協(xié)議轉(zhuǎn)成HTTP
由于在內(nèi)部開發(fā)中我們都是以RPC協(xié)議(thrift or dubbo)去做開發(fā),暴露給內(nèi)部服務(wù),當(dāng)外部服務(wù)需要使用這個(gè)接口的時(shí)候往往需要將RPC協(xié)議轉(zhuǎn)換成HTTP協(xié)議。
請求路由
在我們的系統(tǒng)中由于同一個(gè)接口新老兩套系統(tǒng)都在使用,我們需要根據(jù)請求上下文將請求路由到對應(yīng)的接口。
統(tǒng)一鑒權(quán)
對于鑒權(quán)操作不涉及到業(yè)務(wù)邏輯,那么可以在網(wǎng)關(guān)層進(jìn)行處理,不用下層到業(yè)務(wù)邏輯。
統(tǒng)一監(jiān)控
由于網(wǎng)關(guān)是外部服務(wù)的入口,所以我們可以在這里監(jiān)控我們想要的數(shù)據(jù),比如入?yún)⒊鰠?,鏈路時(shí)間。
流量控制,熔斷降級
對于流量控制,熔斷降級非業(yè)務(wù)邏輯可以統(tǒng)一放到網(wǎng)關(guān)層。
有很多業(yè)務(wù)都會自己去實(shí)現(xiàn)一層網(wǎng)關(guān)層,用來接入自己的服務(wù),但是對于整個(gè)公司來說這還不夠。
1.3 統(tǒng)一API網(wǎng)關(guān)
統(tǒng)一的API網(wǎng)關(guān)不僅有API網(wǎng)關(guān)的所有的特點(diǎn),還有下面幾個(gè)好處:
統(tǒng)一技術(shù)組件升級
在公司中如果有某個(gè)技術(shù)組件需要升級,那么是需要和每個(gè)業(yè)務(wù)線溝通,通常幾個(gè)月都搞不定。舉個(gè)例子如果對于入口的安全鑒權(quán)有重大安全隱患需要升級,如果速度還是這么慢肯定是不行,那么有了統(tǒng)一的網(wǎng)關(guān)升級是很快的。
統(tǒng)一服務(wù)接入
對于某個(gè)服務(wù)的接入也比較困難,比如公司已經(jīng)研發(fā)出了比較穩(wěn)定的服務(wù)組件,正在公司大力推廣,這個(gè)周期肯定也特別漫長,由于有了統(tǒng)一網(wǎng)關(guān),那么只需要統(tǒng)一網(wǎng)關(guān)統(tǒng)一接入。
節(jié)約資源
不同業(yè)務(wù)不同部門如果按照我們上面的做法應(yīng)該會都自己搞一個(gè)網(wǎng)關(guān)層,用來做這個(gè)事,可以想象如果一個(gè)公司有100個(gè)這種業(yè)務(wù),每個(gè)業(yè)務(wù)配備4臺機(jī)器,那么就需要400臺機(jī)器。并且每個(gè)業(yè)務(wù)的開發(fā)RD都需要去開發(fā)這個(gè)網(wǎng)關(guān)層,去隨時(shí)去維護(hù),增加人力。如果有了統(tǒng)一網(wǎng)關(guān)層,那么也許只需要50臺機(jī)器就可以做這100個(gè)業(yè)務(wù)的網(wǎng)關(guān)層的事,并且業(yè)務(wù)RD不需要隨時(shí)關(guān)注開發(fā),上線的步驟。
2.統(tǒng)一網(wǎng)關(guān)的設(shè)計(jì)
2.1 異步化請求
對于我們自己實(shí)現(xiàn)的網(wǎng)關(guān)層,由于只有我們自己使用,對于吞吐量的要求并不高所以,我們一般同步請求調(diào)用即可。
對于我們統(tǒng)一的網(wǎng)關(guān)層,如何用少量的機(jī)器接入更多的服務(wù),這就需要我們的異步,用來提高更多的吞吐量。對于異步化一般有下面兩種策略:
Tomcat/Jetty+NIO+servlet3
這種策略使用的比較普遍,京東,有贊,Zuul,都選取的是這個(gè)策略,這種策略比較適合HTTP。在Servlet3中可以開啟異步。
Netty+NIO
Netty為高并發(fā)而生,目前唯品會的網(wǎng)關(guān)使用這個(gè)策略,在唯品會的技術(shù)文章中在相同的情況下Netty是每秒30w+的吞吐量,Tomcat是13w+,可以看出是有一定的差距的,但是Netty需要自己處理HTTP協(xié)議,這一塊比較麻煩。
對于網(wǎng)關(guān)是HTTP請求場景比較多的情況可以采用Servlet,畢竟有更加成熟的處理HTTP協(xié)議。如果更加重視吞吐量那么可以采用Netty。
2.1.1 全鏈路異步
對于來的請求我們已經(jīng)使用異步了,為了達(dá)到全鏈路異步所以我們需要對去的請求也進(jìn)行異步處理,對于去的請求我們可以利用我們r(jià)pc的異步支持進(jìn)行異步請求所以基本可以達(dá)到下圖:
由在web容器中開啟servlet異步,然后進(jìn)入到網(wǎng)關(guān)的業(yè)務(wù)線程池中進(jìn)行業(yè)務(wù)處理,然后進(jìn)行rpc的異步調(diào)用并注冊需要回調(diào)的業(yè)務(wù),最后在回調(diào)線程池中進(jìn)行回調(diào)處理。
2.2 鏈?zhǔn)教幚?/p>
在設(shè)計(jì)模式中有一個(gè)模式叫責(zé)任鏈模式,他的作用是避免請求發(fā)送者與接收者耦合在一起,讓多個(gè)對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。通過這種模式將請求的發(fā)送者和請求的處理者解耦了。在我們的各個(gè)框架中對此模式都有實(shí)現(xiàn),比如servlet里面的filter,springmvc里面的Interceptor。
在Netflix Zuul中也應(yīng)用了這種模式,如下圖所示:
這種模式在網(wǎng)關(guān)的設(shè)計(jì)中我們可以借鑒到自己的網(wǎng)關(guān)設(shè)計(jì):
preFilters:前置過濾器,用來處理一些公共的業(yè)務(wù),比如統(tǒng)一鑒權(quán),統(tǒng)一限流,熔斷降級,緩存處理等,并且提供業(yè)務(wù)方擴(kuò)展。
routingFilters: 用來處理一些泛化調(diào)用,主要是做協(xié)議的轉(zhuǎn)換,請求的路由工作。
postFilters: 后置過濾器,主要用來做結(jié)果的處理,日志打點(diǎn),記錄時(shí)間等等。
errorFilters: 錯(cuò)誤過濾器,用來處理調(diào)用異常的情況。
這種設(shè)計(jì)在有贊的網(wǎng)關(guān)也有應(yīng)用。
2.3 業(yè)務(wù)隔離
上面在全鏈路異步的情況下不同業(yè)務(wù)之間的影響很小,但是如果在提供的自定義FiIlter中進(jìn)行了某些同步調(diào)用,一旦超時(shí)頻繁那么就會對其他業(yè)務(wù)產(chǎn)生影響。所以我們需要采用隔離之術(shù),降低業(yè)務(wù)之間的互相影響。
2.3.1 信號量隔離
信號量隔離只是限制了總的并發(fā)數(shù),服務(wù)還是主線程進(jìn)行同步調(diào)用。這個(gè)隔離如果遠(yuǎn)程調(diào)用超時(shí)依然會影響主線程,從而會影響其他業(yè)務(wù)。因此,如果只是想限制某個(gè)服務(wù)的總并發(fā)調(diào)用量或者調(diào)用的服務(wù)不涉及遠(yuǎn)程調(diào)用的話,可以使用輕量級的信號量來實(shí)現(xiàn)。有贊的網(wǎng)關(guān)由于沒有自定義filter所以選取的是信號量隔離。
2.3.2 線程池隔離
最簡單的就是不同業(yè)務(wù)之間通過不同的線程池進(jìn)行隔離,就算業(yè)務(wù)接口出現(xiàn)了問題由于線程池已經(jīng)進(jìn)行了隔離那么也不會影響其他業(yè)務(wù)。在京東的網(wǎng)關(guān)實(shí)現(xiàn)之中就是采用的線程池隔離,比較重要的業(yè)務(wù)比如商品或者訂單 都是單獨(dú)的通過線程池去處理。但是由于是統(tǒng)一網(wǎng)關(guān)平臺,如果業(yè)務(wù)線眾多,大家都覺得自己的業(yè)務(wù)比較重要需要單獨(dú)的線程池隔離,如果使用的是Java語言開發(fā)的話那么,在Java中線程是比較重的資源比較受限,如果需要隔離的線程池過多不是很適用。如果使用一些其他語言比如Golang進(jìn)行開發(fā)網(wǎng)關(guān)的話,線程是比較輕的資源,所以比較適合使用線程池隔離。
2.3.3 集群隔離
如果有某些業(yè)務(wù)就需要使用隔離但是統(tǒng)一網(wǎng)關(guān)又沒有線程池隔離那么應(yīng)該怎么辦呢?那么可以使用集群隔離,如果你的某些業(yè)務(wù)真的很重要那么可以為這一系列業(yè)務(wù)單獨(dú)申請一個(gè)集群或者多個(gè)集群,通過機(jī)器之間進(jìn)行隔離。
2.4 請求限流
流量控制可以采用很多開源的實(shí)現(xiàn),比如阿里最近開源的Sentinel和比較成熟的Hystrix。
一般限流分為集群限流和單機(jī)限流:
利用統(tǒng)一存儲保存當(dāng)前流量的情況,一般可以采用Redis,這個(gè)一般會有一些性能損耗。
單機(jī)限流:限流每臺機(jī)器我們可以直接利用Guava的令牌桶去做,由于沒有遠(yuǎn)程調(diào)用性能消耗較小。
2.5 熔斷降級
這一塊也可以參照開源的實(shí)現(xiàn)Sentinel和Hystrix,這里不是重點(diǎn)就不多提了。
2.6 泛化調(diào)用
泛化調(diào)用指的是一些通信協(xié)議的轉(zhuǎn)換,比如將HTTP轉(zhuǎn)換成Thrift。在一些開源的網(wǎng)關(guān)中比如Zuul是沒有實(shí)現(xiàn)的,因?yàn)楦鱾€(gè)公司的內(nèi)部服務(wù)通信協(xié)議都不同。比如在唯品會中支持HTTP1,HTTP2,以及二進(jìn)制的協(xié)議,然后轉(zhuǎn)化成內(nèi)部的協(xié)議,淘寶的支持HTTPS,HTTP1,HTTP2這些協(xié)議都可以轉(zhuǎn)換成,HTTP,HSF,Dubbo等協(xié)議。
2.6.1泛化調(diào)用
如何去實(shí)現(xiàn)泛化調(diào)用呢?由于協(xié)議很難自動轉(zhuǎn)換,那么其實(shí)每個(gè)協(xié)議對應(yīng)的接口需要提供一種映射。簡單來說就是把兩個(gè)協(xié)議都能轉(zhuǎn)換成共同語言,從而互相轉(zhuǎn)換。
一般來說共同語言有三種方式指定:
json:json數(shù)據(jù)格式比較簡單,解析速度快,較輕量級。在Dubbo的生態(tài)中有一個(gè)HTTP轉(zhuǎn)Dubbo的項(xiàng)目是用JsonRpc做的,將HTTP轉(zhuǎn)化成JsonRpc再轉(zhuǎn)化成Dubbo。
比如可以將一個(gè) www.baidu.com/id = 1 GET 可以映射為json:
代碼塊
{ ?“method”:?"getBaidu" ?"param"?:?{ ?"id"?:?1 ?} }
xml:xml數(shù)據(jù)比較重,解析比較困難,這里不過多討論。
自定義描述語言:一般來說這個(gè)成本比較高需要自己定義語言來進(jìn)行描述并進(jìn)行解析,但是其擴(kuò)展性,自定義個(gè)性化性都是最高。例:spring自定義了一套自己的SPEL表達(dá)式語言
對于泛化調(diào)用如果要自己設(shè)計(jì)的話JSON基本可以滿足,如果對于個(gè)性化的需要特別多的話倒是可以自己定義一套語言。
2.7 管理平臺
上面介紹的都是如何實(shí)現(xiàn)一個(gè)網(wǎng)關(guān)的技術(shù)關(guān)鍵。這里需要介紹網(wǎng)關(guān)的一個(gè)業(yè)務(wù)關(guān)鍵。有了網(wǎng)關(guān)之后,需要一個(gè)管理平臺如何去對我們上面所描述的技術(shù)關(guān)鍵進(jìn)行配置,包括但不限于下面這些配置:
限流
熔斷
緩存
日志
自定義filter
泛化調(diào)用
3.總結(jié)
最后一個(gè)合理的標(biāo)準(zhǔn)網(wǎng)關(guān)應(yīng)該按照如下去實(shí)現(xiàn):
讀者福利
加微信:haolagui521備注51CTO領(lǐng)取附送學(xué)習(xí)進(jìn)階架構(gòu)資料、PDF書籍文檔、面試資料
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。
分享標(biāo)題:淺析如何設(shè)計(jì)一個(gè)億級網(wǎng)關(guān)-創(chuàng)新互聯(lián)
文章地址:http://aaarwkj.com/article16/cojegg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、App開發(fā)、Google、微信公眾號、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容