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

Spring Boot3迁移后WebClient结合Consul服务发现失效问题求助

Spring Boot 3迁移+移除Ribbon后Consul服务发现问题

问题背景

我们正在将Spring Boot从2.x版本迁移至3.x版本,同时移除Netflix Ribbon。使用Consul进行服务发现时出现异常,回退到Spring Boot 2 + Netflix Ribbon组合时功能正常,已排除网络连通性问题。

错误日志

RoundRobinLoadBalancer|No servers available for service: cachedavailability-integrations-service
ReactorLoadBalancerExchangeFilterFunction|LoadBalancer does not contain an instance for the service cachedavailability-integrations-service
Communication error with uri: http://cachedavailability-integrations-service/testing org.springframework.web.reactive.function.client.WebClientResponseException$ServiceUnavailable: 503 Service Unavailable from UNKNOWN 
    at org.springframework.web.reactive.function.client.WebClientResponseException.create(WebClientResponseException.java:336)
    Suppressed: The stacktrace has been enhanced by Reactor, refer to additional information below: 
Error has been observed at the following site(s):
    *__checkpoint ⇢ 503 SERVICE_UNAVAILABLE from GET http://cachedavailability-integrations-service/testing [DefaultWebClient]

Consul界面状态

  • 服务si-manager尝试发现并访问cachedavailability服务
  • 目标服务在Consul中注册状态正常,但通过WebClient Bean无法发现已注册的服务实例

已尝试方案

  • Spring Cloud Consul官方文档中DiscoveryClient的使用方法
  • Spring WebFlux WebClient服务发现相关配置方案
  • 无自动配置场景下Spring Cloud LoadBalancer的配置方法

相关配置代码

主类

@org.springframework.cloud.client.discovery.EnableDiscoveryClient
public class MainApplication {...}

WebClient配置

@Bean(name = "webClientConsulAvailability")
public WebClient webClientConsulAvailability(
  WebClient.Builder webClientBuilder,
  ReactorLoadBalancerExchangeFilterFunction lbFunction,
  ExchangeFilterFunction logFilter
) {
  return webClientBuilder
    .filter(lbFunction)
    .filter(logFilter)
    .build();
}

bootstrap.yml

spring:
  application:
    name: si-manager-service
  profiles:
    active: ${SPRING_PROFILES_ACTIVE:local}
  cloud:
    consul:
      host: localhost
      port: 8500
      enabled: true
      discovery:
        serviceName: ${spring.application.name}
        instanceId: ${spring.application.name}8500
        enabled: true
        # Register as a service in consul.
        register: true
        registerHealthCheck: true

依赖

Maven依赖截图

Consul版本

v1.15.3

服务调用示例

webClientConsulAvailability.get()
      .uri("http://cachedavailability-integrations-service/testing")
      .retrieve()
      .bodyToFlux(MyDTO.class)
      .doOnError(e -> {
        if (isErrorLogLevel(e)) {
          log.error(COMMUNICATION_ERROR_WITH_URI + uri, e);
        } else {
          log.warn(COMMUNICATION_ERROR_WITH_URI + uri, e);
        }
      })
      .onErrorResume(e -> Flux.empty());

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:52:18