RestTemplate在Spring Cloud中的三种用法

第一种,直接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来获取应用的hostport

@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中使用应用的名字

先注册一个RestTemplatebean

@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;
    }
}

你可能感兴趣的:(RestTemplate在Spring Cloud中的三种用法)