You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:05:37