新聞中心
那么作為一名架構(gòu)師,我們該如何選型“業(yè)務(wù)網(wǎng)關(guān)”呢?我們自己先要學(xué)會做技術(shù)選型,自己預(yù)期有一個技術(shù)成本的預(yù)判,比如我推薦使用Spring Cloud Alibaba+Spring Gateway,就是我自己作為一個架構(gòu)師的技術(shù)預(yù)判。

創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元建平做網(wǎng)站,已為上家服務(wù),為建平各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220
Zuul
Zuul是Netflix開源的微服務(wù)網(wǎng)關(guān),可以和Eureka、Ribbon、Hystrix等組件配合使用,Spring Cloud對Zuul進行了整合與增強,Zuul總共有兩個大的版本:Zuul1.0和Zuul2.0,目前最新的版本為v2.2.0,Zuul1.0和Zuul2.0版本之間功能差異性非常大。
Netflix的Zuul包含如下功能:
- 身份認證與安全: 識別每個資源的驗證要求,并拒絕那些與要求不符的請求;
- 審查與監(jiān)控:在邊緣位置追蹤有意義的數(shù)據(jù)和統(tǒng)計結(jié)果;
- 動態(tài)路由: 動態(tài)地將請求路由到不同的后端集群;
- 壓力測試 : 逐漸增加指向集群的流量,以了解性能;
- 負載分配: 為每一種負載類型分配對應(yīng)容量 ,并棄用超出限定值的請求 ;
- 靜態(tài)響應(yīng)處理:在邊緣位置直接建立部分響應(yīng),從而避免其轉(zhuǎn)發(fā)到內(nèi)部集群;
- 多區(qū)域彈性: 跨越AWS Region進行請求路由,旨在實現(xiàn)ELB(Elastic Load Balancing)使用的多樣化和 以及讓系統(tǒng)的邊緣更貼近系統(tǒng)的使用者。
以上介紹來自Zuul官方文檔,但其實開源版本的Zuul以上功能一個都沒有——開源的Zuul只是幾個Jar包而已,以上能力指的應(yīng)該是Netflix官方自用的Zuul的能力;Netflix自用的Zuul能力是比較強大的,可使用Groovy編寫過濾器,并且可動態(tài)加載/卸載、修改規(guī)則,而且使用Cassandra作為數(shù)據(jù)庫,然而開源版本這些一個都沒有;Spring Cloud中,Zuul絕大部分功能都是Spring Cloud團隊為Zuul開發(fā)的;所以Zuul 2.x的開源進度延后一年,Spring Cloud團隊開發(fā)了自己的SCG,并宣布Spring Cloud不打算支持Zuul 2.x,你還覺得意外嗎?看到這里,很多人可能沒有動力學(xué)習(xí)Zuul了,個人認為還是可以了解一下的,后面講到SCG時,你會發(fā)現(xiàn)很多設(shè)計理念是相通的。
既然說到了Spring Cloud對Zuul的封裝,那么我們來簡單的分析下Spring Cloud與Zuul的關(guān)系。Spring Cloud通過Spring Cloud Netflix 1.X來封裝Zuul1.0,1.X的最后一個版本是v1.4.7.RELEASE,對應(yīng)的Zuul版本是1.3.1。Spring Cloud Netflix從3.X開始就沒有封裝Zuul網(wǎng)關(guān),包括Zuul1.0和Zuul2.0,也就是說開發(fā)者想要通過Spring Cloud來復(fù)用Zuul,只能使用Zuul1.0,暫時不能復(fù)用Zuul2.0。
Zuul目前在github上的star數(shù)為10.2k,fork數(shù)為2k,也就是說還是有很多開源愛好者會基于Zuul來定制化業(yè)務(wù)網(wǎng)關(guān)。
除了開源的Spring Cloud定制化Zuul,開源微服務(wù)框架jhipster也參與了定制,并集成到它的生態(tài)中。Jhipster主要包含generator-jhipster和jhipster-registry,前者star數(shù)微17.7k,fork數(shù)為3.5k,后者star數(shù)為604,fork為607。
Zuul1.0整體架構(gòu)設(shè)計如圖所示。
Zuul2.0整體架構(gòu)設(shè)計如圖所示。
Spring Cloud Gateway
SCG是基于Spring Framework 5.0和Spring Boot 2.0構(gòu)建的API網(wǎng)關(guān),提供路由等功能。其旨在提供一種簡單而有效的方法路由到API,并為它們提供跨領(lǐng)域的關(guān)注點,例如:安全性、監(jiān)視/指標和彈性。
主要特性:
- J ava8
- Spring Framework5
- Spring Boot2
- 動態(tài)路由
- Spring Handler Mapping 內(nèi)置的路由匹配
- HTTP 請求的路由匹配(路徑、方法、 Hea der 、主機等)
- 過濾器限定范圍以匹配路由
- 過濾器可以修改下游 HTTP 請求和 HTTP 響應(yīng)(添加、刪除 Header 、添加 / 刪除參數(shù)、重寫路徑、設(shè)置路徑等)
- API或配置驅(qū)動
- 支持Spring Cloud Discovery Client配置路由
SCG的專業(yè)術(shù)語包括:
- 路由:它是基本構(gòu)建模塊,主要包含ID、URI、斷言集合以及過濾器集合,如果能夠匹配斷言就會執(zhí)行路由。
- 斷言: 主要是指Java8的函數(shù)式斷言,輸入類型是Spring Framework的ServerWebExchange,基于斷言可以匹配基于headers或者parameters的http請求。
- 過濾器: 它是通過特殊的工廠方法構(gòu)造的基于Spring Framework GatewayFilter的實現(xiàn),通過過濾器開發(fā)者可以在http請求下行之前修改請求響應(yīng)參數(shù),在請求響應(yīng)返回之后可以修改響應(yīng)的結(jié)果。
SCG整體架構(gòu)設(shè)計如圖所示。
自研網(wǎng)關(guān)
一個API網(wǎng)關(guān)的基本功能包括統(tǒng)一接入、協(xié)議適配、流量管控與容錯,以及安全防護,這個四大基本功能構(gòu)成了網(wǎng)關(guān)的核心能力。網(wǎng)關(guān)首要的功能是負責(zé)統(tǒng)一接入,然后將請求的協(xié)議轉(zhuǎn)換成內(nèi)部的接口協(xié)議,在調(diào)用的過程中還要限流、降級和熔斷等容錯的方式來保護網(wǎng)關(guān)的整體穩(wěn)定,同時網(wǎng)關(guān)還要做到基本的安全防護(防刷控制),以及黑白名單(比如IP地址白名單)等基本的安全措施,主要包括:統(tǒng)一標準接入,具備高性能、高并發(fā)和高可靠性,具備負載均衡的能力;
除了基本的四個功能,網(wǎng)關(guān)運行良好的環(huán)境還包括注冊中心(比如通過Nacos讀取已經(jīng)發(fā)布的API接口的動態(tài)配置)。為了實現(xiàn)高性能,將數(shù)據(jù)全部異構(gòu)到緩存(比如Redis)中,同時還可以配合本機緩存來進一步的提高網(wǎng)關(guān)系統(tǒng)的性能。為了提高網(wǎng)關(guān)的吞吐率,可以使用NIO+Servlet3異步的方式,還可以利用Servlet3的異步特性將請求線程與業(yè)務(wù)處理線程分開,為后續(xù)的線程池隔離做好基本的支撐。訪問日志的存儲我們可以放到Hbase或者ES中,如果要作為開放網(wǎng)關(guān)使用,那么需要一個支持OAuth2.0協(xié)議的授權(quán)中心,同時還可以引入Nginx+Lua的方式,將一些基本的校驗判斷前置到應(yīng)用系統(tǒng)之上,這樣可以更加輕量級的處理網(wǎng)關(guān)接入的問題。
主要包括接入層,開發(fā)者可以通過Nginx和Lua腳本,解決限流、黑白名單、路由、負載均衡、長短連接以及容災(zāi)切換的問題。網(wǎng)關(guān)需要保證服務(wù)的穩(wěn)定性,需要接入注冊中心,因為本書是Spring Cloud Alibaba的布道書籍,所以強烈推薦使用Nacos作為注冊中心和配置中心。統(tǒng)一的鑒權(quán)中心,主要是統(tǒng)一解決網(wǎng)關(guān)為各個API服務(wù)的鑒權(quán)問題,當(dāng)然可以按照服務(wù)維度做隔離,自定義鑒權(quán)規(guī)則。統(tǒng)一用戶中心主要是解決用戶登錄問題,確保微服務(wù)調(diào)用的安全性。
自研網(wǎng)關(guān)還需要有泛化功能,使用者在調(diào)用提供者的接口的時候,不再需要API提供者的客戶端JAR包,因此也就沒有了POJO,通過泛化的方式進行遠程調(diào)用。一般情況下我們要通過RPC調(diào)用接口提供方的服務(wù),首先在系統(tǒng)中嵌入接口提供者的JAR包,然后使用JAR包里面的類和方法。對于一個網(wǎng)關(guān)系統(tǒng)來說,如果要調(diào)用N個接口,就需要N個JAR包,這樣的網(wǎng)關(guān)是很難維護的,當(dāng)然Dubbo RPC是支持泛化的。
網(wǎng)關(guān)要具備時間校驗、方法校驗、版本校驗和簽名校驗等功能,當(dāng)然網(wǎng)關(guān)還需要具備服務(wù)降級、日志記錄以及監(jiān)控與告警功能。
對比以上三種網(wǎng)關(guān)
|
網(wǎng)關(guān) |
限流 |
鑒權(quán) |
監(jiān)控 |
易用性 |
可維護性 |
成熟度 |
|
SCG |
可以通過IP,用戶,集群限流,提供了相應(yīng)的接口進行擴展 |
普通鑒權(quán)auth2.0 |
Gateway Metrics Filter |
簡單易用 |
Spring系列可擴展強,易配置和可維護性好 |
Spring社區(qū)成熟,但Gateway資源少。 |
|
Zuul2 |
可以通過配置文件配置集群限流和單服務(wù)器限流,也可以通過filter實現(xiàn)限流擴展 |
filter中實現(xiàn) |
Filter中實現(xiàn) |
參考資料比較少 |
可維護性差 |
開源不就資源少。 |
|
Zuul1 |
同上 |
同上 |
同上 |
同上 |
同上 |
同上 |
|
自研網(wǎng)關(guān) |
需要開發(fā) |
需要開發(fā) |
需要開發(fā) |
需要開發(fā) |
可維護性極高 |
需要開發(fā) |
總結(jié)
推薦使用Spring Cloud Alibaba+Spring Cloud Gateway,可以更加高效的利用Spring Cloud ALibaba的服務(wù)治理能力去融合網(wǎng)關(guān)API的治理,從而提升業(yè)務(wù)服務(wù)API的系統(tǒng)穩(wěn)定性。
當(dāng)前題目:架構(gòu)師如何選型分布式業(yè)務(wù)網(wǎng)關(guān)
網(wǎng)站地址:http://www.5511xx.com/article/djjojjc.html


咨詢
建站咨詢
