(一)背景介紹 目前,隨著微服務(wù)架構(gòu)的流行,大家紛紛采用微服務(wù)來實(shí)現(xiàn)新的系統(tǒng)或者進(jìn)行老系統(tǒng)的改造。而微服務(wù)架構(gòu)的優(yōu)勢正是讓敏捷開發(fā)和復(fù)雜的企業(yè)應(yīng)用持續(xù)交付成為可能。 雖然微服務(wù)架構(gòu)沒有公認(rèn)的技術(shù)標(biāo)準(zhǔn)和規(guī)范草案,但業(yè)界已經(jīng)有一些很有影響力的開源微服務(wù)架構(gòu)平臺。根據(jù)公司的業(yè)務(wù)系統(tǒng)項(xiàng)目現(xiàn)狀及公司的技術(shù)優(yōu)勢,統(tǒng)一開發(fā)框架團(tuán)隊(duì)采用了Spring-Cloud作為微服務(wù)的架構(gòu)平臺。Spring-Cloud作為一系列JAVA系統(tǒng)框架的有序集合,通過利用Spring-Boot的開發(fā)便利性簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),成為微服務(wù)架構(gòu)的集大成者和云計(jì)算的最佳業(yè)務(wù)實(shí)踐。 當(dāng)然,微服務(wù)在帶給我們太多好處的同時(shí), 同時(shí)也帶給我們許多問題需要解決。采用微服務(wù)后,所有的服務(wù)都變成了一個個細(xì)小的API。那么這些服務(wù)API該怎么正確的管理?API認(rèn)證授權(quán)如何實(shí)現(xiàn)?如何實(shí)現(xiàn)服務(wù)的負(fù)載均衡,熔斷,灰度發(fā)布,限流流控?如何合理的治理這些API服務(wù)尤其重要。在微服務(wù)架構(gòu)中,API Gateway作為整體架構(gòu)的重要組件,它抽象了微服務(wù)中都需要的公共功能,同時(shí)提供了客戶端負(fù)載均衡,服務(wù)自動熔斷,灰度發(fā)布,統(tǒng)一認(rèn)證,限流流控,日志統(tǒng)計(jì)等豐富的功能,幫助我們解決很多API管理難題。 (二)API網(wǎng)關(guān)及主要功能 2.1 什么是API網(wǎng)關(guān) API Gateway 是微服務(wù)架構(gòu)體系中的一類型特殊服務(wù),它是所有微服務(wù)的入口,它的職責(zé)是執(zhí)行路由請求、協(xié)議轉(zhuǎn)換、聚合數(shù)據(jù)、認(rèn)證、限流、熔斷等公共基礎(chǔ)服務(wù)。 從部署結(jié)構(gòu)上說,上圖是不采用API Gateway的微服務(wù)部署模式,我們可以清晰看到,這種部署模式下,客戶端與負(fù)載均衡器(一般是Nginx)直接交互,完成服務(wù)的調(diào)用。但這是這種模式下,也有它的不足。
Chris Richardson在http:///中也提及到,在微服務(wù)的架構(gòu)模式下,API Gateway是微服務(wù)架構(gòu)中一個非常通用的模式,利用API Gateway可以解決調(diào)用方如何調(diào)用獨(dú)立的微服務(wù)這個問題。 上圖為采用API Gateway模式,我們通過上圖可以看到,API Gateway做為系統(tǒng)統(tǒng)一入口,實(shí)現(xiàn)了對各個微服務(wù)間的整合,同時(shí)又做到了對客戶端友好,屏蔽系統(tǒng)了復(fù)雜性和差異性。對比之前無API Gateway模式,API Gateway具有幾個比較重要的優(yōu)點(diǎn):
2.2 API的網(wǎng)關(guān)分類 Chris Richardson 在他的博客中把 API 網(wǎng)關(guān)劃分為以下兩種:
單節(jié)點(diǎn)網(wǎng)關(guān):單節(jié)點(diǎn)的 API網(wǎng)關(guān)為每個客戶端提供不同的API,而不是提供一種萬能風(fēng)格的API。 Backends for frontends 網(wǎng)關(guān):這種模式是針對不同的客戶端來實(shí)現(xiàn)一個不同的API網(wǎng)關(guān)。 2.3 API Gateway中的主要功能 下面我們用圖來說明API Gateway中一些重要的功能: Gateway 職責(zé)之1 :負(fù)載均衡 API Gateway可以幫助我們輕松的實(shí)現(xiàn)負(fù)載均衡,利用服務(wù)發(fā)現(xiàn)知道所有Service的地址和位置,通過在API Gateway中實(shí)現(xiàn)負(fù)載均衡算法,ZUUL默認(rèn)使用RR算法實(shí)現(xiàn)負(fù)載均衡效果。 Gateway 職責(zé)之2 :接口路由 需要根據(jù)各種條件將請求路由到正確的目的地。在實(shí)現(xiàn)上采用了路由服務(wù),Gateway定期從路由服務(wù)獲取路由表,達(dá)到了解耦、實(shí)時(shí)更新的效果;經(jīng)過通用邏輯預(yù)處理后,無線接口請求將進(jìn)一步分發(fā)給后端處理。URL或者ServiceID在配置文件或者系統(tǒng)里做映射,分發(fā)邏輯根據(jù)請求中的URL信息,找到對應(yīng)的業(yè)務(wù)后端ServiceID或者URL,然后把請求交給業(yè)務(wù)后端做相應(yīng)處理。 Gateway 職責(zé)之3: 服務(wù)熔斷 在實(shí)際生產(chǎn)中,一些服務(wù)很有可能因?yàn)槟承┰虬l(fā)生故障,如果此時(shí)不采取一些手段,會導(dǎo)致整個系統(tǒng)“雪崩”?;蛞蛳到y(tǒng)整體負(fù)載的考慮,會對服務(wù)訪問次數(shù)進(jìn)行限制。服務(wù)熔斷、服務(wù)降級就是解決上述問題的主要方式。API Gateway可以幫助我們實(shí)現(xiàn)這些功能,對于服務(wù)的調(diào)用次數(shù)的限制,當(dāng)某服務(wù)達(dá)到上限時(shí),API Gateway會自動停止向上游服務(wù)發(fā)送請求,并像客戶端返回錯誤提示信息或一個統(tǒng)一的響應(yīng),進(jìn)行服務(wù)降級。對于需要臨時(shí)發(fā)生故障的服務(wù),API Gateway自動可以打開對應(yīng)服務(wù)的斷路器,進(jìn)行服務(wù)熔斷,防止整個系統(tǒng)“雪崩”。 Gateway 職責(zé)之4 : 灰度發(fā)布 服務(wù)發(fā)布上線過程中,我們不可能將新版本全部部署在生產(chǎn)環(huán)節(jié)中,因?yàn)樾掳姹静]有接受真實(shí)用戶、真實(shí)數(shù)據(jù)、真實(shí)環(huán)境的考驗(yàn),此時(shí)我們需要進(jìn)行灰度發(fā)布,灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問題,同時(shí)影響小。API Gateway可以幫助我們輕松的完成灰度發(fā)布,只需要在API Gateway中配置我們需要的規(guī)則,按版本,API Gateway會自動為我們完成實(shí)際的請求分流。 Gateway 職責(zé)之5: 權(quán)限認(rèn)證 不同的服務(wù)之間常常有一些共有的邏輯需要處理,比如權(quán)限認(rèn)證,由于 Gateway 恰巧在各個微服務(wù)的前端,可以在 Gateway 實(shí)現(xiàn)權(quán)限的認(rèn)證,比如可以在 Gateway 層實(shí)現(xiàn) cookie 或 token 的認(rèn)證。 Gateway 職責(zé)之6:限流 對于任何一類請求,都設(shè)置了容量上限,并不能無限制處理。Gateway可以為每類請求設(shè)置并發(fā)上限,當(dāng)?shù)竭_(dá)上限時(shí),Gateway將不在轉(zhuǎn)發(fā)請求,而是直接返回,保護(hù)后端服務(wù)。如果在后端服務(wù)過載的情況下,仍然轉(zhuǎn)發(fā)請求,只會惡化問題。 Gateway 職責(zé)之7: 服務(wù)演進(jìn) 借助 Gateway 你可以很方便的在 Gateway 之后部署不同的服務(wù),也就是可以同時(shí)存在兩種不同的服務(wù),這樣可以幫助單體應(yīng)用向微服務(wù)漸進(jìn)式的演化. Gateway 職責(zé)之8:數(shù)據(jù)聚合 由于不同的客戶端往往需要的數(shù)據(jù)完全不同,而這些數(shù)據(jù)又是不同的 service 提供的,借助 Gateway 我們可以方便完成來自不同 service 的數(shù)據(jù)聚合,以達(dá)到根據(jù)不同 client 進(jìn)行數(shù)據(jù)定制的目的 Gateway 職責(zé)之9:協(xié)議轉(zhuǎn)換 鑒于不同的團(tuán)隊(duì)采用的數(shù)據(jù)協(xié)議可能完全不同,Gateway 可以根據(jù)場景需要對不同的微服務(wù)之間進(jìn)行協(xié)議轉(zhuǎn)換,上圖是HTTP協(xié)議與Dubbo協(xié)議轉(zhuǎn)換的架構(gòu)圖實(shí)現(xiàn)。 Gateway 職責(zé)之10:監(jiān)控報(bào)警 Gateway可以對接運(yùn)維報(bào)警工具。當(dāng)出現(xiàn)問題時(shí),會及時(shí)報(bào)警,盡早發(fā)現(xiàn)問題,減少損失。 (三)API網(wǎng)關(guān)技術(shù)選型 主流API網(wǎng)關(guān)技術(shù)棧比較: 主流API網(wǎng)關(guān)技術(shù)說明: 目前比較成熟以及用的比較廣泛的網(wǎng)關(guān)有以下幾種:
選型考慮: 業(yè)務(wù)場景支持:
技術(shù)成熟度及生態(tài):
成本效率:
性能:
綜上我們采用了ZUUL作為我們的二次開發(fā)平臺。 (四)API網(wǎng)關(guān)架構(gòu)與設(shè)計(jì) 4.1 物理架構(gòu)部署圖: 網(wǎng)關(guān)的調(diào)用方主要包括瀏覽器,應(yīng)用服務(wù),App應(yīng)用,以及三方開發(fā)者和其他業(yè)務(wù)調(diào)用方。通過LVS做負(fù)載均衡,網(wǎng)關(guān)應(yīng)用調(diào)用到實(shí)際的業(yè)務(wù)集群。 4.2 網(wǎng)關(guān)邏輯架構(gòu)圖: API網(wǎng)關(guān)基于ZUUL-Core及SpringCloud體系架構(gòu),對Zuul-Core中的FilterLoader及基于ZUUL中的Locator機(jī)制都做了相應(yīng)的二次開發(fā),支持相應(yīng)的特性功能。下圖是API-GateWay的整體架構(gòu)圖。 4.3 網(wǎng)關(guān)業(yè)務(wù)模塊圖: 網(wǎng)關(guān)生態(tài)基于統(tǒng)一開發(fā)框架,內(nèi)部主要包含控制臺、網(wǎng)關(guān)核心、網(wǎng)關(guān)統(tǒng)計(jì)與監(jiān)控三大模塊:
統(tǒng)計(jì)與監(jiān)控模塊主要完成API調(diào)用的統(tǒng)計(jì)和監(jiān)控報(bào)警 4.5 網(wǎng)關(guān)核心設(shè)計(jì)
動態(tài)Filter:改變了ZUUL默認(rèn)基于Groovy的Filter加載機(jī)制,采用基于JAVA-jar包的動態(tài)Filter加載,對業(yè)務(wù)邏輯集成到網(wǎng)關(guān)平臺更加方便友好,業(yè)務(wù)同事只需要關(guān)注業(yè)務(wù)邏輯,屏蔽了網(wǎng)關(guān)底層的技術(shù)實(shí)現(xiàn)細(xì)節(jié)。
二級緩存:網(wǎng)關(guān)高性能特性要求,需要一個高性能的本地緩存負(fù)責(zé)一些配置關(guān)鍵信息:例如;路由表;黑白名單等等。 藍(lán)綠部署:在服務(wù)不停機(jī)的情況下, 實(shí)現(xiàn)根據(jù)版本信息的流量切換,增加系統(tǒng)的SLA水平。目前可以實(shí)現(xiàn)基于相同服務(wù)名下,不同版本服務(wù)注冊在同一個Eureka注冊中心的新舊版本服務(wù)切換。 控制臺:控制臺功能是API網(wǎng)關(guān)的一個主要功能, 開發(fā)人員只需要通過控制臺就可以自助的完成路由的創(chuàng)建,公共組件的路由綁定等服務(wù)。
此外,我們還會對ZUUL自帶的線程池隔離機(jī)制;鏈?zhǔn)教幚頇C(jī)制做進(jìn)一步的深度開發(fā)整合,以及后續(xù)我們陸續(xù)會開發(fā)和SLA相關(guān)的一些功能包括熔斷降級;限流保護(hù)等等功能 (五)總結(jié) API Gateway在微服務(wù)架構(gòu)中起到了至關(guān)重要的作用。在文章中我們介紹了什么是API Gateway以及為什么需要API Gateway。API Gateway它作為微服務(wù)系統(tǒng)的大門,向我們提供了請求轉(zhuǎn)發(fā),服務(wù)熔斷,限流流控等公共功能,它又統(tǒng)一整合了各個微服務(wù),對外屏蔽了系統(tǒng)的復(fù)雜性和差異性。 介紹了我們在網(wǎng)關(guān)技術(shù)選型主要基于什么考慮做技術(shù)選型方面的工作,以及API網(wǎng)關(guān)系統(tǒng)的架構(gòu)設(shè)計(jì),及主要功能模塊等內(nèi)容。 隨后我們會給業(yè)務(wù)系統(tǒng)開發(fā)同事提供接入網(wǎng)關(guān)平臺的第三方組件開發(fā)規(guī)范;以及后續(xù)在測試環(huán)境,生產(chǎn)環(huán)境部署發(fā)布服務(wù)流程及使用文檔說明,使網(wǎng)關(guān)平臺逐漸工具化,幫助業(yè)務(wù)系統(tǒng)更好實(shí)踐微服務(wù)及提升整體SLA水準(zhǔn)。 |
|