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