热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

SpringCloudZuul路由规则动态更新解析

这篇文章主要介绍了SpringCloudZuul路由规则动态更新解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了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

缺点:

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

优点:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
author-avatar
全拼wangziyiva_632
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有