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
依赖
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
相关产品推荐
相关产品推荐

