Spring Cloud LoadBalancer缓存刷新后丢失实例问题求助
问题:Spring Cloud Gateway刷新路由后负载均衡缓存失效,无法找到服务实例
我需要将Spring Cloud Gateway的路由存储到数据库,为此通过WebClient向其他微服务发送请求。使用Eureka做服务发现,希望WebClient使用服务发现实例名而非明确URL,因此在Bean方法上使用了*@LoadBalanced*注解:
@Bean public WebClient loadBalancedWebClientBuilder(WebClient.Builder builder) { return builder .exchangeStrategies(exchangeStrategies()) .build(); } @Bean @LoadBalanced WebClient.Builder builder() { return WebClient.builder(); } private ExchangeStrategies exchangeStrategies() { return ExchangeStrategies.builder() .codecs(clientCodecConfigurer -> { clientCodecConfigurer.defaultCodecs().jackson2JsonEncoder(getEncoder()); clientCodecConfigurer.defaultCodecs().jackson2JsonDecoder(getDecoder()); }).build(); }
启动时及默认35秒缓存期内一切正常,WebClient可发现所需的savedToDatabase服务实例并发送请求。
每次执行eventPublisher.publishEvent(new RefreshRoutesEvent(this))刷新路由时,会通过WebClient调用同一下游微服务获取所有已保存路由。初始时该操作正常,但过了默认35秒后,负载均衡器缓存似乎被清空,无法找到下游服务ID,出现如下警告:
WARN o.s.c.l.core.RoundRobinLoadBalancer - No servers available for service: QUERY-SERVICE
我通过如下配置确认是缓存刷新后被清空但未重新获取实例:
spring: application: name: my-gateway cloud: loadbalancer: cache: enabled: true ttl: 240s health-check: refetch-instances: true ribbon: enabled: false gateway: ...
这个问题已经困扰我多日,找不到缓存仅被清空却未更新的原因。添加如下*@LoadBalancerClient*相关配置也无济于事:
@Bean public ServiceInstanceListSupplier instanceSupplier(ConfigurableApplicationContext context) { return ServiceInstanceListSupplier.builder() .withDiscoveryClient() .withHealthChecks() .withCaching() .withRetryAwareness() .build(context); }
显然其他人都能正常使用,我到底遗漏了什么?
内容的提问来源于stack exchange,提问作者Mike at Savient
相关产品推荐
相关产品推荐

