在nacos负载均衡时报出的异常
Controller代码
package com.itheima.web;
import com.itheima.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("{id}")
public User consumerUserById(@PathVariable("id") Long id){
String url = "http://127.0.0.1:8081/user/"+id;
return restTemplate.getForObject(url,User.class);
}
}
引导类:
package com.itheima;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
上面代码,在启动类中开启负载均衡@LoadBalanced后没有修改Controller类中url的路径,导致程序在运行时找不到127.0.0.1的这个实例,报出如下错误:
将url中的路径修改后访问正常
总结:
在restTemplate开启负载均衡后,restTemplate在执行的时候底层会自动根据url中服务提供者的名称获取服务提供者的地址,如果在url中不将127.0.0.1修改为user-service,restTemplate会跟据127.0.0.1去获取服务提供则的地址,而在restTemplate底层负载均衡中,只存储了user-service这个键,显然是获取不到该实例的。因此将127.0.0.1修改为user-service后,异常就消失了。