[已解决]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

  1. 首先保证工程中所有的
    @Autowired、@RestController、@ResponseBody注解没有问题
  1. 第二看消费者的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);
    }
  1. 再看看我们在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";

仔细看图

问题解决,可以在消费者模块中去访问提供者啦!

经验分享 程序员 微信小程序 职场和发展