在反应性微服务中,我注册到Eureka,并使用@LoadBalanced WebClient从实例获得响应。仅在尤里卡注册就可以了,但是一旦我添加了@LoadBalanced WebClient,就会得到以下错误。
2021-05-22 14:31:14.835 INFO 1852 --- [ main] com.netflix.discovery.DiscoveryClient : Getting all instance registry info from the eureka server
2021-05-22 14:31:14.985 ERROR 1852 --- [ main] scoveryClientServiceInstanceListSupplier : Exception occurred while retrieving instances for service 127.0.0.1
org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'scopedTarget.eurekaClient': Requested bean is currently in creation: Is there an unresolvable circular reference?
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:274) ~[spring-beans-5.3.6.jar:5.3.6]我假设它与配置eureka.client.webclient.enabled=true相关。
应用
这是我的应用程序及其配置的关键部分。
application.yml
eureka:
client:
serviceUrl:
defaultZone: ${vcap.services.eureka-service.credentials.uri:http://127.0.0.1:8761}/eureka/
webclient:
enabled: trueConsumerApplication.java
@SpringBootApplication
public class ConsumerApplication {
public Mono<ServerResponse> handler(ServerRequest request) {
return webClientBuilder()
.baseUrl("http://producer")
.build()
.get()
.retrieve()
.bodyToMono(String.class)
.onErrorResume(e -> Mono.just("Error " + e.getMessage()))
.flatMap(r -> ok().bodyValue(Map.of("Producer says", r)));
}
@Bean
@LoadBalanced
public WebClient.Builder webClientBuilder(){
return WebClient.builder();
}
@Bean
RouterFunction<ServerResponse> routes() {
return route()
.GET("", this::handler)
.build();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}尤里卡WebClient禁用
如果使用eureka.client.webclient.enabled=false,一切都会很好。然而,我认为这不应该是解决办法。
DiscoveryClientOptionalArgsConfiguration : Eureka HTTP Client uses RestTemplate.如何将@LoadBalanced WebClient与eureka.client.webclient.enabled=true一起使用?
发布于 2022-01-31 01:17:35
同样的问题,我就是这样解决的。
@Bean
@LoadBalanced
public WebClient.Builder lbWebClient() {
return WebClient.builder();
}
@Bean
@Primary
public WebClient.Builder webClient() {
return WebClient.builder();
}稍后使用@限定符使用负载平衡限定符。
https://stackoverflow.com/questions/67649680
复制相似问题