nacos和gateway服务路由缓存刷新

8 篇文章 0 订阅
5 篇文章 0 订阅

        gateway的服务注册路由默认是第一次启动的时候就加载,有个监听器RouteRefreshListener类,里面定义了一些事件,比如ContextRefreshEvent,HeartbeatEvent等事件,然后都会调用ApplicationEventPubilsher.publishEvent(new RereshRoutesEvent(this));这里应该就是程序启动时进行的路由刷新操作了。

        然后gateway有一个刷新的endpoint,/actuator/gateway/refresh,可以找到这个控制器,里面也调用的ApplicationEventPubilsher.publishEvent(new RereshRoutesEvent(this));方法,这是spring的事件驱动,可以看出gateway都是通过这个事件来触发服务路由设置的。

        顺着找到了监听事件的实现类,CachingRouteLocator,这同时也是gateway的缓存路由处理类,这是个包装类(路由配置来源有yaml配置,服务注册中心的配置,这里就包含了PropertiesRouteDefinitionLocator,DiscoveryClientRouteDefinitionLocator类),咱们是使用nacos根据服务发现自动配置的,所以咱们关注DiscoveryClientRouteDefinitionLocator这个类。

        可以看到里面的getRouteDefinitions()方法,主要就是serviceInstances字段转换成routeDefinition的,而这个serviceInstances是通过DiscoveryClient.getServices()得来的,(这个DiscoveryClient和NacosReactiveDiscoveryClient可以去看我的关于spring和nacos服务注册相关的文章)。

        这就是gateway加载nacos注册服务路由的流程。

        这里就有个问题了,当nacos新注册一个服务的时候,gateway不知道,其实nacos有定义一个NacosWatch的bean,这个bean的会使用NamingService.subscribe(serviceName, groupName,clusterName,eventListener)向nacos注册一个监听器,NamingEvent(包含实例列表等信息)事件,然后向spring发送一个HeartbeatEvent事件,第一段说了这个事件,触发这个事件是可以刷新路由配置的,然而实际上并不是如此。

        因为我们向nacos注册监听器的时候,有个参数是serviceName,这里默认取的就是当前服务名spring.application.name,只有当这个服务的实例发生变化时才通知,如果是一个新的服务,则不通知(这里我自己写了一个监听器,并监听了一个其他服务的名称,那个服务启动时,这边是会触发的)。

        我用的nacos版本是2.x的,看了网上的一些文章,好像0.9版本的可以获取到所有服务的变更事件,难道nacos只能启动的时候获取服务列表,后面都不进行动态更新了?目前我还在找这个方法....

------------

​​​​​​https://github.com/theonefx/spring-cloud-alibaba/commit/e1aa809b6d950d5b4e4c71f4f28459a3bf7a5494?branch=e1aa809b6d950d5b4e4c71f4f28459a3bf7a5494&diff=split

好像是个bug...版本2.2.2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值