@RestController
@Slf4j
public class ClientController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplateConfig;
@RequestMapping("/getProductMsg")
public String getProductMsg(){
//1.第一种方式 直接使用restTemplate,地址写死
RestTemplate restTemplate = new RestTemplate();
String response= restTemplate.getForObject("http://localhost:8098/msg",String.class);
//第二种方式,通过loadBalancerClient获取到地址和端口
ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");//通过注册中心的服务名获取到属性
String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort()) + "/msg";
response= restTemplate.getForObject(url,String.class);
//第三种 利用@LoadBalanced可在restTemplate里使用注册中心的应用名字
response = restTemplateConfig.getForObject("http://PRODUCT/msg",String.class);
return response;
}
}
RestTemplateConfig.java
@Component
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
总结来说,第一种使用直接路径写死了,没有考虑到负载均衡,第二种情况相对来说比第一种好,第三种情况,我觉得最佳