相信也有很多人在线上环境遇到过,或许也因此被批过:一个集群中有某个服务突然下线,但是网关还是会去请求这个实例,所以线上就报错了,报错信息如下图:

究其原因到底为何呢?有没有一种靠谱的解决方案呢?别着急,往下看
产生原因
Gateway中有个缓存 CachingRouteLocator ,而网关服务使用的是lb模式,服务在上线或者下线之后,未能及时刷新这个缓存,相应的源码如下:
public class CachingRouteLocator implements Ordered, RouteLocator,
ApplicationListener<RefreshRoutesEvent>, ApplicationEventPublisherAware {
private static final Log log = LogFactory.getLog(CachingRouteLocator.class);
private static final String CACHE_KEY = "routes";
private final RouteLocator delegate;
private final Flux<Route> routes;
private final Map<String, List> cache = new ConcurrentHashMap<>();

文章讨论了SpringCloudGateway在服务下线时由于缓存未及时更新导致的线上错误问题。原因是Gateway中的CachingRouteLocator缓存未在服务实例变化时刷新。解决方案是监听Nacos实例刷新事件,当服务上下线时立即清除缓存,确保使用最新服务列表。
最低0.47元/天 解锁文章
4756





