作者:周世芬,單位:中國移動(dòng)智慧家庭運(yùn)營中心
什么是網(wǎng)關(guān)?網(wǎng)關(guān)是一個(gè)服務(wù)器,是系統(tǒng)的唯一入口。網(wǎng)關(guān)封裝了系統(tǒng)內(nèi)部架構(gòu),為每個(gè)客戶端提供一個(gè)定制的API。它可能還具有其它職責(zé),如身份驗(yàn)證、監(jiān)控、負(fù)載均衡等。網(wǎng)關(guān)方式的核心要點(diǎn)是,所有的客戶端和消費(fèi)端都通過統(tǒng)一的網(wǎng)關(guān)接入微服務(wù),在網(wǎng)關(guān)層處理所有的非業(yè)務(wù)功能。
作網(wǎng)關(guān)可以提供請(qǐng)求路由、鑒權(quán)認(rèn)證(身份/權(quán)限認(rèn)證)、熔斷限流、負(fù)載均衡、灰度發(fā)布、日志管理、流量監(jiān)控、協(xié)議轉(zhuǎn)換等功能,其中請(qǐng)求路由和過濾功能是網(wǎng)關(guān)的核心能力。
請(qǐng)求路由
網(wǎng)關(guān)作為系統(tǒng)的統(tǒng)一入口,是需要有請(qǐng)求路由功能的,因?yàn)檎{(diào)用端不需要知道自己要用到的其它服務(wù)的地址,全部交給網(wǎng)關(guān)來處理,通過路由功能就可以將請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo)微服務(wù)。
負(fù)載均衡
網(wǎng)關(guān)結(jié)合負(fù)載均衡技術(shù),根據(jù)各個(gè)微服務(wù)實(shí)例的負(fù)載情況,對(duì)請(qǐng)求實(shí)現(xiàn)和下游服務(wù)實(shí)現(xiàn)負(fù)載均衡。
鑒權(quán)認(rèn)證
一般而言,無論對(duì)內(nèi)網(wǎng)還是外網(wǎng)的接口,SSL 加密及證書管理、Session 驗(yàn)證、授權(quán)、數(shù)據(jù)校驗(yàn),以及對(duì)請(qǐng)求源進(jìn)行惡意攻擊的防范。錯(cuò)誤處理越靠前的位置就是越好,而網(wǎng)關(guān)是統(tǒng)一管理安全性的絕佳場(chǎng)所,可以將鑒權(quán)認(rèn)證的部分抽取到網(wǎng)關(guān)層,下游服務(wù)系統(tǒng)無須關(guān)注認(rèn)證的邏輯,只關(guān)注自身業(yè)務(wù)即可。
日志記錄
網(wǎng)關(guān)可以作為統(tǒng)一的日志記錄和收集器,對(duì)服務(wù)日志的請(qǐng)求信息和響應(yīng)信息進(jìn)行記錄。
監(jiān)控告警
網(wǎng)關(guān)可以對(duì)機(jī)器指標(biāo)、JVM指標(biāo)等方面進(jìn)行監(jiān)控,同時(shí)還可以監(jiān)控流量健康狀態(tài),并提供配套的告警機(jī)制。
熔斷限流
根據(jù)客戶端的請(qǐng)求次數(shù)信息,在網(wǎng)關(guān)上可以配置一個(gè)閾值,當(dāng)請(qǐng)求數(shù)超過閾值時(shí)就直接返回錯(cuò)誤而不繼續(xù)訪問后臺(tái)服務(wù),從而對(duì)系統(tǒng)實(shí)現(xiàn)限流控制。同時(shí)當(dāng)出現(xiàn)流量洪峰達(dá)到配置的失敗閾值或者后端服務(wù)出現(xiàn)延遲或故障時(shí),網(wǎng)關(guān)能夠主動(dòng)進(jìn)行熔斷,保護(hù)后端服務(wù)。
灰度發(fā)布
網(wǎng)關(guān)可以根據(jù)請(qǐng)求中的特殊標(biāo)記和后端服務(wù)列表元數(shù)據(jù)標(biāo)識(shí)動(dòng)態(tài)做到對(duì)相同服務(wù)不同版本的實(shí)例進(jìn)行導(dǎo)流,實(shí)現(xiàn)無感知的灰度發(fā)布。
API文檔
如需要將服務(wù)的API暴露給外部的開發(fā)人員,那么必須考慮使用API文檔,將后端的微服務(wù)暴露給網(wǎng)關(guān),這樣就不需要知道每一個(gè)后端微服務(wù)的API文檔地址,起到了對(duì)后端API聚合的效果。
協(xié)議轉(zhuǎn)換
API網(wǎng)關(guān)的一大作用在于構(gòu)建異構(gòu)系統(tǒng),API網(wǎng)關(guān)作為單一入口,通過協(xié)議轉(zhuǎn)換整合后臺(tái)基于REST、AMQP、Dubbo等不同風(fēng)格和實(shí)現(xiàn)技術(shù)的微服務(wù),面向Web Mobile、開放平臺(tái)等特定客戶端提供統(tǒng)一服務(wù)。
網(wǎng)關(guān)類型大致可分為兩類,一類是流量網(wǎng)關(guān),與具體的后端業(yè)務(wù)應(yīng)用和服務(wù)完全無關(guān),且可攔截許多非法或無效請(qǐng)求,控制流量進(jìn)入集群;一類是業(yè)務(wù)網(wǎng)關(guān),具備與業(yè)務(wù)非強(qiáng)相關(guān)的功能,如權(quán)限控制、協(xié)議適配、熔斷限流、安全防護(hù)等。
- 流量網(wǎng)關(guān)
流量網(wǎng)關(guān)通常只專注于全局的API管理策略,比如全局流量監(jiān)控、日志記錄、全局限流、黑白名單控制、接入請(qǐng)求到業(yè)務(wù)系統(tǒng)的負(fù)載均衡等,有點(diǎn)類似防火墻。
- 業(yè)務(wù)網(wǎng)關(guān)
當(dāng)單體應(yīng)用被拆分成多個(gè)不同的微服務(wù)應(yīng)用后,也帶來了一些問題。一些與業(yè)務(wù)非強(qiáng)相關(guān)的功能,比如權(quán)限控制、日志輸出、熔斷限流等,每個(gè)微服務(wù)應(yīng)用都需要,導(dǎo)致存在著大量重復(fù)實(shí)現(xiàn)。業(yè)務(wù)網(wǎng)關(guān)的出現(xiàn)就是為了解決上述問題,將通用功能整合到一起,避免重復(fù)開發(fā),這樣很多應(yīng)用層需要考慮的事情可以依托業(yè)務(wù)網(wǎng)關(guān)。
業(yè)務(wù)網(wǎng)關(guān)一般部署在流量網(wǎng)關(guān)之后、業(yè)務(wù)系統(tǒng)之前,比流量網(wǎng)關(guān)更靠近業(yè)務(wù)系統(tǒng)。通常API網(wǎng)指的是業(yè)務(wù)網(wǎng)關(guān)。有時(shí)候也會(huì)模糊流量網(wǎng)關(guān)和業(yè)務(wù)網(wǎng)關(guān)的界線,讓一個(gè)網(wǎng)關(guān)承擔(dān)所有的工作,所以這兩者之間并沒有嚴(yán)格的界線。
目前常見的開源網(wǎng)關(guān)大致上按照語言分類有如下幾類:
Nginx+lua: OpenResty、Kong、Orange、Abtesting gateway等;
Java: Zuul/Zuul2、Spring Cloud Gateway、Kaazing KWG等;
Go: Traefik、Janus、fagongzi、Grpc-gateway;
NodeJS:Express Gateway、Micro Gateway。
1??KONG網(wǎng)關(guān)
Kong是流量層網(wǎng)關(guān),是一個(gè)高性能、云原生、可擴(kuò)展的網(wǎng)關(guān)系統(tǒng)。首先最底層是基于Nginx,然后在此基礎(chǔ)上增加Lua腳本庫,形成了OpenResty,攔截請(qǐng)求,響應(yīng)生命周期,可以通過Lua編寫腳本,所以插件比較豐富,同時(shí)繼承了OpenResty的高性能、易擴(kuò)展性等特點(diǎn)。主要由3個(gè)組件組成:
Kong Server:基于Nginx的服務(wù)器,用來接收 API請(qǐng)求。
Apache Cassandra/PostgreSQL:用來存儲(chǔ)操作數(shù)據(jù)。
Kong Dashboard:官方推薦UI管理工具,也可以使用RESTful方式管理 Admin api。
Kong 提供了插件機(jī)制來擴(kuò)展其功能,插件在 API 請(qǐng)求響應(yīng)循環(huán)的生命周期中被執(zhí)行,且在任何基礎(chǔ)架構(gòu)上都可以運(yùn)行具有以下的特性:
提供了多樣化的認(rèn)證層來保護(hù)API。
可對(duì)出入流量進(jìn)行管制。
提供了可視化的流量檢查、監(jiān)視分析API。
能夠及時(shí)的轉(zhuǎn)換請(qǐng)求和相應(yīng)。
提供log解決方案。
可通過api調(diào)用Serverless 函數(shù)。

圖1
2??OpenResty
OpenResty是基于Nginx與Lua的集成開發(fā)的高性能Web平臺(tái),其內(nèi)部集成了大量精良的Lua庫、第三方模塊以及大多數(shù)的依賴項(xiàng)。用于方便地搭建能夠處理超高并發(fā)、擴(kuò)展性極高的動(dòng)態(tài)Web應(yīng)用、Web服務(wù)和動(dòng)態(tài)網(wǎng)關(guān)。通過集成眾多設(shè)計(jì)良好的Nginx模塊,OpenResty有效地把Nginx服務(wù)器轉(zhuǎn)變?yōu)橐粋€(gè)強(qiáng)大的Web應(yīng)用服務(wù)器,基于此開發(fā)人員可以使用Lua編程語言對(duì)Nginx核心以及現(xiàn)有的各種Nginx C模塊進(jìn)行腳本編程,構(gòu)建出可以處理一萬以上并發(fā)請(qǐng)求的極端高性能的Web應(yīng)用。
3??Zuul
Zuul是Netflix開源的的一款提供動(dòng)態(tài)路由、監(jiān)控、彈性、安全的API網(wǎng)關(guān)組件,基于Java技術(shù)棧開發(fā),可以和Eureka、Ribbon、Hystrix等組件配合使用。
Zuul本質(zhì)是通過一系列過濾器實(shí)現(xiàn)網(wǎng)關(guān)的各種功能,主要實(shí)現(xiàn)以下功能:
統(tǒng)一鑒權(quán):識(shí)別每個(gè)資源的身份驗(yàn)證需求并拒絕不滿足它們的請(qǐng)求;
監(jiān)控:與邊緣位置追蹤有意義的數(shù)據(jù)和統(tǒng)計(jì)結(jié)果,從而帶來精確的生產(chǎn)視圖;
動(dòng)態(tài)路由:動(dòng)態(tài)路由請(qǐng)求到不同的后端集群;
壓力測(cè)試:逐漸增加集群的流量,以評(píng)估性能;
限流:為每種請(qǐng)求類型分配容量,并丟棄超過限制的請(qǐng)求;
多區(qū)域彈性:跨越AWS Region進(jìn)行請(qǐng)求路由,旨在實(shí)現(xiàn) ELB(Elastic Load Balancing:彈性負(fù)載均衡)使用的多樣化,以及讓系統(tǒng)的邊緣更貼近系統(tǒng)的使用者;
靜態(tài)響應(yīng)處理:直接在邊緣構(gòu)建一些響應(yīng),而不是將它們轉(zhuǎn)發(fā)到內(nèi)部集群。

圖2
4??Traefik
Traefik是一個(gè)為了讓部署微服務(wù)更加便捷而誕生的現(xiàn)代HTTP反向代理、負(fù)載均衡工具。它支持多種后臺(tái) (Docker、Swarm、 Kubernetes、Marathon、Mesos、Consul、Etcd、Zookeeper等)自動(dòng)化、動(dòng)態(tài)的對(duì)其配置文件設(shè)置。它是一個(gè)邊緣路由器,它會(huì)攔截外部的請(qǐng)求并根據(jù)邏輯規(guī)則選擇不同的操作方式,這些規(guī)則決定著這些請(qǐng)求到底該如何處理。Traefik提供自動(dòng)發(fā)現(xiàn)能力,會(huì)實(shí)時(shí)檢測(cè)服務(wù),并自動(dòng)更新路由規(guī)則。
Traefix具有以下幾點(diǎn)特性:
無需安裝其他依賴,通過Go語言編寫的單一可執(zhí)行文件;
多種后臺(tái)支持:Docker、Swarm、Kubernetes、Marathon、Mesos、 Consul、Etcd;
支持支持Rest API、Websocket、HTTP/2、Docker鏡像;
監(jiān)聽后臺(tái)變化進(jìn)而自動(dòng)化應(yīng)用新的配置文件設(shè)置;
配置文件熱更新,無需重啟進(jìn)程;
后端斷路器、負(fù)載均衡、容錯(cuò)機(jī)制;
具有前端web頁面監(jiān)控服務(wù)指標(biāo)

圖3
5??Spring Cloud Gateway
SpringCloud Gateway屬于Spring Cloud生態(tài)系統(tǒng)中的網(wǎng)關(guān),它基于Spring5.0+SpringBoot2.0+WebFlux(基于高性能的Reactor模式響應(yīng)式通信框架Netty,異步?阻塞模型)等技術(shù)開發(fā),旨在為微服務(wù)架構(gòu)提供?種簡(jiǎn)單有效的統(tǒng)?的API路由管理方式。特征如下:
集成Hystrix斷路器;
集成Spring Cloud服務(wù)發(fā)現(xiàn)功能;
易于編寫的Predicates(斷言)和 Filters(過濾器);
可對(duì)特定路由進(jìn)行Predicates和Filters;
具備一些網(wǎng)關(guān)的高級(jí)功能:路由轉(zhuǎn)發(fā)、負(fù)載均衡、熔斷限流、鑒權(quán)、路徑重寫、日志監(jiān)控等。
SpringCloud Gateway的三大核心概念,包括Route(路由)、Predicate(斷言)、Filter(過濾)。
? Route:路由是構(gòu)建網(wǎng)關(guān)的基本模塊,由ID,目標(biāo)URI,一系列的斷言和過濾器組成,如果斷言為true,則匹配該路由。
? Predicate:參考java8的java.util.function.Predicate開發(fā)人員可以匹配HTTP請(qǐng)求中的所有內(nèi)容(例如請(qǐng)求頭、請(qǐng)求參數(shù)),如果請(qǐng)求與斷言相匹配則進(jìn)行路由。
? Filter:指的是由Spring框架中GatewayFilter實(shí)例使用過濾器,可以在請(qǐng)求被路由之前或者之后對(duì)請(qǐng)求進(jìn)行修改。
web請(qǐng)求通過匹配條件(predicate),定位到真正的服務(wù)節(jié)點(diǎn),并在這個(gè)轉(zhuǎn)發(fā)過程的前和后,通過Filter進(jìn)行一些精細(xì)化控制和管理,有了這兩個(gè)元素,再加上目標(biāo)地址,就可以實(shí)現(xiàn)一個(gè)具體的路由了。

圖4
從圖5的流程圖可知:客戶端向Spring Cloud Gateway發(fā)出請(qǐng)求,然后在Gateway Handler Mapping中找到與請(qǐng)求相匹配的路由,將其發(fā)送到GatewayWeb Handler。
Handler再通過指定的過濾器鏈來將請(qǐng)求發(fā)這到我們實(shí)際的服務(wù)執(zhí)行業(yè)務(wù)邏輯,然后返回。
過濾器之間用虛線分開是因?yàn)檫^濾器可能會(huì)在發(fā)送代理請(qǐng)求之前 (“pre”) 或之后(“post”) 執(zhí)行業(yè)務(wù)邏輯。Filter在“pre”類型的過濾器可以做參數(shù)校驗(yàn)、權(quán)限校驗(yàn)、流量監(jiān)控、日志輸出、協(xié)議轉(zhuǎn)換等,在“post”類型的過濾器中可以做響應(yīng)內(nèi)容、響應(yīng)頭的修改,對(duì)日志的輸出、流量監(jiān)控等有著非常重要的作用。

圖5
18030183032