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操作路由規則即會發生變更

代碼:
1   @Bean
2   @ConfigurationProperties("zuul")
3   @RefreshScope
4   @Primary
5   public ZuulProperties zuulProperties() {
6     return new ZuulProperties();
7   }

 

缺點:

  需要自定義擴展ZuulPropetties,加入RefreshScope注解

優點:

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

 

三、基於db存儲的動態刷新

  Zuul網關的路由規則加載核心類 DiscoveryClientRouteLocator 和 SimpleRouteLocator,可

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

代碼:

  略(自行搜索)

缺點:

  擴展復雜,需要定制化開發,並重寫路由規則的加載邏輯。

優點:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM