【springcloud】RestTemplate的三种使用方式

前期准备

  1. 一个eureka server 项目,用于注册服务
  2. 两个eureka client 项目,client1,client2,模拟服务间通信
  3. 在client1中创建如下的controller
    package cn.aaralyn.sellproduct.controller;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Auther: aaralyn
     * @Date: 2018/7/27 09:58
     * @Description:
     */
    @RestController
    public class ServiceController {
    
        @GetMapping("msg")
        public String msg(){
            return "this is a message";
        }
    }

    接下来在client2中使用RestTemplate获取数据

  4. 在另一个client中创建如下controller,用于测试

    package cn.aaralyn.sellorder.controller;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @Auther: aaralyn
     * @Date: 2018/7/27 10:03
     * @Description:
     */
    @RestController
    public class ClientController {
        @GetMapping("getMsg")
        public String getMsg(){
            return "";
        }
    }

方式一

    @GetMapping("getMsg")
    public String getMsg(){
        RestTemplate template = new RestTemplate();
        return template.getForObject("http://localhost:8080/msg",String.class);
    }

缺点:

  1.  url硬编码,如果ip有变动,需要在代码中更改
  2. 如果lient2为集群,有多个url,该方法只能配一个url

方式二

  注入LoadBalancerClient ,获得应用名称为PRODUCT的应用的其中一个实例,获得url,再使用RestTemplate获取数据,实现负载均衡

@RestController
public class ClientController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("getMsg")
    public String getMsg() {
       
        RestTemplate template = new RestTemplate();
        ServiceInstance instance = loadBalancerClient.choose("PRODUCT");
        String url = String.format("http://%s:%s", instance.getHost(), instance.getPort() + "/msg");
        return template.getForObject(url, String.class);
    }
}

方式三

RestTemplate通过配置注入Spring容器来使用

  1. 创建配置类,@LoadBalanced:实现负载均衡
    package cn.aaralyn.sellorder.config;
    
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @Auther: aaralyn
     * @Date: 2018/7/27 10:43
     * @Description:
     */
    @Configuration
    public class RestTemplateConfig {
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
  2. controller中注入restTemplate,直接调用getForObject方法,注意url中直接写应用名称,不要写ip:port

    package cn.aaralyn.sellorder.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @Auther: aaralyn
     * @Date: 2018/7/27 10:03
     * @Description:
     */
    @RestController
    public class ClientController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("getMsg")
        public String getMsg() {
            return restTemplate.getForObject("http://PRODUCT/msg", String.class);
        }
    }
    

猜你喜欢

转载自blog.csdn.net/weixin_39860498/article/details/81232655