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

required a bean of type 'org.springframework.cloud.netflix.ribbon.SpringClientFactory' that could not be found

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

@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 class 可以很好地提示您应该如何配置。 先把LoadbalancerConfig去掉@Configuration,我也把LoadbalancerConfig重命名为CustomLoadbalancer,防止混淆。

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

将以下依赖项添加到您的 gradle com.netflix.ribbon:ribbon:2.7.18

然后添加一个配置class像:

@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 class 完全相同,只是您需要使用 Eureka 服务构建 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);
  }

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