RestTemplate结合@LoadBalanced的使用方式

什么是RestTemplate

传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。

准备

服务端我是用的是一个普通的API

@RestController

public class ServerController {



 @GetMapping("/msg")

 public String msg(){

  return "this is product' msg";

 }



}

第一种方式

直接使用restTemplate,url写死

@Slf4j

@RestController

public class ClientController {



 @GetMapping("/getProductMsg")

 public String getProductMsg(){

  // 1、第一种方式(直接使用restTemplate,url写死)

  RestTemplate restTemplate = new RestTemplate();

  String response = restTemplate.getForObject("http://localhost:9082/msg",String.class);

  log.info("response={}",response);

  return response;

 }



}

第二种方式

第二种方式(利用loadBalancerClient通过应用名获取url,然后再使用restTemplate)

@Slf4j

@RestController

public class ClientController {



 @Autowired

 private LoadBalancerClient loadBalancerClient;



 @GetMapping("/getProductMsg")

 public String getProductMsg(){



  //2、第二种方式(利用loadBalancerClient通过应用名获取url,然后再使用restTemplate)

  ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");

  String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort()) + "/msg";

  RestTemplate restTemplate = new RestTemplate();

  String response = restTemplate.getForObject(url,String.class);



  log.info("response={}",response);

  return response;

 }



}

第三种方式

第三种方式(利用@LoadBalanced,可再restTemplate里使用应用名字)

使用第二种方式和第三种方式均是内部使用了Ribbon实现了客户端的负载均衡

@Component

public class RestTemplateConfig {



 @Bean

 @LoadBalanced

 public RestTemplate restTemplate(){

  return new RestTemplate();

 }



}

@Slf4j

@RestController

public class ClientController {



 @Autowired

 private RestTemplate restTemplate;



 @GetMapping("/getProductMsg")

 public String getProductMsg(){



  //3、第三种方式(利用@LoadBalanced,可再restTemplate里使用应用名字)

  String response = restTemplate.getForObject("http://PRODUCT/msg",String.class);



  log.info("response={}",response);

  return response;

 }



}

你可能感兴趣的:(Spring,Cloud)