基於Spring cloud gateway定製的微服務網關

在構建微服務的架構體系過程當中,API網關是一個很是重要的組件。那咱們應該怎樣實現一個微服務API網關,本文主要介紹Spring Cloud Gateway的功能,以及如何基於Spring Cloud Gateway定製本身的網關。程序員

基於Spring cloud gateway定製的微服務網關
Spring Cloud Gateway
Spring Cloud Gateway提供的是一個用於在Spring MVC之上構建API網關的library,它的目標是提供一種簡單而有效的方式路由API請求,它提供了一個切面,主要關注:安全、監控/metrics、彈性伸縮。
Spring Cloud Gateway 特性:redis

使用Spring Framework 5, Project Reactor 和 Spring Boot 2.0實現;
能夠在請求的任何屬性上匹配路由;
經過Predicate 和 filter 指定路由;
集成了Hystrix 的熔斷機制;
集成了Spring Cloud 的服務發現機制;
易於編寫 Predicate 和 Filter;
請求限流;
重定向;後端

定製API網關的目標安全

從Spring cloud gateway的官方文檔中能夠查到,它主要關注於安全、監控、彈性伸縮,可是它只是提供了開發這些功能的基礎,直接用於生產的話,用起來體驗不是很好。各類配置都是寫在application.yaml的配置文件中,修改起來不是很方便,每次修改都須要重啓服務,有一種不須要重啓服務的方法是使用配置中心;可是這些配置(路由策略、熔斷機制、限流策略等)配置不是很好記,不知足國內軟件的要求(漂亮的配置後臺)。架構

安全:關於安全其實Spring cloud gateway自己並無任何實現,要想實現網關的安全控制,通常有兩種方式:依賴Spring boot security實現基於JWT(或者OAuth2) token的認證;另外一種就是直接使用網關分配appId,來識別事先配置的權限。以上是API權限的控制,還有一種安全是參數防篡改的方法:對請求參數作簽名驗簽名。app

API網關的安全目標是,支持多種安全方式自由選擇和組合,而且能夠在管理後臺配置,實時生效。分佈式

動態路由:意思是在線修改路由配置,並實時生效。Spring cloud gateway自身提供的路由配置方式有兩種:編寫代碼和application.yaml中配置,在Spring cloud gateway啓動的時候加載到內存中,因此要修改路由的話也是須要重啓網關。但Spring cloud gateway提供了自定義路由RouteDefinitionRepository類的入口,而且還監聽了刷新路由事件RefreshRoutesEvent。ide

API網關的動態路由的目標是,支持在管理後臺配置和修改服務路由,而且實時生效。具體實現方式能夠參考 動態路由的實現方式詳解。微服務

熔斷、降級:在分佈式系統中這兩個特性通常是同時出現,表明了系統容錯性。Spring cloud gateway中依賴Hystrix來實現,目前支持的是在application.yaml中配置熔斷和降級策略,這種配置方式,修改的話須要重啓網關。工具

API網關的熔斷降級配置目標是,支持在管理後臺操做:是否開啓斷路器、熔斷策略、調整降級方案,而且實時生效。

限流:API網關上通常會有大量請求,爲了提供總體服務的可用性和穩定性,常常會對指定服務限流。當請求量達到限流上限的時候,能夠選擇拒絕服務、排隊或者降級;Spring cloud gateway中依賴了redis來實現限流,經過KeyResolver來配置限流策略。它也存在一樣的問題,就是修改配置須要重啓服務。

API網關的限流目標是,支持管理後臺配置限流策略,以及速率調整,而且實時生效。
彈性伸縮:這通常是有基礎設施平臺提供的特性,通常的容器雲平臺都是支持,實時監控API網關的壓力和健康狀態,自動作出相應的伸縮容處理。整個Spring cloud體系都是基於雲原生的指導思想建設的,因此仍是比較容易實現這一點的。

API網關的彈性伸縮目標是,支持標準的容器雲平臺的部署,而且能提供平臺監控指標。
監控:監控是一個高可用系統必不可少的功能,Spring cloud gateway是經過Spring boot actuator實現可監控的,它能夠輸出全方位的監控數據,而且還支持定製監控指標。還經過micrometer提供了多種監控數據格式的輸出,最經常使用的就是prometheus。

API網關的監控目標是,經過Actuator+Prometheus+Grafana三個工具組合來實現API網關的可視化監控,而且配置相應的報警。

API文檔:一個完美的API文檔是API網關臉面,由於接入API網關的應用(也就是API的用戶)最早看到的就是API文檔,做爲程序員你們都不喜歡寫這種文檔,所以API網關必須能提供一種方法,方便輸出漂亮的API文檔。目前swagger ui早已在Spring cloud的後端微服務中流行開來,所以API網關須要將它們聚合起來。

API網關的API文檔目標是,經過聚合後端服務的swagger ui來實現API文檔的輸出,固然還須要結合安全特性來控制API文檔的權限。

實現一個API網關

上面設定了要實現一個API網關的各類目標(要求),而且論證了基於Spring cloud gateway實現它們的可行性,下面就須要依依實現它們了,最終你會發現,實現了一個阿里雲的API網關。

相關文章
相關標籤/搜索