spring cloud gateway 自动刷新路由

问题

  • 什么时候刷新?

刷新流程

刷新路由流程:

  • 初始化 DiscoveryClient
    • 调用 initScheduledTasks() 方法,初始化两个线程 CacheRefreshThread 和 HeartbeatThread , 默认每 30 秒调用
    • CacheRefreshThread 会发布 HeartbeatEvent
    • HeartbeatThread 更新 lastSuccessfulHeartbeatTimestamp 时间戳
  • CacheRefreshThread
    • 调用 refreshRegistry() 方法
      • 调用 fetchRegistry() 方法
        • 调用 onCacheRefreshed() 方法, 在子类 CloudEurekaClient 重载后 发布 HeartbeatEvent 事件
  • RouteRefreshListener : 监听HeartbeatEvent ,并且发布 RefreshRoutesEvent 事件
  • RefreshRoutesEvent 促发本地拉取最新的路由信息
  • CachingRouteLocator : 自动装配默认的 路由更新器, CachingRouteLocator 监听 RefreshRoutesEvent 事件
    • 如果是 RefreshRoutesEvent 事件, 调用 fetch() 方法更新 routes

Routes 更新过程

  • CachingRouteLocator.fetch() 总入口 ,使用装饰器模式,代理 CompositeRouteLocator,而 CompositeRouteLocator 中 代理最终使用 RouteDefinitionRouteLocatorgetRoutes() 方法
  • 在 RouteDefinitionRouteLocator 中, 调用 RouteDefinitionLocator 的 getRouteDefinitions() 实现 route 刷新
  • RouteDefinitionLocator 也使用了装饰器 和组合模式:
    • InMemoryRouteDefinitionRepository, 基于内存, 默认方式
    • PropertiesRouteDefinitionLocator, 基于 properties 文件,如果使用了 properties 文件
    • RedisRouteDefinitionRepository 【新增】

CacheRefreshThread

DiscoveryClient
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
交给子类 CloudEurekaClient 实现, 发布 HeartBeatEvent:

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐