需要找不到类型 '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);
}
}
您知道如何将此代码迁移到最新的负载均衡器版本吗?
我认为检查 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
我有这个测试项目,我想迁移到更新的版本:
@Configuration
public class LoadbalancerConfig extends RibbonLoadBalancerClient {
public LoadbalancerConfig(SpringClientFactory clientFactory) {
super(clientFactory);
}
}
您知道如何将此代码迁移到最新的负载均衡器版本吗?
我认为检查 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