需要找不到的 'org.springframework.cloud.netflix.ribbon.SpringClientFactory' 类型的 Bean



我有这个测试项目,我想把它迁移到最新的版本:

@Configuration
public class LoadbalancerConfig extends RibbonLoadBalancerClient  {
public LoadbalancerConfig(SpringClientFactory clientFactory) {
super(clientFactory);
}
}

完整代码示例:https://github.com/rcbandit111/Generic_SO_POC/blob/master/src/main/java/org/merchant/database/service/sql/LoadbalancerConfig.java

你知道我怎样才能把这段代码迁移到最新的负载平衡器版本吗?

我认为检查RibbonAutoConfiguration类可以很好地提示您应该如何配置东西。首先从LoadbalancerConfig中删除@Configuration,我也将LoadbalancerConfig重命名为CustomLoadbalancer,以防止混淆。

public class CustomLoadbalancer  extends RibbonLoadBalancerClient {
public CustomLoadbalancer(SpringClientFactory clientFactory) {
super(clientFactory);
}
}

将下列依赖项添加到gradle中com.netflix.ribbon:ribbon:2.7.18

然后添加一个配置类,如:

@Configuration
@ConditionalOnClass({Ribbon.class})
@AutoConfigureAfter(name = "org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration")
@ConditionalOnProperty(value = "spring.cloud.loadbalancer.ribbon.enabled",
havingValue = "true", matchIfMissing = true)
@AutoConfigureBefore(LoadBalancerAutoConfiguration.class)
public class LoadBalancerClientConfig {
@Autowired(required = false)
private List<RibbonClientSpecification> configurations = new ArrayList<>();
@Bean
public CustomLoadbalancer customLoadbalancer() {
return new CustomLoadbalancer(springClientFactory());
}
@Bean
public SpringClientFactory springClientFactory() {
SpringClientFactory factory = new SpringClientFactory();
factory.setConfigurations(this.configurations);
return factory;
}
}

如果您想使用Spring云负载平衡器而不是上述配置,请将spring-cloud-starter-loadbalancer依赖项添加到gradle.build中,对于配置,您只需要此bean:

@LoadBalanced
@Bean
RestTemplate getRestTemplate() {
return new RestTemplate();
}

这个RestTemplate的工作原理与标准RestTemplate类完全相同,除了不使用服务的物理位置,您需要使用Eureka服务ID构建URL。

下面是一个如何在代码中使用它的例子

@Component
public class LoadBalancedTemplateClient {

@Autowired
RestTemplate restTemplate;
@Autowired
User user;
public ResponseEntity<Result> getResult() {
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder
.fromHttpUrl("http://application-id/v1/") // application id registered in eureka
.queryParam("id", user.getUserId());
return restTemplate.getForEntity(uriComponentsBuilder.toUriString(),
Result.class);
}
}

如果你想使用响应式客户端,过程是一样的,首先定义bean:

@LoadBalanced
@Bean
WebClient.Builder webClientBuilder() {
return WebClient.builder();
}

,然后在需要的时候注射和使用:

@Autowired
private WebClient.Builder webClient;
public Mono<String> doSomething() {
return webClient
.build()
.get()
.uri("http://application-id/v1/")
.retrieve()
.bodyToMono(String.class);
}

您还可以查看文档以获取更多信息:

最新更新