Zuul过滤器中WebClient调用Eureka服务报UnknownHostException问题问询
问题解决办法:WebClient调用Eureka服务报UnknownHostException异常
异常根本原因
你代码中存在2个核心问题导致WebClient无法识别Eureka的服务ID:
- 你已经通过
@Autowired注入了Spring自动配置的WebClient实例,但方法内又手动调用WebClient.create()创建了新的实例,这个手动创建的实例没有集成Eureka服务发现、负载均衡的能力,无法将服务ID解析为实际的服务地址 - 缺失负载均衡依赖或WebClient没有添加
@LoadBalanced注解,没有开启服务ID自动解析能力
解决步骤
- 删掉方法内手动创建WebClient的代码,直接使用注入的实例
- 检查项目依赖,确认已引入以下必要依赖(Maven示例):
<!-- Eureka客户端依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 负载均衡依赖(Spring Cloud 2020及以上版本必须引入,替代已废弃的Ribbon) --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
- (可选)如果注入WebClient依然不生效,手动添加配置类给WebClient开启负载均衡能力:
import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; @Configuration public class WebClientConfig { @Bean @LoadBalanced public WebClient.Builder loadBalancedWebClientBuilder() { return WebClient.builder(); } }
如果用上述配置,你可以注入Builder来创建WebClient:
@Autowired private WebClient.Builder webClientBuilder; // 使用时创建实例 WebClient webClient = webClientBuilder.build();
- 确认目标服务
SITE-THROTTLING的/throttle接口支持PUT请求,与你代码中调用的put()方法匹配。
修正后的代码示例
@Autowired WebClient webClient; private static final String authenticationServiceId = "http://SITE-THROTTLING"; @Override public boolean sendPost(String url) { log.info("THROTTLE URL "+url); // 删除手动创建WebClient的代码行 Boolean flag = webClient.put() .uri(authenticationServiceId+ "/throttle") .bodyValue(url) .retrieve() .bodyToMono(Boolean.class) .block(); return flag; }
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

