伪造客户端:负载均衡器没有客户端可用服务器



我正在研究一个微服务架构,我正在使用Feign客户端对另一个微服务进行rest调用。我使用春启动版本2.1.3.RELEASE和春云:Greenwich.SR3。这是我的虚拟客户端:

代理接口:

import java.util.List;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import relevebancaire.workflow.activiti.model.ReleveBancaire;
@FeignClient(name = "activiti-workflow")
public interface ActivitiWorkflowProxy {

@GetMapping("/relevebancaire/{relevebancaireId}")
public ReleveBancaire getReleveBancaireById(@PathVariable Long relevebancaireId);

}

收费控制器:

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import relevebancaire.workflow.activiti.model.ReleveBancaire;
import relevebancaire.workflow.activiti.proxy.ActivitiWorkflowProxy;
@RestController
public class ActivitiController {
@Autowired
ActivitiWorkflowProxy activitiWorkflowProxy;

@GetMapping("/relevebancaire/{relevebancaireId}")
ResponseEntity<ReleveBancaire> getReleveBancaireById(@PathVariable Long relevebancaireId){
return new ResponseEntity<>(activitiWorkflowProxy.getReleveBancaireById(relevebancaireId), HttpStatus.OK);
}

}

Spring boot application:

@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
@EnableDiscoveryClient
public class ActivitiWorkflowBootloader {
public static void main(String[] args) {
SpringApplication.run(ActivitiWorkflowBootloader.class, args);
}
}

Application.properties:

ribbon.eureka.enabled=true
server.port=8081
spring.application.name=activiti-workflow
activiti-workflow.ribbon.listOfServers = http://localhost:8081

错误:

2022-04-21 05:23:31.626 ERROR 3956 --- [nio-8081-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: activiti-workflow] with root cause
com.netflix.client.ClientException: Load balancer does not have available server for client: activiti-workflow
at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:483) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar:1.3.8]

我已经搜索了所有的stackoverflow和实现了很多解决方案,没有解决这个问题。我甚至在这个问题上使用了所有的解决方案:负载均衡器没有客户端可用的服务器,但什么都没有。请帮忙。

如果您在类路径中有Eureka,默认情况下Feign中的Ribbon客户端使用Eureka服务器列表,而不是来自<feign-client>.ribbon.listOfServers属性的列表。

要改变这一点,你要么必须通过设置ribbon.eureka.enabled=false关闭Ribbon中的Eureka支持,要么使用程序化服务器列表配置,例如

@Bean
public ServerList<Server> ribbonServerList() {
return new ConfigurationBasedServerList(); 
// or new StaticServerList<>(new Server("activiti-workflow", 80));
}

参考:https://github.com/spring-cloud/spring-cloud-netflix/issues/564

相关内容

最新更新