雲服務下的動態路由網關
最近整理雲服務網關,通過圖形界面配置實現動態路由、動態許可權、限流配額等功能,為項目提供統一的外網調用管理。總結如下:
網關的架構設計模式
傳統的沒有網關參與的互聯網架構,是通過負載均衡期分發http請求到後端的服務系統,缺點是無法對後端服務進行統一的管理。
基於雲服務開發框架的互聯網架構引入了服務註冊中心,後端服務均註冊到服務註冊中心,網關本身也註冊到服務註冊中心,網關可以從服務註冊中心獲取後端服務列表。服務註冊中心的引入,可以有效管理後端服務,但是作為網關產品,需要處理異構系統的系統,如果強制使用服務註冊中心,對其他系統具有侵入性。
網關產品架構採用URL鏈接轉發形式(不採用映射到服務名的模式),這樣能接入各種異構系統。
實現動態路由
動態路由需要達到可持久化配置,動態刷新的效果。如架構圖所示,不僅要能滿足從配置文件properties載入路由信息,還需要從資料庫載入我們的配置。另外一點是,路由信息在容器啟動時就已經載入進入了內存,我們希望配置完成後,實施發布,動態刷新內存中的路由信息,達到不停機維護路由信息的效果。
實現動態路由,可以通過擴展SimpleRouteLocator類並實現RefreshbleRouterLocator來實現自動動態刷新。在子類中Overide locateRoutes方法,從資料庫中讀取路由信息,併合併到從配置文件中讀取的路由配置信息中返回。這樣就實現了通過圖形界面將路由表保存到資料庫的功能。
實現動態路由刷新,可以自定義一個Service注入到Spring,在Service中生成RouteRefreshEvent事件,通過事件可以觸髮網關內部一系列的路由表刷新流程。
在界面中添加手動觸發路由刷新功能的按鈕。
locateRoutes方法默認在一分鐘左右自動執行一次刷新(觸發的機制暫時不清楚),更改路由配置後,在自動刷新執行前,路由配置不起作用。因此在圖形界面中添加了手動出發刷新的按鈕,在後台添加Rest介面,調用步驟2中的Service生成RouteRefreshEvent事件,從而完成觸發。
加強路由刷新Rest介面的安全性
因為路由刷新Rest介面是寫在網關模塊中的,不同於其他業務模塊的Rest介面需要通過網關進行路由映射和轉發,用戶可以直接請求網關的Rest介面,這樣就繞過了網關的許可權認證處理。為避免帶來安全性的問題,通過WebMvcConfigurerAdapter添加攔截器,對用戶的token進行驗證,未登錄的用戶不能調用路由刷新介面。該攔截器不同於網關的filter,網關的filter對指定前綴的url請求進行過濾,攔截器對發送給Contorller的請求進行攔截。


TAG:架構學習之路 |