zoukankan      html  css  js  c++  java
  • 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

    代码:

      略(自行搜索)

    缺点:

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

    优点:

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

  • 相关阅读:
    OOAD-2 UML建模、类、接口、类图的详细介绍
    OOAD-1 GOF中的23种设计模式的分类和功能
    java核心技术第四章疑问点
    数据结构中的遇到的一些小知识整理
    springboot中一次坑爹的打包体验
    mybatis中@param的使用与否
    mybatis 防止sql注入
    java窗口
    java异常处理
    第三次上级作业
  • 原文地址:https://www.cnblogs.com/mxmbk/p/11858846.html
Copyright © 2011-2022 走看看