第一种,直接new一个RestTemplate
实例将url
写死
@RestController
@Slf4j
public class ClientController {
@GetMapping("/getProductMsg")
public String getProductMsg() {
// 第一种,直接使用restTemplate url写死
RestTemplate restTemplate = new RestTemplate();
String resp = restTemplate.getForObject("http://localhost:8080/msg", String.class);
log.info("resp={}", resp);
return resp;
}
}
第二种,利用Spring Cloud
提供的LoadBalancerClient
来获取应用的host
和port
值
@RestController
@Slf4j
public class ClientController {
// spring cloud 提供的
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/getProductMsg")
public String getProductMsg() {
RestTemplate restTemplate = new RestTemplate();
// 第二种 利用loadBalancerClient 通过应用名获取url,然后再使用restTemplate
ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");
String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort()) + "/msg";
String resp = restTemplate.getForObject(url, String.class);
log.info("resp={}", resp);
return resp;
}
}
第三种,使用了Ribbon
,利用@LoadBalanced
注解可在RestTemplate中使用应用的名字
先注册一个RestTemplate
的bean
@Component
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
再注入使用
@RestController
@Slf4j
public class ClientController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/getProductMsg")
public String getProductMsg() {
// 第三种 利用@LoadBalanced 可在restTemplate中使用应用的名字
String resp = restTemplate.getForObject("http://PRODUCT/msg", String.class);
log.info("resp={}", resp);
return resp;
}
}