1. 程式人生 > 程式設計 >Spring Cloud Zuul路由規則動態更新解析

Spring Cloud Zuul路由規則動態更新解析

這篇文章主要介紹了Spring Cloud Zuul路由規則動態更新解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

背景

Spring Cloud Zuul 作為微服務的閘道器,請求經過zuul路由到內部的各個service,由於存在著新增/修改/刪除服務的路由規則的需求,zuul的路由規則的動態變更功能 提供了

無須重啟zuul閘道器,即可實時更新,現有如下幾種方式:

一、基於refresh + config-server事件動態重新整理

(1)spring boot 集成了spring actuator 提供的 refresh功能後,在congfig-server的git配置倉庫中新增一個zuul的路由規則,

(2)post方式重新整理refresh端點http://127.0.0.1:8080/refresh(以本機為例)

(3) 再次訪問zuul發現路由規則中存在新增的規則

從觸發refresh操作開始 -> ZuulPropeties中route更新 整個流程如下:

Zuul閘道器的路由規則載入核心類 DiscoveryClientRouteLocator 和 SimpleRouteLocator,詳細可參考 Spring Cloud Zuul原始碼。這裡不做分析。

路由規則的載入機制主要是通過SimpleRouteLocator來載入ZuulPropetties中的路由規則。上圖說明了整個從refresh到屬性注入ZuulProperties的整個流程

缺點:

由於refresh後 首先載入的配置中心的全部zuul的最新K/V資料,然後根據載入的屬性K/V注入規則到ZuulPropeties( Bean)中,而ZuulPropeties在refresh之前就存在Bean容器中,

所以新增或者修改Zuul路由規則,refresh後會新增或者覆蓋ZuulPropeties中的屬性值,而刪除操作ZuulPropeties中的路由規則依舊存在,所以刪除無效

優點:

使用簡單,基於配置倉庫對路由規則進行版本管理,只需向外暴露refresh端點即可。

二、基於RefreshScope的動態重新整理

擴充套件ZuulPropeties並使用RefreshScope註解,修改配置中心的路由規則後,觸發refresh操作路由規則即會發生變更,

程式碼:

@Bean
 @ConfigurationProperties("zuul")
 @RefreshScope
 @Primary
 public ZuulProperties zuulProperties() {
  return new ZuulProperties();
 }

缺點:

需要自定義擴充套件ZuulPropetties,加入RefreshScope註解

優點:

由於RefreshScope使用cglib產生ZuulPropetties的代理,和一中Bean物件實現方式不同,所以針對路由規則刪除也可以生效

三、基於db儲存的動態重新整理

Zuul閘道器的路由規則載入核心類 DiscoveryClientRouteLocator 和 SimpleRouteLocator,可

以擴充套件SimpleRouteLocator過載其中的locateRoutes()方法,實現自定義從db中載入路由規則,觸發條件仍然是refresh

缺點:

擴充套件複雜,需要定製化開發,並重寫路由規則的載入邏輯。

優點:

可以靈活控制路由規則變更,結合業務場景加入更多自定義功能

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。