背景

 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

代码:

  略(自行搜索)

缺点:

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

优点:

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

Spring Cloud Zuul路由规则动态更新的更多相关文章

  1. 【spring cloud】spring cloud zuul 路由网关

    GitHub源码地址:https://github.com/AngelSXD/springcloud 版本介绍: <properties> <project.build.source ...

  2. spring cloud Zuul + 路由熔断【服务降级】 --- 心得

    1.前言 刚入门 时,使用 ribbon + hystrix + restTemplate  ,实现了简单的 接口访问 + 客户端负载均衡 + 服务熔断保护 : 然后学习了 feign ,整合了  r ...

  3. Spring Cloud 之 Config与动态路由.

    一.简介  Spring Cloud Confg 是用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端也称为分布式配置中心,它是一个独立的微服务 ...

  4. Spring Cloud gateway 网关四 动态路由

    微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...

  5. Spring Cloud Zuul API服务网关之请求路由

    目录 一.Zuul 介绍 二.构建Spring Cloud Zuul网关 构建网关 请求路由 请求过滤 三.路由详解 一.Zuul 介绍 ​ 通过前几篇文章的介绍,我们了解了Spring Cloud ...

  6. spring cloud: zuul: 微网关-简单使用与路由配置

    spring cloud: zuul: 微网关-简单使用与路由配置 首先引入依赖 <dependency> <groupId>org.springframework.cloud ...

  7. Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务

    API 网关的出现的原因是微服务架构的出现,不同的微服务一般会有不同的服务地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会 ...

  8. Greenwich.SR2版本的Spring Cloud Zuul实例

    网关作为对外服务,在微服务架构中是一个很重要的组件,主要体现在动态路由和接入鉴权这两个功能上.现在我们通过Spring Cloud Zuul来实现对之前a-feign-client(参见Greenwi ...

  9. 笔记:Spring Cloud Zuul 快速入门

    Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了 ...

随机推荐

  1. Mysql 创建只读账户

    mysql 创建只读账户: 1.查询所有账号信息 SELECT DISTINCT a.`User`,a.`Host`,a.password_expired,a.password_last_change ...

  2. Pyton项目打包成exe文件

    Python项目打包成exe文件 1 系统环境 windows版本: Win7 64位 python环境:Anaconda python版本:3.6 64位 pyinstaller版本:3.5 1 安 ...

  3. nRF51822 的两路 PWM 极性

    忙了一阵这个PWM,玩着玩着终于发现了些规律.Nordic 也挺会坑爹的. nRF51822 是没有硬件 PWM 的,只能靠一系列难以理解的 PPI /GPIOTE/TIMER来实现,其实我想说,我醉 ...

  4. OpenFOAM——绕流振动

    流体的物性参数为: 密度:1kg/m3 粘度系数:0.01N·s/m2           首先进行建模操作,任何建模软件均可,本算例在ICEM建模和进行网格划分,生成的网格如下: 接下来转入Open ...

  5. python的tecplot模块(tecplot新特性)

    Python的tecplot模块仅支持tecplot2017以上 首先安装tecplot2017 安装完成以后,安装python的tecplot模块 可以通过终端转入tecplot安装目录下的pyte ...

  6. Pycharm使用git版本控制

    一.使用Pycharm进行版本控制 01 从远程仓库克隆项目 从远程仓库将一个已存在的项目克隆到本地 打开pycharm, VCS --> Checkout from Version Contr ...

  7. 为什么Map桶中个数超过8才转为红黑树

    这是笔者一个好友面试阿里时,被问及的一个问题,应该不少人看到这个问题都会一面懵逼.因为,大部分的文章都是分析链表是怎么转换成红黑树的,但是并没有说明为什么当链表长度为8的时候才做转换动作.笔者第一反应 ...

  8. 20189220 余超《Linux内核原理与分析》第七周作业

    分析Linux内核创建一个新进程的过程 基础知识概括 操作系统内核实现操作系统的三大管理功能,即进程管理功能,内存管理和文件系统.对应的三个抽象的概念是进程,虚拟内存和文件.其中,操作系统最核心的功能 ...

  9. Java_jdbc 基础笔记之六 数据库连接 (PreparedStatement)

    reparedStatement 是 Statement 的子接口 * ①需要预编译 SQL 语句:PreparedStatement ps = conn.preparedStatement(sql) ...

  10. 【转】Python访问oracle数据库,DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified module could not be found"

    使用python连接Oracle,出现如下错误: DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified ...