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
- 如果是 RefreshRoutesEvent 事件, 调用
Routes 更新过程
- CachingRouteLocator.fetch() 总入口 ,使用装饰器模式,代理
CompositeRouteLocator
,而CompositeRouteLocator
中 代理最终使用RouteDefinitionRouteLocator
的getRoutes()
方法 - 在 RouteDefinitionRouteLocator 中, 调用 RouteDefinitionLocator 的
getRouteDefinitions()
实现 route 刷新 - RouteDefinitionLocator 也使用了装饰器 和组合模式:
- InMemoryRouteDefinitionRepository, 基于内存, 默认方式
- PropertiesRouteDefinitionLocator, 基于 properties 文件,如果使用了 properties 文件
- RedisRouteDefinitionRepository 【新增】
CacheRefreshThread
在 DiscoveryClient
中
交给子类 CloudEurekaClient
实现, 发布 HeartBeatEvent: