[已解决]SpringCloud负载均衡
在使用Eureka服务注册与发现,通过RestTemplate模板访问远程HTTP服务,并给我们的客户端增加负载均衡的配置时,报错
No servers available for service: localhost 没有可用于服务的服务器:localhost No servers available for service: SPRINGCLOUD-PROVIDER-DEPT 没有可用于服务的服务器:SPRINGCLOUD-PROVIDER-DEPT
第一个是没有修改java代码里的从消费者访问提供者的URL
第二个在修改完第一个的基础上,导入包的冲突
ERROR 1848 --- [p-nio-80-exec-1] 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.IllegalStateException: No instances available for localhost] with root cause
- 首先保证工程中所有的
-
@Autowired、@RestController、@ResponseBody注解没有问题
- 第二看消费者的Controller层 代码的 访问提供者的本地服务器名(一定要看,很重要)
// 前缀http://localhost:8001是我们提供者的访问地址 private static final String REST_URL_PREFIX = "http://localhost:8001"; @RequestMapping("/consumer/dept/list") public List<Department> getAll(){ return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class); } @RequestMapping("/consumer/dept/add") public int add(Department department){ return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",department,int.class); }
- 再看看我们在Eureka服务注册中心注册的提供者模块
在给我们的消费者配置负载均衡时的注解@LoadBalanced,如果用的是
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>3.0.4</version> </dependency>
这个依赖 就不需要导入下面这个依赖了,因为上面这个本身就带有配置负载均衡的包,会起冲突
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.2.6.RELEASE</version> </dependency>
这是给消费者配置的负载均衡代码
@Configuration public class ConfigBean { // @Configuration --> 相当于 spring 的 applicationContext.xml @Bean @LoadBalanced // Robbin public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
问题就出自于我们消费者去访问提供者的接口出现了不存在的问题,就是下面这串代码
// Ribbon,我们这里的地址,应该是一个变量,通过服务名来访问 private static final String REST_URL_PREFIX = "http://localhost:8001";
仔细看图
问题解决,可以在消费者模块中去访问提供者啦!
上一篇:
IDEA上Java项目控制台中文乱码