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

代码:

  略(自行搜索)

缺点:

  扩展复杂,需要定制化开发,并重写路由规则的加载逻辑。

优点:

  可以灵活控制路由规则变更,结合业务场景加入更多自定义功能

posted @ 2019-11-14 17:30  浮生若云  阅读(1531)  评论(0编辑  收藏  举报