栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

nacos和gateway服务路由缓存刷新

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

nacos和gateway服务路由缓存刷新

        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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/281935.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号